完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我所做的是关于温度监控系统的设计,而且是面向pc机的。
但是我在做仿真的时候。 1、DS18B29那里应该接上上拉电阻的,但是我一接上就显示的温度是000,而且蜂鸣器不断响 2、当温度调到某个温度值时,就会马上跳到8.1度然后又跳回那个温度值。 #include #define uchar unsigned char #define uint unsigned int ***it d1=P2^0; ***it d2=P2^1; ***it d3=P2^2; ***it d4=P2^3; ***it key1=P1^3; ***it key2=P1^4; ***it key3=P1^5; ***it led1=P1^0; ***it led2=P1^1; ***it baojing=P1^6; ***it DQ=P1^2; ***it ACC_7=ACC^7; uint count=300,alarm=200; //最初温度上下限值:30度、20度 uchar shu; uchar shi,fen,ri,yue,nian,xq,miao,ss; uint temp; // 定义温度变量 uchar flag; uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管不带小数点的0~9编码 uchar code tab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点的0~9编码 void send_int(void) { TMOD = 0x21; // 定时器1工作于8位自动重载模式, 用于产生波特率 TH1 = 0xfd; // 波特率9600 TL1 = 0xfd; TR1=1; TH0=0xD8; //定时器0定时10ms TL0=0xF0; ET0=1; //允许定时器0中断 ES=1; //允许串口中断 EA=1; //开中断 SCON = 0xd8; // 设定串行口工作方式 PCON = 0x00; // 波特率不倍增 } void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=120;y>0;y--); } void DQreset() //复位 { uint i; DQ=0; i=103; while(i>0)i--; DQ=1; i=4; while(i>0)i--; } void tmpwritebyte(uchar dat) //写一个字节 { uint i; uchar j; bit testb; for(j=1;j<=8;j++) { DQ=0;i++; testb=dat&0x01; dat=dat>>1; if(testb) //写 1 { DQ=1; i=8;while(i>0)i--; } else { DQ=0; //写 0 i=8;while(i>0)i--; DQ=1; i++;i++; } } } uchar tmpread() //读取一字节 { uchar j,k,dat; uint i; for(j=1;j<=8;j++) { DQ=0;i++; //延时 DQ=1;i++;i++; k=DQ; i=8;while(i>0)i--; dat=(k<<7)|(dat>>1);//读出的数据最低位在最前面存一个字节在DAT里 } return(dat); } void tmpchange() //DS18B20温度变换 { DQreset(); delay(1); tmpwritebyte(0xcc); //跳过读取内存rom tmpwritebyte(0x44); //开始转换 } uint tmp() //读取温度 { float tt; uchar a,b; DQreset(); delay(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); a=tmpread(); //a为低字节8位 b=tmpread(); //b为高字节8位 temp=b; //temp为温度值UINT 16bit temp<<=8; //两个字节组合到一起 temp=temp|a; if(b>127) { flag=1; ss=flag; temp=~temp+1; } tt=temp*0.0625; // temp/16 则是温度的真实值tt.7位整数,4位小数 temp=tt*10+0.5; // 扩大十倍取出了第一位小数 return(temp); } /*****温度显示********/ void displayTemp(uint temp) { uchar ge,shi,bai,qian,ser; d1=0; d1=0; d3=0; d4=0; DQreset(); ser=temp/10; //分离出三位要显示的数字 SBUF=ser; qian=temp/1000; bai=temp/100%10; // 百位数字 shi=temp/10%10; // 十位数字 ge=temp%10; // 个位数字 if(flag==1) { flag=0; P0=0xbf; d3=1; delay(2); d3=0; } if(qian!=0) { P0=tab[qian]; d1=1; delay(2); d1=0; } else { P0=0xff; d1=1; delay(2); d1=0; } if(temp>99) { P0=tab[bai]; d2=1; delay(2); d2=0; } P0=tab1[shi]; d3=1; delay(2); d3=0; P0=tab[ge]; d4=1; delay(2); d4=0; } /****按键控制******/ uint keyscan() { if(key1==0) //按键1 { delay(5); if(key1==0) { while(!key1); shu++; //按键1数按下次数 } } if(key2==0) //按键2 { delay(5); if(key2==0) { while(!key2); count=count+10; //温度上限值加1 if(shu==2) //按键1按下2次 { alarm+=10; //温度下限值加1 } } } if(key3==0) //按键3 { delay(5); if(key3==0) { while(!key3); count=count-10; //温度上限值减1 if(shu==2) //按键1按下2下 { alarm-=10; //温度下限值减1 } } } return(count); } /*****报警控制******/ void main() { led1=1; led2=1; baojing=1; delay(10); while( 1 ) { tmpchange(); if(shu==0) { displayTemp(tmp( )); } keyscan(); if(shu==1) { displayTemp(count); } if(shu==2) { displayTemp(alarm); } if(shu==3) { shu=0; } if(temp>count) { led1=0;baojing=0; } else if(temp led2=0;baojing=0; } else { led1=1; led2=1; baojing=1; } } } /*串口通信*/ void com_rxd() { while(1) { TR0=1; if(TF0=1) { SBUF=tmpread(); while(ti=1) { SBUF=0; SBUF=tmpread(); } ES=0; } } } |
|
相关推荐
7 个讨论
|
|
关于第一个问题,是要接一个上拉电阻,看看你的电阻是否有接错位置。
关于第二个问题,你可以接上一个24C02C存储数据,这样就不会出现这个问题了。 |
|
|
|
|
|
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 13:27 , Processed in 0.744141 second(s), Total 90, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号