#include #include typedef unsigned char uchar; typedef unsigned int uint; #define uint unsigned int #define uchar unsigned char sbit DS=P3^6; //DS18B20接入口 sbit P10=P1^0; //键盘第一行 sbit P11=P1^1; //键盘第二行 sbit P12=P1^2; //键盘第三行 sbit P13=P1^3; //键盘第四行 sbit P30=P3^1; //加热装置 sbit beep=P3^0; //报警装置 sbit P35=P3^7; uint shang,xia,count=0,settemp=0; uchar bai,shi,ge,fen; uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delay(uint num) //延时函数子程序 { while(num--); } Init_DS18B20(void) //初始化DS18B20 { uchar x=0; DS=1; //总线复位 delay(10); DS=0; delay(10); DS=1; delay(20); x=DS; delay(10); return (x); } ReadOneChar(void) { uchar i=0,dat=0; for(i=8;i>0;i--) { //拉低总线 //拉高总线 //X=0初始化成功,X=1失败 //读一个字节 DS=0; //发脉冲信号 dat>>=1; DS=1; //发脉冲信号 if(DS==1) dat|=0x80; delay(8); } return(dat); } WriteOneChar(unsigned char dat) { unsigned char i=0; for(i=8;i>0;i--) //写一个字节 { DS=0; DS=dat&0x01; delay(10); DS=1; dat>>=1; } } uint ReadTemperature(void) //读取温度 { unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt=0; Init_DS18B20(); //读取温度 WriteOneChar(0xcc); WriteOneChar(0x44); Init_DS18B20(); WriteOneChar(0xcc); WriteOneChar(0xbe); a=ReadOneChar(); b=ReadOneChar(); t=b; t<<=8; t=t|a; tt=t*0.0625; //跳过读序号列号的操作 //启动温度转换 //跳过读序号列号的操作 //读取温度寄存器 //读取低八位 //读取高八位 t=tt*10+0.5; return(t); } void Xianzhen(uint aa) { P0=0x00; P2=0xfb; P0=0x80; delay(250); P0=0x00; P2=0xfe; bai=aa/1000; P0=table[bai]; //放大10倍输出并四舍五入 //显示真实的温度 //小数点 //显示百位数 delay(250); P0=0x00; P2=0xfd; shi=aa/100%10; P0=table[shi]; delay(250); P0=0x00; P2=0xfb; ge=aa/10%10; P0=table[ge]; delay(250); P0=0x00; P2=0xf7; //显示十位数 //显示个位数 fen=aa/10; P0=table[fen]; //显示分位数 delay(250); } void Delay() //延时程序 { unsigned char i,j; for(;i>0;i--) for(j=0;j<125;j++); } void buzzer(uint aa,uint bb,uint cc) //蜂鸣器 { if(aa>bb|aa beep=1; //报警 delay(50); } else beep=0; //停止报警 } void control(uint kk,yy) //加热系统 { if(kk>yy) //实际值大于设定值 P30=0; //停止加热 else P30=1; //加热 } uint Saomiao() //键盘扫描 { uchar tmp,num; P1=0xff; //P1口输出高电平 P10=0; // 扫描第一行 tmp=P1; //读取P1口状态 tmp&=0xf0; //读取tmp状态 if(tmp!=0xf0) //判断是否有键按下 { delay(10); tmp=P1; //读取P1口状态 tmp&=0xf0; //读取tmp状态 if(tmp!=0xf0) //再判断是否有键按下 { tmp=P1; //有键按下,读P1口状态 tmp&=0xf0; //读取按下时的数据 switch(tmp) //确定键值 { case 0xe0:num=0;break; case 0xd0:num=1;break; case 0xb0:num=2;break; case 0x70:num=3;break; } while(tmp!=0xf0) //等待按键释放 { tmp=P1; //未释放读取P1口状态 tmp&=0xf0; //提供判断数据 } } } P1=0xff; P11=0; tmp=P1; tmp&=0xf0; if(tmp!=0xf0) { delay(10); tmp=P1; tmp&=0xf0; if(tmp!=0xf0) { tmp=P1; tmp&=0xf0; switch(tmp) { case 0xe0:num=4;break; case 0xd0:num=5;break; case 0xb0:num=6;break; case 0x70:num=7;break; } while(tmp!=0xf0) { tmp=P1; tmp&=0xf0; } } } P1=0xff; P12=0; tmp=P1; tmp&=0xf0; if(tmp!=0xf0) { delay(10); tmp=P1; tmp&=0xf0; if(tmp!=0xf0) { tmp=P1; tmp&=0xf0; switch(tmp) { case 0xe0:num=8;break; case 0xd0:num=9;break; case 0xb0:num=10;break; case 0x70:num=11;break; } while(tmp!=0xf0) { tmp=P1; tmp&=0xf0; } } } P1=0xff; P13=0; tmp=P1; tmp&=0xf0; if(tmp!=0xf0) { delay(10); tmp=P1; tmp&=0xf0; if(tmp!=0xf0) { tmp=P1; tmp&=0xf0; switch(tmp) { case 0xe0:num=12;break; case 0xd0:num=13;break; case 0xb0:num=14;break; case 0x70:num=15;break; } while(tmp!=0xf0) { tmp=P1; tmp&=0xf0; } } } return num; } void Xianshi(uint A) { uint ge,shi,bai; //数码显示 P2=0xff; bai=A%1000/100; P0=table[bai]; P2=0xfd; delay(5); P2=0xff; bai=A%100/100; P0=table[shi]; P2=0xfb; delay(5); P2=0xff; bai=A%10; P0=table[ge]; P2=0xf7; delay(5); P2=0xff; } void Zhongduan() // 中断 { EA=1; EX0=1; IT0=0; } void main(void) { uint gettemp,settempten; Zhongduan(); while(1) { gettemp=ReadTemperature(); settempten=gettemp*10; shang=settempten+10; xia=settempten-10; if(P35==1) { count=Saomiao(); Xianshi(settemp); } else Xianzhen(gettemp); control(gettemp,settempten); buzzer(gettemp,shang,xia); } } void Init0() interrupt 0 { count=Saomiao(); settemp=settemp*10+count; if(settemp>125) { settemp=settemp%10; }; } 因篇幅问题不能全部显示,请点此查看更多更全内容