DS18B20温度采集器四位阴极数码管显示

全部回答2
默认 最新
  • /*ds18b20温度传感器p3.4作为数据传输口 p1.0~3控制显示led的位选 共阳极 经过pnp后 低电平有效p0口是led的字形码晶振:11.0592m设计者:陈仲库设计日期:2006年3月29日*/#include//#include //#include //#include sbit dq= p3^4; sbit p13= p1^3; sbit p12= p1^2; sbit p11= p1^1; sbit p10= p1^0; int flag; unsigned char disp1, disp2,disp3,disp0; unsigned char code ch[]={0xc0,0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82,0xf8,0x80,0x90}; /*0~9*/ void delay(int us) { int s; for ( s=0; s void disp() { p0 = 0xff; p0 = disp3; p13=0; delay(150); p13=1; p0 = 0xff; p0= disp2; p12=0; delay(150); p12=1; p0 = 0xff; p0 = disp1; p11=0; delay(150); p11=1; p0 = 0xff; p0 = disp0; p10=0; delay(150); p10=1; } void rst(void) { dq = 1; delay(2); dq = 0; delay(30); //精确延时 480~960us dq = 1; delay(8); } unsigned int read(void) { int i=0; unsigned int u=0; for (i=0;i<16;i++) { dq=0; u>>=1; dq=1; if(dq) u|=0x8000; delay(4); } return (u); } void write(unsigned char ku) { int i=0; for (i=0;i<8;i++) { dq=0; dq =ku&0x01; delay(3); dq=1; ku>>=1; } } void read0(void) { int t1,t2, t0; unsigned int tp; unsigned int lsb; rst(); write(0xcc); write(0x44); rst(); write(0xcc); write(0xbe); tp=read(); lsb=(unsigned int)(tp*6.25); // t0=lsb/1000; disp0 = ch[t0]; //第1位,最高位p1.2 if(!t0) disp0 = 0xff; t2= lsb%1000; t1=t2/100; disp1= ch[t1]&0x7f; t1=t2%100; t2=t1/10; disp2=ch[t2]; //第3位,最低位p1.2 disp3=ch[t1%10];//第4位,最低位p1.3 } void main(void) { while(1) { read0(); disp(); } }
    0 点赞
  • 你好:程序看着累。从你的描述来看,应该存在两个方面的问题:1. DS的时序问题。时序没对,读出来的值本身就不正确,更别说数值编码显示了。2. 数值编码问题。从你的程序开头的数组来看,只有数字和带小数点的数字,没有 DS的小数部分的处理数组,所以我想没有正确处理好DS返回值得小数部分。但是DS返回值得整数部分不需要处理就能显示的,而你的仿真图什么都显示错误了,所以我想最大可能还是时序问题。你若需要,我可以把我的的protues仿真图给你,还有程序,LCD1602显示。希望我的回答能帮助到你。
    0 点赞

没有更多内容了

返回顶部
产品求购 求购