#define uchar unsigned char #define uint unsigned int
uchar code TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code TAB1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; sbit DQ=P3^3;
void delay(uint i) { while(i--); }
void DelayMS(uint ms) { uchar i; while(ms--) for(i=0;i<120;i++); }
void display(int k)//数码管显示 { P2=0x08; P0=TAB[k%10]; DelayMS(5); P2=0x04; P0=TAB[k/10%10]; DelayMS(5); P2=0x02; P0=TAB1[k/100%10]; DelayMS(5); P2=0x01; P0=TAB[k/1000]; DelayMS(5); }
init_DS(void) {
uchar x=0; DQ=1; delay(8); DQ=0; delay(85); DQ=1; delay(14); x=DQ; delay(20); }
Read(void) { uchar i=0; uchar dat=0; for(i=8;i>0;i--) { //DQ=1; //delay(1); DQ=0; dat>>=1; DQ=1; if(DQ) dat|=0x80;//读出数据放入高位,最后右移到低位 delay(4); } return(dat); }
write(uchar dat) { uchar i=0; for(i=8;i>0;i--) { DQ=0; DQ=dat&0x01;//从地位开始写入 delay(5); DQ=1; dat>>=1; } delay(4); }
Readtem(void) { uchar a=0; uchar b=0; uchar t=0,t1; init_DS(); write(0xcc);//跳过读序列号操作 write(0x44);//启动温度转换 delay(125); init_DS(); write(0xcc); write(0xbe);// 读温度寄存器 a=Read();//读取温度低位LSB b=Read();//读取温度低位HSB t1=(a&0x0f)*0.0625;//取小数部分 t=((b<<4)|(a>>4));//取整数部分 if(t>128) { t=~t+1; } t=t+t1; return(t); }
void main() { float tp; while(1) { tp=Readtem(); tp=tp*100;//把二位数乘以100变成四位数 display(tp); } }
因篇幅问题不能全部显示,请点此查看更多更全内容