完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
6 个讨论
|
|
#include
定义 #include #include #define uchar unsigned char #define uint unsigned int /******************************************************************/ /* 定义端口 */ /******************************************************************/ ***it led1=P3^0;// 温度超出范围指示灯 ***it led2=P3^2; ***it buzzer=P3^1;//蜂鸣器引脚 ***it DQ=P3^4;//ds18b20 端口 ***it RS = P3^7;//1602 数据/命令选择端(H:数据寄存器 L:指令寄存器) ***it RW = P3^6;//1602 读/写选择端 ***it E = P3^5;//1602 使能信号端 ***it key1=P1^0;//用户按键 ***it key2=P1^1; ***it key3=P1^2; ***it key4=P1^3; ***it key5=P1^4; /******************************************************************/ /* 全局变量 */ /******************************************************************/ int temp;//测得温度 char temp_max=40,temp_min=10;//设定的温度 char TempH,TempL; uchar flag_get,num=0; uchar code tab[]={'0','1','2','3','4','5','6','7','8','9'};//液晶显示 26 uchar tab1[]="min:010 max:040";//液晶第二行显示内容 uchar tab2[]="Ready to go ? P."; uchar str[8]; /******************************************************************/ /* 延时函数 */ /******************************************************************/ void delay1(uint i)//短延时函数 { while(i--); } void delay(uint z) //长延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } /******************************************************************/ /* DS18B20 初始化 */ /******************************************************************/ void Init_DS18B20(void) { /*uchar x=0; DQ = 0; //单片机将 DQ 拉低 delay1(480); //精确延时 大于 480us DQ = 1; //拉高总线,等待 delay1(10); x=DQ; //稍做延时后 如果 x=0 则初始化成功 x=1 则初始化失败 delay1(5);*/ unsigned char x=0; DQ = 1; //DQ 复位 delay1(8); //稍做延时 DQ = 0; //单片机将 DQ 拉低 delay1(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay1(14); x=DQ; //稍做延时后 如果 x=0 则初始化成功 x=1 则初始化失败 delay1(20); } /******************************************************************/ /* DS18B20 读一个字节 */ /******************************************************************/ uchar ReadOneChar(void) // DS18B20 读一个字节 27 { uchar i=0; uchar dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号,主机在读时隙期间必须释放总线 if(DQ) dat|=0x80; delay1(5); } return(dat); } /******************************************************************/ /* DS18B20 写一个字节 */ /******************************************************************/ void WriteOneChar(uchar dat) //DS18B20 写一个字节 { uchar i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01;//取最低位 delay1(5); DQ = 1; dat>>=1;//左移 } delay1(5); } /******************************************************************/ /* DS18B20 读取温度 */ /******************************************************************/ uint ReadTemperature(void) //DS18B20 读取温度 { uchar a=0; uint b=0; uint t=0; Init_DS18B20();//DS18B20 初始化 WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 28 delay1(200); //延时以求信号的稳定 Init_DS18B20(); //DS18B20 再次初始化 WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读 9 个寄存器) 前两个就是温度 a=ReadOneChar(); //低位 b=ReadOneChar(); //高位 b<<=8; //b 左移 8 位 t=a+b; //把 a 与 b 结合,放在 16 位的 t 中 return(t); } /******************************************************************/ /* LCD1602 写命令操作 */ /******************************************************************/ void WriteCommand(uchar com) { delay(5);//操作前短暂延时,保证信号稳定 E=0; RS=0; RW=0; P0=com; E=1; delay(5); E=0; } /******************************************************************/ /* LCD1602 写数据操作 */ /******************************************************************/ void WriteData(uchar dat) { delay(5); //操作前短暂延时,保证信号稳定 E=0; RS=1; RW=0; P0=dat; E=1; delay(5); E=0; } /******************************************************************/ /* 上电及复位显示程序 */ /******************************************************************/ void InitLcd1() 29 { uchar i; delay(15); WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x06); //显示光标移动位置 WriteCommand(0x0c); //显示开及光标设置 WriteCommand(0x01); //显示清屏 WriteCommand(0x80+0x40);//将光标移到第二行 for(i=0;i<16;i++)//显示初始化内容 { WriteData(tab2[i]); delay(10); } } /******************************************************************/ /* LCD1602 初始化程序 */ /******************************************************************/ void InitLcd() { uchar i; delay(15); WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x06); //显示光标移动位置 WriteCommand(0x0c); //显示开及光标设置 WriteCommand(0x01); //显示清屏 WriteCommand(0x80+0x40);//将光标移到第二行 for(i=0;i<16;i++)//显示初始化内容 { WriteData(tab1[i]); delay(10); } } /******************************************************************/ /* 蜂鸣器报警程序 */ /******************************************************************/ void alarm() { if(TempH>=temp_max)//当温度高于设置的最高温报警 { buzzer=0; delay(50); 30 buzzer=1; delay(50); led1=0; led2=1; } else if(TempH buzzer=0; delay(50); buzzer=1; delay(50); led1=1; led2=0; } else//报警解除 { buzzer=1; led1=1; led2=1; } } /******************************************************************/ /* 显示测得的温度 */ /******************************************************************/ void handle_T() { uchar i; str[0]=0x20;//显示为空 str[1]=tab[TempH/100]; //百位温度 str[2]=tab[(TempH%100)/10]; //十位温度 str[3]=tab[(TempH%100)%10]; //个位温度,带小数点 str[5]=tab[TempL]; str[4]='.'; str[6]=0xdf; str[7]='C'; if(flag_get==1) //定时读取当前温度 { flag_get=0; //清标志位 temp=ReadTemperature();//读取温度值 if(temp&0x8000) { str[0]=0xb0;//负号标志 temp=~temp; // 取反加 1 31 temp +=1; } TempH=temp>>4; //由权重表知移 4 位就是整数位 TempL=temp&0x0F; TempL=TempL*6/10;//小数近似处理 alarm(); //判断是否需要报警 } WriteCommand(0x80+0x04);//光标指向第一行第一个字符 for(i=0;i<8;i++)// 显示 { WriteData(str[i]); delay(10); } } void display_range(uchar add,int t) { uchar i; if(t<0) { str[0]=0xb0;//负号标志 } else str[0]=tab[abs(t)/100]; //百位温度 str[1]=tab[(abs(t)%100)/10]; //十位温度 str[2]=tab[(abs(t)%100)%10]; //个位温度 WriteCommand(0x80+0x40+add); for(i=0;i<3;i++) { WriteData(str[i]); delay(5); } } /******************************************************************/ /* 独立键盘扫描函数并显示设定的温度 */ /******************************************************************/ void keyscan() { uchar flag1=0,flag2=0;//有按键按下标记 P3=0xff;//拉高 P3 口,以读取 P3 口的值 if(key5==0)//最高温加 32 { delay(5);//延时消抖 if(key5==0) { temp_max++; if(temp_max>=85) temp_max=85; } while(!key5);//松手检测 flag1=1; } if(key4==0)//最高温减 { delay(5); if(key4==0) { temp_max--; if(temp_max<=temp_min) temp_max=temp_min; } while(!key4); flag1=1; } if(key3==0)//最低温加 { delay(5);//延时消抖 if(key3==0) { temp_min++; if(temp_min>=temp_max) temp_min=temp_max; } while(!key3);//松手检测 flag2=1; } if(key2==0)//最低温减 { delay(5); if(key2==0) { temp_min--; if(temp_min<=-10) temp_min=-10; } 33 while(!key2); flag2=1; } if(flag1)//如有设置最高温度的键按下,更新设定的温度 { flag1=0;// 清标记 display_range(0x0d,temp_max); } if(flag2)//如有设置最低温度的键按下,更新设定的温度 { flag2=0;// 清标记 display_range(0x04,temp_min); } } /****************************************************************/ /* 主函数 */ /******************************************************************/ void main() { CY=0; P3=0xff;//拉高 P3 口,以读取 P3 口的值 if(key1==0)//最高温加 { delay(5);//延时消抖 if(key1==0) { CY=1; } while(!key1);//松手检测 } if (CY==0) { InitLcd1(); delay(500); } else { TMOD|=0x01;//定时器设置 TH0=0xef;//装初始值 TL0=0xf0; EA=1;// 开总中断 ET0=1;//允许定时器 0 中断 34 TR0=1;//开定时器 0 中断 InitLcd();//lcd1602 初始化 flag_get=1; while(1) { handle_T();// 处理温度:获得、显示、报警 keyscan(); //独立按键扫描 } }} /******************************************************************/ /* 定时 0 中断处理程序,用于温度检测间隔,大约 1 秒测一次温度 */ /******************************************************************/ void timer0(void) interrupt 1 using 1 { TH0=0xef;//定时器重装值 TL0=0xf0; num++; if (num==50) { num=0; flag_get=1;//标志位有效,开始测温 } } |
|
|
|
|
|
毕设的?
|
|
|
|
6 条评论
|
|
TempL=TempL*6/10;//小数近似处理,这里改为*60就可以得到两位小数。
void handle_T() { uchar i; str[0]=0x20;//显示为空 str[1]=tab[TempH/100]; //百位温度 str[2]=tab[(TempH%100)/10]; //十位温度 str[3]=tab[(TempH%100)%10]; //个位温度,带小数点 str[5]=tab[TempL]; 这里需要增加一个小数的显示格式调整。 你的程序有问题,void handle_T()里的显示数据格式调整在读取温度之前,所以显示的都是前一次读取的温度值,另外显示的小数点在温度的小数位的后面,确定显示出来的内容没有问题吗 |
|
|
|
1 条评论
|
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
180 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
587 浏览 0 评论
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】(第三篇)ADC采集+PWM输出
549 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验
548 浏览 0 评论
1051 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11763 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 17:10 , Processed in 0.612224 second(s), Total 57, Slave 49 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号