当前位置: 首页 > news >正文

66 基于单片机的太阳能充电、温度检测、档位PWM调速系统

所有仿真详情导航:

PROTEUS专栏说明-CSDN博客

目录

一、主要功能

二、硬件资源

三、主程序编程

四、资源下载


一、主要功能

        基于52单片机,采用DS18B20温度传感器检测温度,采用滑动变阻器连接ADC0832数模转换器模拟电量,采用L298N驱动电机转动。
五个按键,第一按键为系统总开关,按下后系统运行。
然后有模式切换按键,自动模式是依靠温度调速,手动模式是按键调速。
三个按键分别为一档、二档、三档。
根据温度范围来划分风俗档位,比如分3档。温度10-20为一档,20-25为二档,25-35为三档,档位越高转速越快。
显示屏显示实时温度,当前档位,和当前电量。
如果电量小于20,则蜂鸣器报警。

具体动态效果看B站演示视频(高清需要跳转到B站看)

基于单片机的太阳能充电、温度检测、档位PWM调速系统_哔哩哔哩_bilibili

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

三、主程序编程

#include <REGX52.H>
#include<intrins.h>
#include<stdio.h>
#include "Delay.h"
#include "LCD1602.h"
#define uchar unsigned char
#define uint unsigned  intsbit DS=P2^4;                 //DS18B20温度传感器sbit CS=P1^0;                 //adc0832引脚
sbit CLK=P1^1;
sbit DIO=P1^2;sbit key1=P1^3;
sbit key2=P1^4;
sbit key3=P1^5;
sbit key4=P1^6;
sbit key5=P1^7;sbit out1 = P3^6;
sbit out2 = P3^7;
sbit beep = P3^0;
sbit cd= P2^5;unsigned char count;
typedef unsigned char u8;
typedef unsigned int  u16;
static uint temp;
static float ftemp = 0.0f;//温度转变
uint temp;static unsigned char num;
static int dlyz=20;  
static int flag=1;
uchar  count=0;
static double u,u1;
static flag2=0;
static a=0,b=0,c=0,numsum=0;
static mode=0;
int kg=1;void tmpchange();
uint tmp();
void beep_warning();
void ajpd();void Car_Move(uchar speed)	 //电机转动
{uchar Car_Speed = speed;count++;	if(count <= Car_Speed){out1 = 1;}else{out1 = 0;}if(count >= 100){count = 0;}	
}void Time0_Init()          //定时器初始化
{
TMOD = 0x01;           //定时器0工作在方式1    
IE   = 0x82;
TH0  = 0xfe;
TL0  = 0x33;     //11.0592MZ晶振,0.5ms
TR0=1;                 //定时器开始
EA=1;
}void Time0_Int() interrupt 1 //中断程序
{TH0  = 0xfe;             //重新赋值TL0  = 0x33;num++;if(num==200){tmpchange();        //让18b20开始转换温度temp = tmp();       //读取温度ftemp = temp/10.0f; //转换温度num=0;}switch(numsum){case 0:out1 = 0;out2=0;break;case 1:Car_Move(30);break;	 	 //电机低速前进case 2:Car_Move(60);break;	 	 //电机高速前进case 3:Car_Move(100);break;	 	 //电机高速前进default:break;}
}uchar get_AD_Res()            //ADC0832启动读取函数 有害气体
{uchar i, data1=0, data2=0;CS=0;CLK=0;DIO=1;_nop_();CLK=1;_nop_();CLK=0;DIO=1;_nop_(); CLK=1;_nop_();CLK=0;DIO=0;_nop_();CLK=1;_nop_();CLK=0;DIO=1;_nop_(); for(i=0; i<8; i++){CLK=1;_nop_();CLK=0;_nop_();data1=(data1<<1)|(uchar)DIO; }for(i=0; i<8; i++){data2=data2|(uchar)DIO<<i;CLK=1;_nop_();CLK=0;_nop_();}CS=1;return(data1 == data2)?data1:0;
}
void dsreset(void)            //发出命令
{uint i;DS=0;		              i=103;				   //将总线拉低480us~960uswhile(i>0)i--;DS=1;					   //然后拉高总线,若DS18B20做出反应会将在15us~60us后将总线拉低i=4;					   //15us~60us等待while(i>0)i--;//while(DS);
}
bit tmpreadbit(void)          //读取数据
{uint i;bit dat;DS=0;i++;          //i++ for delayDS=1;i++;i++;dat=DS;i=8;while(i>0)i--;return (dat);
}
uchar tmpread(void)           //读取数据
{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tmpreadbit();dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里}return(dat);
}
void tmpwritebyte(uchar dat)  //传输数据给DS18B20
{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb)     //write 1{DS=0;i++;i++;DS=1;i=8;while(i>0)i--;}else{DS=0;       //write 0i=8;while(i>0)i--;DS=1;i++;i++;}}
}
void tmpchange(void)          //DS18B20开始工作
{dsreset();Delay(1);tmpwritebyte(0xcc);  tmpwritebyte(0x44);  
}					  
uint tmp()                    //获得温度
{float tt;uchar a,b;dsreset();Delay(1);tmpwritebyte(0xcc);tmpwritebyte(0xbe);a=tmpread();//低八位b=tmpread();//高八位temp=b;temp<<=8;             //two byte  compose a int variabletemp=temp|a;tt=temp*0.0625; //算出来的是测到的温度,数值可到小数点后两位temp=tt*10+0.5; //为了显示温度后的小数点后一位并作出四舍五入,因为取值运算不能取小数点后的数return temp;
}void beep_warning() //温度传感器蜂鸣器警报并且电机转动
{if(ftemp>=10 && ftemp <= 20){numsum=1;}else if(ftemp>20 && ftemp <=25){numsum=2;}else if(ftemp>25 && ftemp <=35){numsum=3;}else if(ftemp<10 || ftemp > 35){numsum=0;}if(u1<20){beep = 0;cd =0;}else{beep = 1;cd=1;}}void main()					  //主函数
{	LCD_Init();         //显示屏初始化Time0_Init();beep = 1;while(1){if(kg==0){LCD_ShowString(1,1,"wendu:");LCD_ShowString(2,1,"dl:");u=get_AD_Res(); //MQu1 = (u/255)*100;LCD_ShowNum(1,7,ftemp,2); //第一行显示温度LCD_ShowNum(2,4,u1,3);if(mode==0){beep_warning(); //温度、电压、电流超出报警}LCD_ShowNum(1,15,numsum,2);}else{LCD_Init();         //显示屏初始化out1=0;out2=0;beep=1;}ajpd();}
}void ajpd()
{if(!key1){mode++;if(mode>1){mode = 0;}while(!key1);}if(mode == 1){		if(!key2){numsum=1;while(!key2);}if(!key3){numsum=2;while(!key3);}if(!key4){numsum=3;while(!key4);}}if(!key5){kg++;if(kg>1){kg=0;}while(!key5);}
}

