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();}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部