完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
了一个基于 89c51 ds18b20 lcd1602的两路温度采集报警系统,这会温度可以读出来了 但是报警实现不了。下面是c程序 求大神帮我看看!仿真时一加主程序if后的程序。ds18b20就不读数了。
******************************************************************************************************************* #include #include #define uchar unsigned char #define uint unsigned int #define H1_temp 40 #define L1_temp 10 #define H2_temp 30 #define L2_temp 5 ***it RS=P3^5; ***it RW=P3^6; ***it EN=P3^7; ***it DQ=P3^4; ***it SPK=P3^2; ***it LED1=P3^1; ***it LED2=P3^0; ***it SPK1=P0^0; ***it LED3=P0^1; ***it LED4=P0^2; int wendu1; int wendu2; uchar code str1[]={0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9}; //ROM 1 uchar code str2[]={0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e}; //ROM2 uchar code table[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00}; // 摄氏温度符号 uchar data disdata[5]; uint tvalue;//温度值 uchar tflag;//温度正负标志 /*************************lcd1602程序**************************/ void delay1ms(uint ms)//延时1毫秒(不够精确的) { uint i,j; for(i=0;i } void wr_com(uchar com)//写指令// { delay1ms(1); RS=0; RW=0; EN=0; P1=com; delay1ms(1); EN=1; delay1ms(1); EN=0; } void wr_dat(uchar dat)//写数据// { delay1ms(1); RS=1; RW=0; EN=0; P1=dat; delay1ms(1); EN=1; delay1ms(1); EN=0; } void wr_new() //写新字符 { uchar i; wr_com(0x40); for(i=0;i<8;i++) { wr_dat(table[i]); } } void lcd_init()//初始化设置// { delay1ms(15); wr_com(0x38);delay1ms(5); wr_com(0x08);delay1ms(5); wr_com(0x01);delay1ms(5); wr_com(0x06);delay1ms(5); wr_com(0x0c);delay1ms(5); wr_new(); wr_com(0x80); wr_dat('A'); wr_com(0x81); wr_dat(':'); wr_com(0x89); wr_dat(0x00); wr_com(0x8a); wr_dat('C'); wr_com(0xc9); wr_dat(0x00); //摄氏温度字符 wr_com(0xca); wr_dat('C'); wr_com(0xc0); wr_dat('B'); wr_com(0xc1); wr_dat(':'); } /******************************ds1820程序***************************************/ void delay_18B20(uint i)//延时1微秒 { while(i--); } void ds1820rst()/*ds1820复位*/ { uchar x=0; DQ = 1; //DQ复位 delay_18B20(4); //延时 DQ = 0; //DQ拉低 delay_18B20(100); //精确延时大于480us DQ = 1; //拉高 delay_18B20(40); } uchar ds1820rd()/*读数据*/ { uchar i=0; uchar dat = 0; for (i=0;i<8;i++) { DQ = 0; //给脉冲信号 dat>>=1; DQ = 1; //给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); } return(dat); } void ds1820wr(uchar dat)/*写数据*/ { uchar i=0; for (i=0; i<8; i++) { DQ = 0; DQ = dat&0x01; delay_18B20(10); DQ = 1; dat>>=1; } } void b20_Matchrom(uchar a) //匹配ROM { char j; ds1820wr(0x55); //发送匹配ROM命令 if(a==1) { for(j=0;j<8;j++) ds1820wr(str1[j]); //发送18B20的序列号,先发送低字节 } if(a==2) { for(j=0;j<8;j++) ds1820wr(str2[j]); //发送18B20的序列号,先发送低字节 } } read_temp(uchar z)/*读取温度值并转换*/ { uchar a,b; float tt; ds1820rst(); ds1820wr(0xcc); //读序列号 ds1820rst(); if(z==1) { b20_Matchrom(1); //匹配ROM 1 } if(z==2) { b20_Matchrom(2); //匹配ROM 2 } ds1820wr(0x44);//*启动温度转换*/ delay1ms(5); ds1820rst(); ds1820wr(0xcc); //读序列号 ds1820rst(); if(z==1) { b20_Matchrom(1); //匹配ROM 1 } if(z==2) { b20_Matchrom(2); //匹配ROM 2 } ds1820wr(0xbe);//*读取温度*/ a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue<<=8; tvalue=tvalue|a; if(tvalue<0x0fff) tflag=0; else { tvalue=~tvalue+1; tflag=1; } tt=tvalue*0.0625; tvalue=tt*10; return(tvalue); } /*****************显示函数******************************/ void ds1820disp(uchar z)//温度值显示 { uchar flagdat; disdata[0]=tvalue/1000+0x30;//百位数 disdata[1]=tvalue%1000/100+0x30;//十位数 disdata[2]=tvalue%100/10+0x30;//个位数 disdata[3]=tvalue%10+0x30;//小数位 if(tflag==0) flagdat=0x20;//正温度不显示符号 else flagdat=0x2d;//负温度显示负号:- if(disdata[0]==0x30) {disdata[0]=0x20;//如果百位为0,不显示 if(disdata[1]==0x30) {disdata[1]=0x20;//如果百位为0,十位为0也不显示 } } if(z==1) { wr_com(0x82); wr_dat(flagdat);//显示符号位 wr_com(0x83); wr_dat(disdata[0]);//显示百位 wr_com(0x84); wr_dat(disdata[1]);//显示十位 wr_com(0x85); wr_dat(disdata[2]);//显示个位 wr_com(0x86); wr_dat(0x2e);//显示小数点 wr_com(0x87); wr_dat(disdata[3]);//显示小数位 } if(z==2) { wr_com(0xc2); wr_dat(flagdat);//显示符号位 wr_com(0xc3); wr_dat(disdata[0]);//显示百位 wr_com(0xc4); wr_dat(disdata[1]);//显示十位 wr_com(0xc5); wr_dat(disdata[2]);//显示个位 wr_com(0xc6); wr_dat(0x2e);//显示小数点 wr_com(0xc7); wr_dat(disdata[3]);//显示小数位 } } /***********************蜂鸣器********/ void buzzer(int x) {int i,y; for(x;x>0;x--) {for(i=100;i>0;i--) {SPK=1; delay1ms(20) ; SPK=0; delay1ms(20) ; for(y=50;y>0;y--) {delay1ms(200);} } } } /********************主程序***********************************/ void main() { unsigned int wendu1; unsigned int wendu2; LED1=1; LED2=1; SPK1=1; LED3=1; LED4=1; lcd_init();//初始化显示 while(1) { read_temp(1); //读取温度 ; wendu1 = read_temp(1); ds1820disp(1);//显示 read_temp(2);//读取温度 delay1ms(20) ; wendu2 = read_temp(2); ds1820disp(2);//显示 // delay1ms(10000); if(read_temp(1)>H1_temp) { buzzer(2); LED1=0; } if (read_temp(1)< L1_temp) { buzzer(2); LED2=0; } /*if(wendu2>H_temp2) { LED3=0; } else if (wendu2<10) { SPK1=~SPK1; delay1ms(20) ; LED4=~LED4; } */ } } |
|
相关推荐
5个回答
|
|
|
|
可以发整个文件吗?方便调试
|
|
|
|
|
|
|
|
上传一下文件,大家来帮你
|
|
|
|
学习了,,嘿嘿
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
5872 浏览 3 评论
7143 浏览 1 评论
7388 浏览 0 评论
Protues中自己封装的芯片元件无Program File、Clock Frequency选项怎么解决,求求大神了!
9179 浏览 1 评论
基于51单片机的车辆倒车雷达报警系统,HC-SR04超声波测距,全套资料
1265 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 00:00 , Processed in 0.721602 second(s), Total 86, Slave 66 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号