#include<reg52.h> //包括头文件。普通情况不须要修改。头文件包括特殊功能寄存器的定义 #define uchar unsigned char #define uint unsigned int sbit LED0=P1^0;//定义按键位置 sbit LED1=P1^1; sbit RELAY = P1^2; //定义继电器位置 code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管 0-9 uchar smg[4]; //定义缓冲区 void init_ds18b20(void) ; //DS18B20初始化 void ds18b20write_byte(uchar dat); //DS18B20写字节 uchar ds18b20read_byte(void); //DS18B20读字节 uchar readtemperature(void) ; //DS18B20读取温度 void delay(unsigned int i); sbit DQ=P3^7; //ds18b20 port void delayds18b20(uint t) { while(t--); } void delay(unsigned int cnt) { while(--cnt); } void display(int b,int a) //位分离 { smg[0]=tab[a/10]; smg[1]=tab[a%10]; smg[2]=tab[b/10]; smg[3]=tab[b%10]; } /*------------------------------------------------ 键盘扫描程序 ------------------------------------------------*/ uchar keyscan(void) //键盘扫描函数,使用行列反转扫描法 { uchar cord_h,cord_l;//行列值中间变量 P3=0xf0; //行线输出全为0 P1=0xff; cord_h=P3&0xf0; //读入列线值 if(cord_h!=0x0f) //先检測有无按键按下 { delay(100); //去抖 if(cord_h!=0x0f) { cord_h=P3&0xf0; //读入列线值 P3=cord_h|0x0f; //输出当前列线值 cord_l=P3&0x0f; //读入行线值 return(cord_h+cord_l);//键盘最后组合码值 } } } void main() { uint key,i,a=0,b=0; RELAY=0; init_ds18b20() 。 key=keyscan(); //调用键盘扫描。 for(i=0;i<4;i++) //显示函数 { display(a,b); P0=smg[i]; P2=i; delay(100); } if(key==0xe7) while(1) { b=readtemperature(); delay(100); key=keyscan(); switch(key) { case 0x7e:a=0;break;//0 按下相应的键显示相相应的码值 case 0xbe:a=40;break; case 0xde:a=45;break; case 0xee:a=55;break; case 0x7d:a=65;break; case 0xbd:a=75;break; case 0xdd:a=85;break; case 0xed:a=95;break; } display(b,a); for(i=0;i<4;i++) //显示函数 { P0=smg[i]; P2=i; delay(100); } if(a>b) //温度推断 { RELAY=1; //继电器吸和 LED0=0; } else { RELAY=0; //继电器断开 LED1=0; } } } void init_ds18b20(void) // 初始化 { uchar n; DQ=1; //DQ复位 delayds18b20(8); DQ=0; delayds18b20(80); //精确延时 大于 480us DQ=1; delayds18b20(10); n=DQ; delayds18b20(5); } void ds18b20write_byte(uchar dat) // 写一个字节 { uchar i; for(i=0;i<8;i++) { DQ=0; DQ=dat&0x01; delayds18b20(5); DQ=1; dat>>=1; } delayds18b20(5); } uchar ds18b20read_byte(void) //读一个字节 { uchar i,value; for(i=0;i<8;i++) { DQ=0; // 给脉冲信号 value>>=1; DQ=1; // 给脉冲信号 if(DQ) value|=0x80; delayds18b20(5); } return value; } uchar readtemperature(void) // 读取温度 { uchar a,b; init_ds18b20(); ds18b20write_byte(0xcc); //跳过ROM ds18b20write_byte(0x44); //启动温度測量 delayds18b20(200); init_ds18b20(); ds18b20write_byte(0xcc); ds18b20write_byte(0xbe); a=ds18b20read_byte(); //低位 b=ds18b20read_byte(); //高位 b<<=4; b+=(a&0xf0)>>4; return b; }
时间: 2024-10-05 05:11:25