四、资源下载

全部资料(源程序、仿真文件、安装包、演示视频):
链接: https://pan.baidu.com/s/1oL_3vXE_jlPq8K_kFxW9RA?pwd=mi1w 提取码: mi1w 
--来自百度网盘超级会员v4的分享

http://www.lryc.cn/news/505031.html

相关文章:

  • RK3576 Android14,内存大于4G时UVC应用无法申请内存
  • 12.12 深度学习-卷积的注意力机制-通道注意力SENet
  • H5 scss 移动端的样式适配
  • 【JAVA】Java项目实战—移动端项目:天气查询APP
  • SpringBoot - 动态端口切换黑魔法
  • Java爬虫技术:挖掘淘宝数据的利器
  • Chromium for Android 浏览器的编译和安装
  • 实景视频与模型叠加融合?
  • Scala的隐式类
  • 常见软件设计模式介绍:三层架构、MVC、SSM、EDD、DDD
  • Springboot技术栈常见问题及搭建步骤
  • session 共享服务器
  • vue2:v-for实现的el-radio-group选中时显示角标,并自定义选中按钮的字体颜色和背景色
  • 【Linux】-学习笔记10
  • 鸿蒙NEXT开发案例:九宫格随机
  • 深度解析:RTC电路上的32.768KHz时钟的频偏及测试
  • Scala的泛型
  • OpenGL ES详解——glUniform1i方法是否能用于设置纹理单元
  • 探索 Janus-1.3B:一个统一的 Any-to-Any 多模态理解与生成模型
  • 论文信息搜集
  • 实操给自助触摸一体机接入大模型语音交互
  • 图表的放大和刷新功能
  • SQLServer利用QQ邮箱做SMTP服务器发邮件
  • flutter 多文本,其中文本下划线往下移动
  • 7.OPEN SQL
  • Python轻松获取抖音视频播放量
  • YOLOv8目标检测(三*)_最佳超参数训练
  • SpringBoot SPI
  • uniappp配置导航栏自定义按钮(解决首次加载图标失败问题)
  • 【Apache paimon】-- 集成 hive3.1.3 异常