#include "reg51.h" #include <intrins.h> //引用标准库 #define uint unsigned int #define uchar unsigned char //宏定义 sbit SET=P3^1; //定义调整键 sbit DEC=P3^2; //定义减少键 sbit ADD=P3^3; //定义增加键 sbit BEEP=P3^7; //定义蜂鸣器 bit shanshuo_st; //闪烁间隔标志 bit beep_st; //蜂鸣器间隔标志 sbit DIAN = P0^7; //小数点 sbit DQ=P3^6; //DS18B20通信端口 uchar x=0; //计数器 signed char m; //温度值全局变量 uchar n; //温度值全局变量 uchar set_st=0; //状态标志 signed char Th=38; //上限报警温度,默认值为38 signed char Tl=5; //下限报警温度,默认值为38 uchar code LEDData[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xFF,0x00}; //定义数据表 /*****延时子程序*****/ void Delay(uint num) { while( --num ); } /*****初始化定时器0*****/ void InitTimer(void) { TMOD=0x01; //设置定时器0 TH0=0x3c; //定时时间0.1s TL0=0xb0; //50ms(晶振12M) } /*****定时器0中断服务程序*****/ void timer0(void) interrupt 1 { TH0=0x3c; TL0=0xb0; x++; } /*****外部中断0服务程序*****/ void int0(void) interrupt 0 {
EX0=0; //关外部中断0 if(DEC==0&&set_st==1) // { Th--; if(Th<Tl)Th=Tl; } else if(DEC==0&&set_st==2) // { Tl--; if(Tl<0)Tl=0; } } /*****外部中断1服务程序*****/ void int1(void) interrupt 2 { EX1=0; //关外部中断1 if(ADD==0&&set_st==1) { Th++; if(Th>99)Th=99; } else if(ADD==0&&set_st==2)
{ Tl++; if(Tl>Th)Tl=Th; } } /*****延时子程序*****/ void Delay_DS18B20(int num) { while(num--) ; } /*****读一个字节*****/ unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; Delay_DS18B20(4); } return(dat); } /*****写一个字节*****/ void WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; Delay_DS18B20(5); DQ = 1; dat>>=1; } } /*****初始化DS18B20*****/ void Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ复位 Delay_DS18B20(8); //稍做延时 DQ = 0; //单片机将DQ拉低 Delay_DS18B20(80); //xx延时,大于480us DQ = 1; //拉高总线 Delay_DS18B20(14); x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败 Delay_DS18B20(20); } 程序太长 下边评论补充
|