51单片机+DS18B20+数码管组成的温度计电路包含源代码和Proteus仿真电路
基于看ds18b20时序图,不参照网络上的资料模索自写程序.在这过程中,仿真数码管显示什么问题都有.而显示正确,但有时闪烁后和乱码.(中断,其它调用都会影响到ds18b20的读取,导至温度时正常,时乱码,闪烁)下图是正常显示的图片.
试过时间中断刷新显示,还在读取温度函数开始处,温度转换语句后,处理好温度值里,都是干扰时序.我的处理方法请看代码.
如果还有bug,和不足之处.请指教.谢谢!

/*这程序只是用来模索ds18b20理解,不足之处请谅解.*/
/*11.0952MHZ*/
#include sbit DQ = P3^7;
sbit point = P1^7;unsigned char code LED_SEGtable[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code LED_BITtable[] = {0xfe,0xfd,0xfb};
unsigned char LED_buffer[] = {4,5,6};int tvalue = 0x0113;void delay2ms(void) //误差 0us
{unsigned char a,b;for(b=133;b>0;b--)for(a=6;a>0;a--);
}void delay_18B20(unsigned char i){while(i--);
}void ds1820rst(){ //复位unsigned char x = 0;DQ = 1; //DQ复位delay_18B20(4);DQ = 0; //DQ拉低delay_18B20(100);DQ = 1; //拉高delay_18B20(40);}unsigned char ds1820rd(){ //读数据unsigned char i = 0;unsigned char dat = 0;for(i=8; i>0; i--){DQ = 0;dat >>= 1;DQ = 1;if(DQ) dat |= 0x80;delay_18B20(10);}return dat;
}void ds1820wr(unsigned char wdata){unsigned char i = 0;for(i=8; i>0; i--){DQ = 0;DQ = wdata & 0x01;delay_18B20(10);DQ = 1;wdata >>= 1;}
}void display(){unsigned char i,k;for(i=0;i<107;i++){ //i=107,相当于750ms了for(k=0;k<3;k++){P1=0xff;P3=0xff;P1= LED_SEGtable[LED_buffer[k]];P3=LED_BITtable[k];if(k==1)point= ~point; //小数点delay2ms();}}}
void READ_tvalue(){unsigned char a, b,LSB;LED_buffer[0]=(tvalue/100%10);//这处理起到初始化缓冲的作用LED_buffer[1]=(tvalue/10%10);LED_buffer[2]=(LSB%10);ds1820rst();ds1820wr(0xcc);//跳过序列号ds1820wr(0x44);//启动温度转换display(); //此函数代替了750ms的延时,还不误显示.ds1820rst(); ds1820wr(0xcc);ds1820wr(0xbe); //读取温度a = ds1820rd();b = ds1820rd();tvalue = b;tvalue <<= 8;tvalue = tvalue | a;if((tvalue&0xf800)==0x0000){LSB = (tvalue&0x000f)*0.625; //取出小数位,精度请自检tvalue>>=4;tvalue=tvalue*10;} }void main(void){point=1; //小数点开始是1while(1){READ_tvalue();}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
