51单片机LCD1602显示温度DS18B20

qq_26391419 2015-05-07 04:30:48
STC98C52的
在LCD上显示
画面1:开机画面
画面2:
temperature is:
× × .×
画面3:
TH is: × ×
TL is:× ×
画面2、3通过按键切换
TH、TL分别是程序设定的温度上、下限值,如果低于下限或高于上限,发出扬声器1s周期报警
画面4,是一个显示时间的。
有哪位大神,可以帮忙做一下,万分感谢
用C作呀,汇编露珠看不懂。。。。
...全文
720 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
manices 2019-01-17
  • 打赏
  • 举报
回复
参考一下我的历程
一条晚起的虫 2019-01-02
  • 打赏
  • 举报
回复
// DS18B20有C51的库 // LCD1602有C51的库 // 按钮就更不用说了,GPIO // 然后就是程序逻辑了。
weixin_44084787 2018-12-29
  • 打赏
  • 举报
回复
#include<reg52.h> #include<intrins.h> sbit DQ=P1^4;//温度采集 sbit latch1=P2^2;//段锁存 sbit latch2=P2^3;//位锁存 unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码0~9 unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//点亮数码管 unsigned char TempData[8];//存储显示的度数 bit Readtime;//读取时间的标志 //定义延时函数delayus,delayms void delayus(unsigned char t) { while(--t); } void delayms(unsigned char t) { while(t--) { delayus(245); delayus(245); } } //18b20初始化 bit ds18b20() { bit test=0; DQ=1;//复位DQ delayus(5);//稍作延时 DQ=0;//将DQ拉低 delayus(200);//精确延时 >480us <960us delayus(200); DQ=1;//将DQ拉高 delayus(50);//延时15~60us后,接收脉冲 test=DQ;//判断是否初始化成功 delayus(25);//延时后返回值 return test; } //显示程序函数 void Display(unsigned char FirstBit,unsigned char Num) { static unsigned char i=0; P0=0;//防止有重影 latch1=1;//段锁存 latch1=0; P0=dofly_WeiMa[i+FirstBit];//取位码 latch2=1;//位锁存 latch2=0; P0=TempData[i];//取显示数据,取段码 latch1=1;//段锁存 latch2=0; i++; if(i==Num) i=0; } //读取数据函数 unsigned char Readchar() { unsigned char i=0; unsigned char test=0; for(i=8;i>0;i--) { DQ=0; test>>=1;//右移一位 DQ=1; if(DQ) test|=0x80; delayus(25); } return(test); } //写入数据函数 void Writechar(unsigned char test) { unsigned char i=0; for(i=8;i>0;i--) { DQ=0; DQ=test&0x01; delayus(25); DQ=1; test>>=1; } delayus(25); } //读取温度函数 unsigned int ReadTempture() { unsigned char a=0; unsigned int b=0; unsigned int t=0; ds18b20(); Writechar(0xCC);//跳过读序列号 Writechar(0x44);//启动温度转换 delayms(10); ds18b20(); Writechar(0xCC);//跳过读序列号 Writechar(0xBE);//读取温度 a=Readchar();//高8位 b=Readchar();//低8位 b<<=8; t=a+b; return(t); } //主函数main void main() { unsigned int TempH,TempL,Temp; TMOD |= 0x01;//确定使用哪个定时器,确定工作模式 EA=1; //打开中断允许 ET0=1; //定时器T0中断允许 TR0=1; //启动T0 while(1) { if(Readtime==1) { Readtime=0; Temp=ReadTempture(); if(Temp&0x8000) { TempData[0]=0x40;//表示为负数 Temp=~Temp;//取反码 Temp+=1;//取补码 } } else TempData[0]=0;//表示为正数 TempH=Temp>>4; TempL=Temp&0x0F; TempL=TempL*6/10;//小数近似处理 if(TempH/100==0) TempData[1]=0;//百位温度 else TempData[1]=dofly_DuanMa[TempH/100];//十位温度 if((TempH/100==0)&&((TempH%100)/10==0))//消隐 TempData[2]=0; else TempData[2]=dofly_DuanMa[(TempH%100)/10];//十位温度 TempData[3]=dofly_DuanMa[(TempH%100)%10]|0x80;//个位温度,带小数点 TempData[4]=dofly_DuanMa[TempL];//小数位温度 TempData[6]=0x39;//显示符号C } } //定时中断函数 void Timer0_isr() interrupt 1 { static unsigned int num; TH0=(65536-2000)/256; TL0=(65536-2000)%256; Display(0,8);//调用函数 num++; if(num==300) { num=0; Readtime=1; //读标志位置1 } }
esprite2000 2015-05-08
  • 打赏
  • 举报
回复
作业怎么都发论坛上了

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