}
void write_byte(char val) //向 1-WIRE 总线上写一个字节 {
byte i;
for (i=8; i>0; i--) // 写一个字节,每次写一位 {
DQ = 0; DQ = val&0x01; delay(5); DQ = 1;
val=val/2; //用除法实现移位 } delay(5); }
char Read_Temperature(void) //读取温度 {
byte temp[2]; float x;
ow_reset(); //复位DS18B20 write_byte(0xCC); //跳过 ROM
write_byte(0xBE); //写入读存储器指令 temp[1]=read_byte(); //读入数据 temp[0]=read_byte();
x= temp[1]*0x112 + temp[0];
x= x*0.0625; //将数值转换为摄氏温度
return x; }
4.2.4 系统的程序源代码
系统的C51 源程序如下:
#include
sbit DQ =P1^0; //DS18B20端口
sbit HUP=P1^1; //最高温度增键 sbit HDOWN=P1^2; //最高温度减键 sbit LUP=P1^3; //最低温度增建 sbit LDOWN=P1^4; //最低温度减键
sbit BAOJING=P1^5; //报警输出 sbit OUT=P1^6; //控制加热棒
sbit LED1=P2^5; //第一位数码管位控制端
sbit LED2=P2^4; //第二位数码管位控制端 sbit LED3=P2^3; //第三位数码管位控制端 sbit LED4=P2^2; //第四位数码管位控制端 sbit LED5=P2^1; //第五位数码管位控制端 sbit LED6=P2^0; //第六位数码管位控制端
unsigned char code tab_LED[10]={0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0xF8,0x80,0x90};
//显示的段码,分别代表0-9
typedef unsigned char byte; typedef unsigned int word;
//****************************18b20驱动程序*********************************
void delay(word useconds) //延时子函数 {
for(;useconds>0;useconds--); }
byte ow_reset(void) //复位DS18B20 {
byte presence;
DQ = 0; //送出低电平 delay(29); // 延时 480us DQ = 1; // 送出高电平
delay(3); // 等到DS18B20存在脉冲 presence = DQ; // 读存在脉冲(低电平有效) delay(25); //延时 return(presence); }
byte read_byte(void) //从 1-wire 总线上读取一个字节 {
byte i;
byte value = 0; for (i=8;i>0;i--) {
value>>=1;
DQ = 0; // 输出一脉冲 DQ = 1; delay(1); if(DQ)
value|=0x80; delay(6); }
return(value); }
void write_byte(char val) //向 1-WIRE 总线上写一个字节 {
byte i;
for (i=8; i>0; i--) // 写一个字节,每次写一位 {
DQ = 0; DQ = val&0x01; delay(5); DQ = 1;
val=val/2; //用除法实现移位 }
delay(5); }
//************** Read_Temperature完成一次采样过程,返回温度值*****************
char Read_Temperature(void) //读取温度 {
byte temp[2]; float x;
ow_reset(); //复位DS18B20 write_byte(0xCC); //跳过 ROM
write_byte(0xBE); //写入读存储器指令 temp[1]=read_byte(); //读入数据 temp[0]=read_byte();
x= temp[1]*0x112 + temp[0];
x= x*0.0625; //将数值转换为摄氏温度
return x; }
//****************************主函数****************************************** main() {
byte n=20,h=50,l=30; //定义温度值、高低限,并置初值 byte i;
BAOJING=0; //初始化 OUT=0; LED1=1; LED2=1; LED3=1; LED4=1; LED5=1; LED6=1;
while(1) {
if(HUP==0) //如果温度高限增加键按下 {
delay(10000); //按键消抖 if(HUP==0) h++; }
else if(HDOWN==0) //如果温度高限减小键按下 {
delay(10000); //按键消抖 if(HDOWN==0) h--; }
else if(LUP==0) //如果温度低限增加键按下 {
delay(10000); //按键消抖 if(LUP==0) l++; }
else if(LDOWN==0) //如果温度低限减小键按下 {
delay(10000); // if(LDOWN==0) l--; }
else //
{ n=Read_Temperature(); // if (n>h+3)
{BAOJING=1; // OUT=0;} else if(n OUT=1; // } i=h/10; // P0=tab_LED[i]; // LED1=0; // delay(1000); // LED1=1; i=h; // P0=tab_LED[i]; // LED2=0; // delay(1000); // LED2=1; i=l/10; // P0=tab_LED[i]; // LED3=0; // delay(1000); // LED3=1; i=l; // P0=tab_LED[i]; // LED4=0; // delay(1000); // LED4=1; i=n/10; //按键消抖 如果没有按键按下 读取温度值 报警并停止加热 启动加热 取第一位显示数据 查显示段码表,将第一位段码送P0口选中第一位 调用延时 取第二位显示数据 查显示段码表,将第二位段码送P0口选中第二位 调用延时 取第三位显示数据 查显示段码表,将第三位段码送P0口选中第三位 调用延时 取第四位显示数据 查显示段码表,将第四位段码送P0口 选中第四位 调用延时 取第五位显示数据 P0=tab_LED[i]; //查显示段码表,将第五位段码送P0口 LED5=0; //选中第五位 delay(1000); //调用延时 LED5=1; i=n; //取第六位显示数据 P0=tab_LED[i]; //查显示段码表,将第六位段码送P0口 LED6=0; //选中第六位 delay(1000); //调用延时 LED6=1; } } //************************主程序结束********************************