计算机学院
通信工程
这是基于ATC51单片机的温度传感器仿真程序,使用proteus 软件仿真,温度传感器用ds18b20芯片。在实际的硬件制作中两位数码管的位选应再加上三极管。
程序如下:#include #define uchar unsigned char #define uint unsigned int sbit DQ=P1^3; sbit led_yellow=P1^0; uint temp; uchar a,b,tempr;uchar table1[]={ 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0xff,0xbf}; uchar table2[10]={ 0x40,0x79,0x24,0x30,0x19, 0x12,0x02,0x78,0x00,0x10}; void delay(uint x) { while(x--); } void Init(void) { DQ = 0; delay(100); DQ = 1; delay(30); } uchar Read(void) { uchar i=0; uchar dat = 0; for (i=8;i>0;i--) { DQ = 0; dat>>=1; DQ = 1; if(DQ) dat|=0x80; delay(5); } return(dat); } void Write(uchar dat) { uchar i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay(5); DQ = 1;dat>>=1; } } void display(uint temp) { if(temp<=0x800) { temp>>=4; temp*=10; a=temp%1000/100; b=temp%1000%100/10; } else { temp=~temp; temp+=1; temp>>=4; a=temp%100/10; b=temp%100%10; } P2=1; P0=table1[a]; delay(100); P2=2; P0=table2[b]; delay(800); tempr=a*10+b; if(tempr>35) led_yellow=0; else led_yellow=1; } void main() { uchar tl=0,th=0; while(1) { Init(); Write(0xcC); Write(0x44); // 启动温度转换delay(10); Init(); Write(0xcC); Write(0xBE); //读取温度寄存器等 delay(10); tl=Read(); //读取温度值低位 th=Read(); //读取温度值高位 temp=th<<8; temp|=tl; display(temp); } }下载本文