完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我做一个温度显示和数据传送系统,温度传感器用的是DS18B20,用U1单片机连接18B20,用U2连接LCD1602,U1 U2进行通讯,为何LCD温度显示不稳,有乱码现象,温度不会超过30度.一会25,一会15,一会0. U1程序/****************************************************************** 本/****************************************************************** 本单片机采用STC89C52RC芯片,用LCD1602显示温度上限设定值,下限设定值, 以及在线温度实时显示,用18B20温度传感器检测温度,同时用按键设置温度 上下限,以及设定切换,用timer0中断设置1秒闪烁指示灯显示运行状态。 *******************************************************************/ #include #include unsigned char times; #define uchar unsigned char//宏定义 #define uint unsigned int ***it DQ= P2^2; //18B20总线端口 ***it led1=P1^0; //系统运行指示, uint temp1; uchar bai,shi,ge; //测量温度显示位置 uchar qian1,bai1,shi1,ge1;//上下限温度显示位置 bit flag; //标志位 ***it ds=P2^2;//18B20传感器 I/O口 ***it beep=P1^0;//温度报警 uint temp; uchar num,num_shang=0,num_xia=0,numled,flag_qiehuan; //变量初始化,定义 /*==================================== 函数 : delay(uint z) 参数 :z 延时毫秒设定,取值范围0-65535 返回值 :无 描述 :12T/Fosc11.0592M毫秒级延时 ====================================*/ void delayus(uint t) //us延时函数 { while(t--); } void init() //初始化函数 { TMOD|=0x01; //设置定时器0位工作方式(00000001) TH0=(65536-22500)/256; //装初值 TL0=(65536-22500)%256; EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; SCON|=0x50; //串行口工作方式1,8位通用异步发送器 TMOD|=0x20; //定时器1工作方式2 PCON=0x00; //波特率不倍增 TH1=0xf3; TL1=0xf3; //波特率2400 TR1=1; //定时器1开始计时 } void put(uint x) //发送函数 { SBUF=x; //SBUF:串行口数据缓冲器 while(TI==0); //等待发送结束 TI=0; } void ds_reset() //复位函数 { ds=1; delayus(5); // 延时 ds=0; delayus(80); ds=1; delayus(14); if(ds==0) flag=1; else flag=0; //flag作为标志位,等1表示18b20存在 delayus(20); } bit ds_read_bit(void) //读一位数据函数 { bit dat; ds=0; _nop_(); //延时机器周期 _nop_(); ds=1; //释放总线 _nop_(); dat=ds; delayus(10); //延时100us return dat; } uchar ds_read_byte() //读一个字节函数 { uchar i,j,k; for(i=0;i<8;i++) //一个字节8位组成,循环八次 { j=ds_read_bit(); k=(j<<7)|(k>>1); //读出的数据最低位在最前面 } return k; } void ds_write_byte(uchar dat) //写一个字节的函数 { uchar i; for(i=0;i<8;i++) //循环八位将一个字节由低到高写入 { ds=0; _nop_(); ds=dat&0x01; //保留dat的最低位 delayus(6); ds=1; //释放总线 dat=dat>>1; } delayus(6); } uint read_temp() //读取温度函数 { uchar a,b; ds_reset(); ds_write_byte(0xcc);// 18B20忽略指令 ds_write_byte(0xbe); //读暂存器指令 a=ds_read_byte(); //读低八位 b=ds_read_byte(); //读高八位 temp=b; temp=temp<<8; temp=temp|a; temp=temp*0.0625; //得到实际温度值 return temp; } void deal()// 温度报警设定 { if((temp>=num_xia)||(temp<=num_shang)) //大于下限或低于上限不报警 { beep=0; } if((temp { beep=1; } } /****************************************/ /************************************/ void delay_DS18B20( time)//18B20延时5us函数 { uint i,j; for(i=0;i for(j=0;j<1;j++); } void delay_ms(uchar y) { uchar i; while(y--) for(i=0;i<120;i++) ; } uchar Init_DS18B20(void)//18B20初始化 { uchar Presence; DQ=1; //数据端置高电平 delay_DS18B20(10); //延时 DQ=0; //数据端置低电平 delay_DS18B20(29); DQ=1; delay_DS18B20(3); Presence=DQ; delay_DS18B20(23); return (Presence); } uchar Read_bit_DS18B20(void) { DQ=1; delay_DS18B20(1);//DS18B20读位 DQ=0; DQ=1; return (DQ); } void Write_bit_DS18B20(uchar date)//DS18B20写位 { DQ=0; if(date==1) DQ=1; delay_DS18B20(1); DQ=1; delay_DS18B20(1); } uchar Read_Byte_DS18B20(void)//DS18B20读字节 { uchar i,date=0; for(i=0;i<8;i++) { if(Read_bit_DS18B20()) { date=date|(0x01< } } return (date); } void Write_Byte_DS18B20(uchar date)//DS18B20写字节 { uchar i; for(i=0;i<8;i++) { Write_bit_DS18B20(date&0x01); date=date>>1; } } uint Gettemp(void)//读取温度,并将二进制数据转换成温度值 { uchar a,b; uint temp; float t; Init_DS18B20(); Write_Byte_DS18B20(0xcc);//跳过 ROM Write_Byte_DS18B20(0x44);//开始转换温度 delay_DS18B20(30); Init_DS18B20(); Write_Byte_DS18B20(0xcc);//跳过 ROM Write_Byte_DS18B20(0xbe);//读取数据 a=Read_Byte_DS18B20();//读温度值的低位 b=Read_Byte_DS18B20();//读温度值的高位 temp=b; temp=temp<<8; temp=temp|a; t=temp*0.0625; //计算温度值 temp=t*100+0.5; return (temp); // 返回 } void main(void) { init(); //定时器初始化函数调用 { ds_reset(); ds_write_byte(0xcc); //18B20忽略指令 ds_write_byte(0x44);//18B20温度转换指令 deal(); //测量温度处理 } while(1) { if(led1) { temp1=Gettemp(); put(temp1); } } } /***************************************************/ void T0_time() interrupt 1//中断1 { TH0=(65536-22500)/256; //装初值 TL0=(65536-22500)%256; numled++; if(numled==50) { numled=0; led1=~led1; //定时1s灯闪烁 } } 以及在线温度实时显示,用18B20温度传感器检测温度,同时用按键设置温度 上下限,以及设定切换,用timer0中断设置1秒闪烁指示灯显示运行状态。 *******************************************************************/ #include #include unsigned char times; #define uchar unsigned char//宏定义 #define uint unsigned int ***it DQ= P2^2; //18B20总线端口 ***it led1=P1^0; //系统运行指示, uint temp1; uchar bai,shi,ge; //测量温度显示位置 uchar qian1,bai1,shi1,ge1;//上下限温度显示位置 bit flag; //标志位 ***it ds=P2^2;//18B20传感器 I/O口 ***it beep=P1^0;//温度报警 uint temp; uchar num,num_shang=0,num_xia=0,numled,flag_qiehuan; //变量初始化,定义 /*==================================== 函数 : delay(uint z) 参数 :z 延时毫秒设定,取值范围0-65535 返回值 :无 描述 :12T/Fosc11.0592M毫秒级延时 ====================================*/ void delayus(uint t) //us延时函数 { while(t--); } void init() //初始化函数 { TMOD|=0x01; //设置定时器0位工作方式(00000001) TH0=(65536-22500)/256; //装初值 TL0=(65536-22500)%256; EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; SCON|=0x50; //串行口工作方式1,8位通用异步发送器 TMOD|=0x20; //定时器1工作方式2 PCON=0x00; //波特率不倍增 TH1=0xf3; TL1=0xf3; //波特率2400 TR1=1; //定时器1开始计时 } void put(uint x) //发送函数 { SBUF=x; //SBUF:串行口数据缓冲器 while(TI==0); //等待发送结束 TI=0; } void ds_reset() //复位函数 { ds=1; delayus(5); // 延时 ds=0; delayus(80); ds=1; delayus(14); if(ds==0) flag=1; else flag=0; //flag作为标志位,等1表示18b20存在 delayus(20); } bit ds_read_bit(void) //读一位数据函数 { bit dat; ds=0; _nop_(); //延时机器周期 _nop_(); ds=1; //释放总线 _nop_(); dat=ds; delayus(10); //延时100us return dat; } uchar ds_read_byte() //读一个字节函数 { uchar i,j,k; for(i=0;i<8;i++) //一个字节8位组成,循环八次 { j=ds_read_bit(); k=(j<<7)|(k>>1); //读出的数据最低位在最前面 } return k; } void ds_write_byte(uchar dat) //写一个字节的函数 { uchar i; for(i=0;i<8;i++) //循环八位将一个字节由低到高写入 { ds=0; _nop_(); ds=dat&0x01; //保留dat的最低位 delayus(6); ds=1; //释放总线 dat=dat>>1; } delayus(6); } uint read_temp() //读取温度函数 { uchar a,b; ds_reset(); ds_write_byte(0xcc);// 18B20忽略指令 ds_write_byte(0xbe); //读暂存器指令 a=ds_read_byte(); //读低八位 b=ds_read_byte(); //读高八位 temp=b; temp=temp<<8; temp=temp|a; temp=temp*0.0625; //得到实际温度值 return temp; } void deal()// 温度报警设定 { if((temp>=num_xia)||(temp<=num_shang)) //大于下限或低于上限不报警 { beep=0; } if((temp { beep=1; } } /****************************************/ /************************************/ void delay_DS18B20( time)//18B20延时5us函数 { uint i,j; for(i=0;i for(j=0;j<1;j++); } void delay_ms(uchar y) { uchar i; while(y--) for(i=0;i<120;i++) ; } uchar Init_DS18B20(void)//18B20初始化 { uchar Presence; DQ=1; //数据端置高电平 delay_DS18B20(10); //延时 DQ=0; //数据端置低电平 delay_DS18B20(29); DQ=1; delay_DS18B20(3); Presence=DQ; delay_DS18B20(23); return (Presence); } uchar Read_bit_DS18B20(void) { DQ=1; delay_DS18B20(1);//DS18B20读位 DQ=0; DQ=1; return (DQ); } void Write_bit_DS18B20(uchar date)//DS18B20写位 { DQ=0; if(date==1) DQ=1; delay_DS18B20(1); DQ=1; delay_DS18B20(1); } uchar Read_Byte_DS18B20(void)//DS18B20读字节 { uchar i,date=0; for(i=0;i<8;i++) { if(Read_bit_DS18B20()) { date=date|(0x01< } } return (date); } void Write_Byte_DS18B20(uchar date)//DS18B20写字节 { uchar i; for(i=0;i<8;i++) { Write_bit_DS18B20(date&0x01); date=date>>1; } } uint Gettemp(void)//读取温度,并将二进制数据转换成温度值 { uchar a,b; uint temp; float t; Init_DS18B20(); Write_Byte_DS18B20(0xcc);//跳过 ROM Write_Byte_DS18B20(0x44);//开始转换温度 delay_DS18B20(30); Init_DS18B20(); Write_Byte_DS18B20(0xcc);//跳过 ROM Write_Byte_DS18B20(0xbe);//读取数据 a=Read_Byte_DS18B20();//读温度值的低位 b=Read_Byte_DS18B20();//读温度值的高位 temp=b; temp=temp<<8; temp=temp|a; t=temp*0.0625; //计算温度值 temp=t*100+0.5; return (temp); // 返回 } void main(void) { init(); //定时器初始化函数调用 { ds_reset(); ds_write_byte(0xcc); //18B20忽略指令 ds_write_byte(0x44);//18B20温度转换指令 deal(); //测量温度处理 } while(1) { if(led1) { temp1=Gettemp(); put(temp1); } } } /***************************************************/ void T0_time() interrupt 1//中断1 { TH0=(65536-22500)/256; //装初值 TL0=(65536-22500)%256; numled++; if(numled==50) { numled=0; led1=~led1; //定时1s灯闪烁 } } U2程序 /****************************************************************** 本单片机采用STC89C52RC芯片,用LCD1602显示温度上限设定值,下限设定值, 以及在线温度实时显示,用18B20温度传感器检测温度,同时用按键设置温度 上下限,以及设定切换,用timer0中断设置1秒闪烁指示灯显示运行状态。 *******************************************************************/ #include #include unsigned char times; #define uchar unsigned char//宏定义 #define uint unsigned int ***it RS = P2^6; //定义lcd1602通讯端口 ***it RW = P2^5; ***it EN = P2^7; ***it DQ= P1^7; //18B20总线端口 ***it led1=P1^1; //系统运行指示, uint temp1; uchar qian, bai,shi,ge; //测量温度显示位置 uchar qian1,bai1,shi1,ge1;//上下限温度显示位置 bit flag; //标志位 ***it ds=P1^7;//18B20传感器 I/O口 ***it led0=P1^0;//温度报警 uint temp; ***it led4=P1^4;//温度上下限设定指示 ***it led3=P1^2;//工作指示 uchar num,num_shang=0,num_xia=0,numled,flag_qiehuan; //变量初始化,定义 /*==================================== 函数 : delay(uint z) 参数 :z 延时毫秒设定,取值范围0-65535 返回值 :无 描述 :12T/Fosc11.0592M毫秒级延时 ====================================*/ void init() //初始化函数 { TMOD|=0x01; //设置定时器0位工作方式(00000001) TH0=(65536-22500)/256; //装初值 TL0=(65536-22500)%256; EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; SCON=0x50; //串行口工作方式1,8位通用异步发送器 TMOD|=0x20; //定时器1工作方式2 PCON=0x00; //波特率不倍增 TH1=0xf4; TL1=0xf4; TR1=1; } /*************************************/ /****************************************/ void display_set_alm() //显示子函数,报警数据分离,显示在液晶面板上 { qian1=num_shang/10; bai1=num_shang%10; shi1=num_xia/10; ge1=num_xia%10; } /************************************/ void delay_ms(uchar time)//延时1ms函数 { unsigned int i,j; for(i=0;i |
|
相关推荐
3个回答
|
|
|
|
|
|
着急啊………………………………………
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
298 浏览 1 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
309 浏览 0 评论
826 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1911 浏览 2 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1427 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12031 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 01:12 , Processed in 1.003118 second(s), Total 89, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号