单片机源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #include <absacc.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define BUSY 0x80
- void Delay(uint);
- void init_LCD();
- void LCD_Com(uchar,uchar);
- void LCD_Data(uchar);
- void ReadyLCD();
- void Display_char(uchar X,uchar Y,uchar Data);
- void Display_str(uchar,uchar,uchar code *Data);
- void LCDDisplay();
- void init_18B20();
- uchar Read_18B20();
- void Write_18B20(uchar dat);
- void Read_temp1();
- void Delay_us(uchar i);
- void Key_scan( );
- void Key_set( );
- void Key_inc( );
- void Key_dec( );
- void Alarm( );
- sbit relay=P3^3;
- sbit triac1=P3^0;
- sbit triac2=P3^1;
- sbit triac3=P3^2;
- sbit LCD_RS=P2^0;
- sbit LCD_RW=P2^1;
- sbit LCD_EN=P2^2;
- sbit DQ=P1^7;
- sbit Normal=P2^4;
- sbit Alarm_B=P2^5;
- sbit Alarm_R=P2^6;
- sbit Alarm_BEEP=P2^7;
- uchar Set_flag=0;
- uchar Temp_set1,Temp_set2; //用于存放读到的值
- uchar temp,temp1,temp2;
- extern uchar code str0[]={"C : D : "}; //显示设置1
- extern uchar code str1[]={"Mode: DC: "}; //显示设置2
- extern uchar code str2[]={" Hellow!! "};
- extern uchar code str3[]={"0123456789"};
- extern uchar code mode[]={"NCD"};
- bit ON_OFF=0;
- bit outflag;
- bit write=0;
- void main() //主程序
- {
- P1=0xff;
- P2|=0x70;
- P2&=0x7f;
- Temp_set1=40; //设置温度40
- Temp_set2=1; //设置档位1
- Delay(500); //延时500ms
- init_LCD(); //LCD初始化
- init_18B20(); //DS18B20初始化
- Display_str(0,0,str2); //开机界面
- Display_str(0,1,str2); //开机界面
- Delay(2000); //延迟
- Display_str(0,0,str0); //显示设置str0
- Display_str(0,1,str1); //显示设置str1
- while(1)
- {
- Key_scan(); //扫描键盘
- Read_temp1(); //读取温度
-
- LCDDisplay(); //显示
- Alarm(); //指示灯与报警程序
- Delay(1000); //延迟
- }
- }
- /********延时kms********/
- void Delay(uint k)
- {
- uint i,j;
- for(i=0;i<k;i++)
- {
- for(j=0;j<60;j++)
- {
- ;
- }
- }
- }
- /********精确延时********/
- void Delay_us(uchar i)
- {
- while(--i);
- }
- /********显示模块********/
- /********LCD初始化********/
- void init_LCD()
- {
- P0=0;
- Delay(15);
- LCD_Com(0x38,0);
- Delay(5);
- LCD_Com(0x38,0);
- Delay(5);
- LCD_Com(0x38,0);
- Delay(5);
- LCD_Com(0x38,1); //8位数据传送,2行显示,5*7字形
- LCD_Com(0x08,1); //关闭显示
- LCD_Com(0x01,1); //清屏
- LCD_Com(0x06,1); //显示光标右移设置
- LCD_Com(0x0c,1); //显示屏打开,光标不显示不闪烁
- }
- /********写指令数据到LCD********/
- void LCD_Com(uchar LC,uchar BC)
- {
- if(BC) ReadyLCD();
- P0=LC;
- LCD_RS=0; //选中指令寄存器
- LCD_RW=0; //写模式
- LCD_EN=1;
- _nop_();
- _nop_();
- _nop_();
- LCD_EN=0;
- }
- /********写显示数据到LCD********/
- void LCD_Data(uchar LD)
- {
- ReadyLCD();
- P0=LD;
- LCD_RS=1; //选中数据寄存器
- LCD_RW=0; //写模式
- LCD_EN=1;
- _nop_();
- _nop_();
- _nop_();
- LCD_EN=0;
- }
- /********检测LCD忙状态********/
- void ReadyLCD()
- {
- P0=0xff;
- LCD_RS=0;
- LCD_RW=1;
- LCD_EN=1;
- _nop_();
- while(P0&BUSY)
- {
- LCD_EN=0;
- _nop_();
- _nop_();
- LCD_EN=1;
- _nop_();
- _nop_();
- }
- LCD_EN=0;
- }
- /********显示一个字符********/
- void Display_char(uchar X,uchar Y,uchar Data)
- {
- Y&=1;
- X&=15;
- if(Y) X|=0x40;
- X|=0x80;
- LCD_Com(X,0);
- LCD_Data(Data);
- }
- /********显示一串字符********/
- void Display_str(uchar X,uchar Y,uchar code *Data)
- {
- uchar List=0;
- Y&=0x01;
- X&=0x0f;
- while(X<16)
- {
- Display_char(X,Y,Data[List]);
- List++;
- X++;
- }
- }
- /********温度测量模块********/
- /********DS18B20初始化********/
- void init_18B20()
- {
- uchar x=0;
- DQ=1; //DQ复位
- Delay_us(8); //延时
- DQ=0; //将DQ拉低
- Delay_us(480); //精确延时大于480us
- DQ=1; //拉高总线
- Delay_us(15);
- x=DQ;
- Delay_us(20);
- }
- /********从DS18B20读取一个字节数据********/
- uchar Read_18B20()
- {
- uchar i=0;
- uchar dat=0;
- for(i=8;i>0;i--)
- {
- DQ=0;
- dat>>=1;
- DQ=1;
- Delay_us(1);
- if(DQ)
- dat|=0x80;
- Delay_us(10);
- }
- return(dat);
- }
- /********向DS18B20写入一个字节数据********/
- void Write_18B20(uchar dat)
- {
- uchar i=0;
- for(i=8;i>0;i--)
- {
- DQ=0;
- _nop_();
- DQ=dat&0x01;
- Delay_us(10);
- DQ=1;
- dat>>=1;
- Delay_us(10);
- }
- }
- /********从DS18B20读取温度********/
- void Read_temp1()
- {
- uchar a=0;
- uchar b=0;
- uchar t=0;
- init_18B20();
- Write_18B20(0xcc); //写跳过读ROM指令
- Write_18B20(0x44); //写跳过读ROM指令
- Delay_us(100);
- init_18B20();
- Write_18B20(0xcc);
- Write_18B20(0xbe);
- a=Read_18B20();
- b=Read_18B20();
- Delay_us(100);
- t=b;
- t<<=8;
- t=t|a;
- temp=t*(0.625); //温度值扩大10倍
- }
- /********显示子程序********/
- void LCDDisplay()
- { LCD_Com(0x0c,1);
- Display_str(0,0,str0);
- Display_str(0,1,str1);
- Display_char(5,0,str3[Temp_set1/10]);
- Display_char(6,0,str3[Temp_set1%10]);
- Display_char(13,0,str3[Temp_set2/10]);
- Display_char(14,0,str3[Temp_set2%10]);
- Display_char(5,1,mode[Set_flag]);
- Display_char(13,1,str3[temp%1000/100]);
- Display_char(14,1,str3[temp%100/10]);
- }
- /********键盘扫描程序********/
- void Key_scan( )
- {
- P1=0xff;
- if(P1!=0xff)
- {
- Delay(20); //延时消抖
- if(P1!=0xff)
- {
-
- switch(P1)
- {
- case 0xfe:Key_set();break; //P1.0按下,功能选择
- case 0xfd:Key_inc();break; //P1.1按下,数字加一
- case 0xfb:Key_dec();break; //P1.2按下,数字减一
- default:break;
- }
- }
- }
- }
- /********工作模式子程序********/
- void Key_set( )
- {
- Set_flag++;
- if(Set_flag>=3) //设定温度值
- Set_flag=0; //设定档位值
- }
- /********按键加一子程序********/
- void Key_inc( )
- {
- switch(Set_flag)
- {
- case 1:Temp_set1++;
- if(Temp_set1>=99) Temp_set1=99;break;
- case 2:Temp_set2++;
- if(Temp_set2>=Temp_set1) Temp_set2=Temp_set1;break;
- default:break;
- }
- }
- /********按键减一子程序********/
- void Key_dec( )
- {
-
- switch(Set_flag)
- {
- case 1:Temp_set1--;
- if(Temp_set1<=Temp_set2) Temp_set1=Temp_set2;break;
- case 2:Temp_set2--;
- if(Temp_set2<=1) Temp_set2=1;break;
- default:break;
- }
- }
- /********报警和指示程序********/
- void Alarm( )
- {
- uchar C;
- C=Temp_set1+5;
-
- if(temp>C)
- {
- Normal=1;
- Alarm_B=0;
- Alarm_R=1;
- Alarm_BEEP=1;
- }
- else
- {
- Normal=1;
- Alarm_B=1;
- Alarm_R=0;
- Alarm_BEEP=0;
- }
- }
复制代码
|