- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar time_data[7];
- uchar code write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80}; //数据的地址
- uchar code read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
- uchar code table1[]="S:000 2000/00/00";
- uchar code table2[]="N:000 00:00:00 0";
- uchar code table3[]=" "; //清屏内容
- uchar code table4[]=" Set Real Time ";
- uchar code table5[]=" Set Heat Time ";
- uchar code table6[]=" Start Time: ";
- uchar code table7[]=" 00:00:00 ";
- uchar code table8[]=" End Time: ";
- uchar code table9[]=" Set Water Temp";
- uchar code table10[]="Temperature: ";
- uchar code table11[]=" 000C";
- bit Adjust; //调节标志位,=1表示进入调节模式,=0是正常模式
- bit Timer; //定时模式标志位,=1表示进入定时开启模式,=0是光线开启模式
- sbit rs=P1^0; //LCD1602
- sbit rw=P1^1; //LCD1602
- sbit e=P1^2; //LCD1602
- sbit sck=P3^2; //时钟端口
- sbit io=P3^3; //时钟端口
- sbit rst=P3^4; //时钟端口
- sbit SELT =P1^3; //选择键
- sbit ENTER=P1^4; //确认键
- sbit UP =P1^5; //加键
- sbit DOWN =P1^6; //减键
- sbit CLEAN_LED=P3^7; //清洗灯接口
- sbit CHECK=P3^6; //水位检测灯接口
- sbit HEAT =P3^5; //加热灯端口
- sbit JDQ =P2^7; //继电器接口
- sbit BEEP =P2^6; //蜂鸣器接口
- sbit DQ =P2^0; //温度检测端口
- sbit WATER=P2^1; //水位传感器接口
- sbit CLOSED=P2^2; //红外检测接口
- sbit PUMP=P2^3; //水泵接口
- sbit ADD =P2^5; //加水接口
- sbit CLEAN=P2^4; //清洗接口
- int temperature; //全局变量 温度
- int temp_set=100; //设定温度 默认100
- uchar Select_num; //选择按键按下次数
- uchar Enter_num; //确认按键按下次数
- float Year,Month,Day,Hour,Minute,Second,Week; //时间设置值
- float Hour_H,Minute_H,Second_H; //设置开始时间
- float Hour_L,Minute_L,Second_L; //设置结束时间
- int Count; //T0中断次数
- uchar Miao; //延时时间10s
- void read_rtc();
- uchar receive;
- /*********************************************************************************************************************/
- void delay1(uint z) //延时函数
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=10;y>0;y--);
- }
- void write_com(uchar com) //写指令函数
- {
- rw=0;
- delay1(5);
- rs=0;
- delay1(5);
- e=1;
- delay1(5);
- P0=com;
- delay1(5);
- e=0;
- delay1(5);
- }
- void write_date(uchar date) //写数据函数
- {
- rw=0;
- delay1(5);
- rs=1;
- delay1(5);
- e=1;
- delay1(5);
- P0=date;
- delay1(5);
- e=0;
- delay1(5);
- }
- void init() //初始化函数
- {
- uchar num;
- Hour_H=23;
- Minute_H=59;
- Second_H=59;
- e=0; // 时序表e初始为0
- write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口
- write_com(0x0c); //设置光标
- write_com(0x06); //光标自动加1,光标输入方式
- write_com(0x01); //清屏
- write_com(0x80); //设置初始显示位置
- for(num=0;num<16;num++)
- {
- write_date(table1[num]);
- delay1(5);
- }
- write_com(0x80+0x40);
- for(num=0;num<16;num++)
- {
- write_date(table2[num]);
- delay1(5);
- }
- }
- void SetTime_dispaly(uchar add,uchar dat) //第一个:参数的地址,第二个:参数的内容
- {
- uchar shi,ge;
- shi=dat/10; //十位提取出来
- ge=dat%10; //个位提取出来
- write_com(add); //要写的地址
- write_date(0x30+shi); //十位的内容 1602字符库
- write_date(0x30+ge); //个位的内容 1602字符库
- }
- void Temperature_dispaly(uchar add,uchar dat) //第一个:参数的地址,第二个:参数的内容
- {
- uchar bai,shi,ge;
- bai=dat/100;
- shi=dat%100/10; //把温度的十位提取出来
- ge=dat%10; //把温度的个位提取出来
- write_com(add); //要写的地址
- write_date(0x30+bai);
- write_date(0x30+shi); //十位的内容 1602字符库
- write_date(0x30+ge); //个位的内容 1602字符库
- }
- void Date_dispaly(uchar add,uchar dat) //第一个:参数的地址,第二个:参数的内容
- {
- uchar shi,ge;
- shi=dat/16; //把温度的十位提取出来
- ge=dat%16; //把温度的个位提取出来
- write_com(add); //要写的地址
- write_date(0x30+shi); //十位的内容 1602字符库
- write_date(0x30+ge); //个位的内容 1602字符库
- }
- void Week_dispaly(uchar add,uchar dat) //第一个:参数的地址,第二个:参数的内容
- {
- write_com(add); //要写的地址
- write_date(0x30+dat); //十位的内容 1602字符库
- }
- void LCD_Clean(uchar i) //液晶屏清除显示
- {
- uchar num;
- if(i==1)
- {
- write_com(0x80); //设置初始显示位置
- for(num=0;num<16;num++) //显示第一行内容
- {
- write_date(table3[num]);
- delay1(1);
- }
- }
- if(i==2)
- {
- write_com(0x80+0x40);
- for(num=0;num<16;num++) //显示第二行内容
- {
- write_date(table3[num]);
- delay1(1);
- }
- }
- }
- void LCD_Display_String(unsigned char line,unsigned char *string)
- { //液晶屏显示内容,把要显示的内容写到对应的位置
- unsigned char i;
- unsigned char address=0;
- if(line==1)
- {
- address=0x80; //0X80是第1行的第1个位置 ,0x81第2位
- }
- else if(line==2)
- {
- address=0x80+0x40; //0X80+0x40是第2行的第1个位置 ,0X80+0x40+1是第2行第2位
- }
-
- for(i=0;i<16;i++)
- {
- write_com(address);
- write_date(string[i]);
- address++;
- }
- }
- void Time_Display(void)
- {
- read_rtc();
- Date_dispaly(0x80+0x40+12,time_data[6]); //显示秒
- Date_dispaly(0x80+0x40+9,time_data[5]); //显示分
- Date_dispaly(0x80+0x40+6,time_data[4]); //显示时
- Date_dispaly(0x80+14,time_data[3]); //显示日
- Date_dispaly(0x80+11,time_data[2]); //显示月
- Week_dispaly(0x80+0x40+15,time_data[1]); //显示周
- Date_dispaly(0x80+8,time_data[0]); //显示年
- // Year/10*16+Year%10
- Year=time_data[0]/16*10+time_data[0]%16;
- Week=time_data[1]/16*10+time_data[1]%16;
- Month=time_data[2]/16*10+time_data[2]%16;
- Day=time_data[3]/16*10+time_data[3]%16;
- Hour=time_data[4]/16*10+time_data[4]%16;
- Minute=time_data[5]/16*10+time_data[5]%16;
- Second=time_data[6]/16*10+time_data[6]%16;
- }
- void write_ds1302_byte(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- sck=0;
- io=dat&0x01; //准备数据,从最低位开始
- dat=dat>>1;
- sck=1;
- }
- }
- void write_ds1302(uchar add,uchar dat)
- {
- rst=0;
- _nop_(); //CPU原地踏步
- sck=0;
- _nop_();
- rst=1;
- _nop_();
- write_ds1302_byte(add); //传地址
- write_ds1302_byte(dat); //传数据
- rst=0; //不受其他影响
- _nop_();
- io=1; //释放
- sck=1;
- }
- uchar read_ds1302(uchar add)
- {
- uchar i,value;
- rst=0;
- _nop_(); //CPU原地踏步
- sck=0;
- _nop_();
- rst=1;
- _nop_();
- write_ds1302_byte(add);
- for(i=0;i<8;i++)
- {
- value=value>>1;
- sck=0;
- if(io)
- value=value|0x80;
- sck=1;
- }
- rst=0;
- _nop_();
- sck=0;
- _nop_();
- sck=1;
- io=1;
- return value;
- }
- void set_rtc() //设置时间
- {
- uchar i,j;
- for(i=0;i<7;i++) //转换BCD码
- {
- j=time_data[i]/10;
- time_data[i]=time_data[i]%10;
- time_data[i]=time_data[i]+j*16;
- }
- write_ds1302(0x8e,0x00); //去除写保护
- for(i=0;i<7;i++)
- {
- write_ds1302(write_add[i],time_data[i]);
- }
- write_ds1302(0x8e,0x80); //加写保护
- }
- void read_rtc()
- {
- uchar i;
- for(i=0;i<7;i++)
- {
- time_data[i]=read_ds1302(read_add[i]); //最终读出来的数 16进制
- }
- }
- /*************************************************按键****************************************************************/
- void Keyscan(void)
- {
- if(SELT==0)
- {
- delay1(2);
- if(SELT==0)
- {
- while(!SELT);
- Select_num++; //选择键按下一次
- Adjust=1; //进入调节模式
- }
- if(Select_num==1)
- {
- LCD_Clean(1);
- LCD_Clean(2);
- LCD_Display_String(1,table4);
- LCD_Display_String(2,table5);
- write_com(0x80+0); //写 >>
- write_date(0x3e);
- write_com(0x80+1); //写 >>
- write_date(0x3e);
- Enter_num=0;
- }
- if(Select_num==2)
- {
- LCD_Clean(1);
- LCD_Clean(2);
- LCD_Display_String(1,table4);
- LCD_Display_String(2,table5);
- write_com(0x80+0x40+0); //写 >>
- write_date(0x3e);
- write_com(0x80+0x40+1); //写 >>
- write_date(0x3e);
- Enter_num=0;
- }
- if(Select_num==3)
- {
- LCD_Clean(1);
- LCD_Clean(2);
- LCD_Display_String(1,table9);
- LCD_Display_String(2,table3);
- write_com(0x80+0); //写 >>
- write_date(0x3e);
- write_com(0x80+1); //写 >>
- write_date(0x3e);
- Enter_num=0;
- }
- if(Select_num==4)
- {
- LCD_Clean(1);
- LCD_Clean(2);
- LCD_Display_String(1,table1);
- LCD_Display_String(2,table2);
- Select_num=0;
- Enter_num=0;
- Adjust=0;
- }
- write_com(0x0c); //光标不再闪烁
- Enter_num=0;
- }
-
- if(ENTER==0)
- {
- delay1(2);
- if(ENTER==0)
- {
- while(!ENTER);
- Enter_num++;
- }
- if(Select_num==1) //设置实时时间
- {
- if(Enter_num==1)
- {
- LCD_Clean(1);
- LCD_Clean(2);
- LCD_Display_String(1,table1);
- LCD_Display_String(2,table2);
- SetTime_dispaly(0x80+8,Year);
- SetTime_dispaly(0x80+11,Month);
- SetTime_dispaly(0x80+14,Day);
- SetTime_dispaly(0x80+0x40+6,Hour);
- SetTime_dispaly(0x80+0x40+9,Minute);
- SetTime_dispaly(0x80+0x40+12,Second);
- Week_dispaly(0x80+0x40+15,Week);
- write_com(0x80+8); //光标闪烁地址,停留在年的位置上
- write_com(0x0f); //光标闪烁
- }
- if(Enter_num==2)
- {
- write_com(0x80+11); //光标闪烁地址,停留在月的位置上
- write_com(0x0f); //光标闪烁
- }
- if(Enter_num==3)
- {
- write_com(0x80+14); //光标闪烁地址,停留在日的位置上
- write_com(0x0f); //光标闪烁
- }
- if(Enter_num==4)
- {
- write_com(0x80+0x40+6); //光标闪烁地址,停留在时的位置上
- write_com(0x0f); //光标闪烁
- }
- if(Enter_num==5)
- {
- write_com(0x80+0x40+9); //光标闪烁地址,停留在分的位置上
- write_com(0x0f); //光标闪烁
- }
- if(Enter_num==6)
- {
- write_com(0x80+0x40+12); //光标闪烁地址,停留在秒的位置上
- write_com(0x0f); //光标闪烁
- }
- if(Enter_num==7)
- {
- write_com(0x80+0x40+15); //光标闪烁地址,停留在星期的位置上
- write_com(0x0f); //光标闪烁
- }
- if(Enter_num==8)
- {
- Enter_num=0;
- write_com(0x0c); //光标不再闪烁
- LCD_Clean(1);
- LCD_Clean(2);
- LCD_Display_String(1,table1);
- LCD_Display_String(2,table2);
- time_data[0]=Year;///10*16+Year%10;
- time_data[1]=Week;///10*16+Week%10;
- time_data[2]=Month;///10*16+Month%10;
- time_data[3]=Day;///10*16+Day%10;
- time_data[4]=Hour;///10*16+Hour%10;
- time_data[5]=Minute;///10*16+Minute%10;
- time_data[6]=Second;///10*16+Second%10;
- set_rtc(); //设置时间
- Select_num=0;
- Adjust=0;
- }
- }
- if(Select_num==2) //设置时间段
- {
- if(Enter_num==1)
- {
- LCD_Clean(1);
- LCD_Clean(2);
- LCD_Display_String(1,table6);
- LCD_Display_String(2,table7);
- SetTime_dispaly(0x80+0x40+4,Hour_L);
- SetTime_dispaly(0x80+0x40+7,Minute_L);
- SetTime_dispaly(0x80+0x40+10,Second_L);
- write_com(0x80+0x40+4); //光标闪烁地址,停留在时的位置上
- write_com(0x0f); //光标闪烁
- }
- if(Enter_num==2)
- {
- write_com(0x80+0x40+7); //光标闪烁地址,停留在分的位置上
- write_com(0x0f); //光标闪烁
- }
- if(Enter_num==3)
- {
- write_com(0x80+0x40+10); //光标闪烁地址,停留在秒的位置上
- write_com(0x0f); //光标闪烁
- }
- if(Enter_num==4)
- {
- write_com(0x0c); //光标不再闪烁
- LCD_Clean(1);
- LCD_Clean(2);
- LCD_Display_String(1,table8);
- LCD_Display_String(2,table7);
- SetTime_dispaly(0x80+0x40+4,Hour_H);
- SetTime_dispaly(0x80+0x40+7,Minute_H);
- SetTime_dispaly(0x80+0x40+10,Second_H);
- write_com(0x80+0x40+4); //光标闪烁地址,停留在时的位置上
- write_com(0x0f); //光标闪烁
- }
- if(Enter_num==5)
- {
- write_com(0x80+0x40+7); //光标闪烁地址,停留在分的位置上
- write_com(0x0f); //光标闪烁
- }
- if(Enter_num==6)
- {
- write_com(0x80+0x40+10); //光标闪烁地址,停留在秒的位置上
- write_com(0x0f); //光标闪烁
- }
- if(Enter_num==7)
- {
- Enter_num=0;
- write_com(0x0c); //光标不再闪烁
- LCD_Clean(1);
- LCD_Clean(2);
- LCD_Display_String(1,table1);
- LCD_Display_String(2,table2);
- Select_num=0;
- Adjust=0;
- }
- }
- if(Select_num==3) //设置水温
- {
- if(Enter_num==1)
- {
- LCD_Clean(1);
- LCD_Clean(2);
- LCD_Display_String(1,table10);
- LCD_Display_String(2,table11);
- Temperature_dispaly(0x80+0x40+12,temp_set);
- write_com(0x80+0x40+12); //光标闪烁地址,停留在水温的位置上
- write_com(0x0f); //光标闪烁
- }
- if(Enter_num==2)
- {
- Enter_num=0;
- write_com(0x0c); //光标不再闪烁
- LCD_Clean(1);
- LCD_Clean(2);
- LCD_Display_String(1,table1);
- LCD_Display_String(2,table2);
- Select_num=0;
- Adjust=0;
- }
- }
- }
- if(UP==0)
- {
- delay1(2);
- if(UP==0)
- {
- while(!UP);
- if(Select_num==1)
- {
- if(Enter_num==1)
- {
- Year++;
- if(Year>99)
- Year=0;
- SetTime_dispaly(0x80+8,Year);
- write_com(0x80+8);
- write_com(0x0f);
- }
- if(Enter_num==2)
- {
- Month++;
- if(Month>12)
- Month=1;
- SetTime_dispaly(0x80+11,Month);
- write_com(0x80+11);
- write_com(0x0f);
- }
- if(Enter_num==3)
- {
- Day++;
- if(Day>31)
- Day=1;
- SetTime_dispaly(0x80+14,Day);
- write_com(0x80+14);
- write_com(0x0f);
- }
- if(Enter_num==4)
- {
- Hour++;
- if(Hour>23)
- Hour=0;
- SetTime_dispaly(0x80+0x40+6,Hour);
- write_com(0x80+0x40+6);
- write_com(0x0f);
- }
- if(Enter_num==5)
- {
- Minute++;
- if(Minute>59)
- Minute=0;
- SetTime_dispaly(0x80+0x40+9,Minute);
- write_com(0x80+0x40+9);
- write_com(0x0f);
- }
- if(Enter_num==6)
- {
- Second++;
- if(Second>59)
- Second=0;
- SetTime_dispaly(0x80+0x40+12,Second);
- write_com(0x80+0x40+12);
- write_com(0x0f);
- }
- if(Enter_num==7)
- {
- Week++;
- if(Week>7)
- Week=1;
- Week_dispaly(0x80+0x40+15,Week);
- write_com(0x80+0x40+15);
- write_com(0x0f);
- }
- }
- if(Select_num==2)
- {
- if(Enter_num==1)
- {
- Hour_L++;
- if(Hour_L>23)
- Hour_L=0;
- SetTime_dispaly(0x80+0x40+4,Hour_L);
- write_com(0x80+0x40+4);
- write_com(0x0f);
- }
- if(Enter_num==2)
- {
- Minute_L++;
- if(Minute_L>59)
- Minute_L=0;
- SetTime_dispaly(0x80+0x40+7,Minute_L);
- write_com(0x80+0x40+7);
- write_com(0x0f);
- }
-
- if(Enter_num==3)
- {
- Second_L++;
- if(Second_L>59)
- Second_L=0;
- SetTime_dispaly(0x80+0x40+10,Second_L);
- write_com(0x80+0x40+10);
- write_com(0x0f);
- }
- if(Enter_num==4)
- {
- Hour_H++;
- if(Hour_H>23)
- Hour_H=0;
- SetTime_dispaly(0x80+0x40+4,Hour_H);
- write_com(0x80+0x40+4);
- write_com(0x0f);
- }
- if(Enter_num==5)
- {
- Minute_H++;
- if(Minute_H>59)
- Minute_H=0;
- SetTime_dispaly(0x80+0x40+7,Minute_H);
- write_com(0x80+0x40+7);
- write_com(0x0f);
- }
-
- if(Enter_num==6)
- {
- Second_H++;
- if(Second_H>59)
- Second_H=0;
- SetTime_dispaly(0x80+0x40+10,Second_H);
- write_com(0x80+0x40+10);
- write_com(0x0f);
- }
- }
- if(Select_num==3)
- {
- if(Enter_num==1)
- {
- temp_set++;
- if(temp_set>100) //最高100度
- temp_set=0;
- Temperature_dispaly(0x80+0x40+12,temp_set);
- write_com(0x80+0x40+12);
- write_com(0x0f);
- }
- }
- }
- }
- if(DOWN==0)
- {
- delay1(2);
- if(DOWN==0)
- {
- while(!DOWN);
- if(Select_num==1)
- {
- if(Enter_num==1)
- {
- Year--;
- if(Year<0)
- Year=99;
- SetTime_dispaly(0x80+8,Year);
- write_com(0x80+8);
- write_com(0x0f);
- }
- if(Enter_num==2)
- {
- Month--;
- if(Month<1)
- Month=12;
- SetTime_dispaly(0x80+11,Month);
- write_com(0x80+11);
- write_com(0x0f);
- }
- if(Enter_num==3)
- {
- Day--;
- if(Day<1)
- Day=31;
- SetTime_dispaly(0x80+14,Day);
- write_com(0x80+14);
- write_com(0x0f);
- }
- if(Enter_num==4)
- {
- Hour--;
- if(Hour<0)
- Hour=23;
- SetTime_dispaly(0x80+0x40+6,Hour);
- write_com(0x80+0x40+6);
- write_com(0x0f);
- }
- if(Enter_num==5)
- {
- Minute--;
- if(Minute<0)
- Minute=59;
- SetTime_dispaly(0x80+0x40+9,Minute);
- write_com(0x80+0x40+9);
- write_com(0x0f);
- }
- if(Enter_num==6)
- {
- Second--;
- if(Second<0)
- Second=59;
- SetTime_dispaly(0x80+0x40+12,Second);
- write_com(0x80+0x40+12);
- write_com(0x0f);
- }
- if(Enter_num==7)
- {
- Week--;
- if(Week<1)
- Week=7;
- Week_dispaly(0x80+0x40+15,Week);
- write_com(0x80+0x40+15);
- write_com(0x0f);
- }
- }
- if(Select_num==2)
- {
- if(Enter_num==1)
- {
- Hour_L--;
- if(Hour_L<0)
- Hour_L=23;
- SetTime_dispaly(0x80+0x40+4,Hour_L);
- write_com(0x80+0x40+4);
- write_com(0x0f);
- }
- if(Enter_num==2)
- {
- Minute_L--;
- if(Minute_L<0)
- Minute_L=59;
- SetTime_dispaly(0x80+0x40+7,Minute_L);
- write_com(0x80+0x40+7);
- write_com(0x0f);
- }
- if(Enter_num==3)
- {
- Second_L--;
- if(Second_L<0)
- Second_L=59;
- SetTime_dispaly(0x80+0x40+10,Second_L);
- write_com(0x80+0x40+10);
- write_com(0x0f);
- }
-
- if(Enter_num==4)
- {
- Hour_H--;
- if(Hour_H<0)
- Hour_H=23;
- SetTime_dispaly(0x80+0x40+4,Hour_H);
- write_com(0x80+0x40+4);
- write_com(0x0f);
- }
- if(Enter_num==5)
- {
- Minute_H--;
- if(Minute_H<0)
- Minute_H=59;
- SetTime_dispaly(0x80+0x40+7,Minute_H);
- write_com(0x80+0x40+7);
- write_com(0x0f);
- }
- if(Enter_num==6)
- {
- Second_H--;
- if(Second_H<0)
- Second_H=59;
- SetTime_dispaly(0x80+0x40+10,Second_H);
- write_com(0x80+0x40+10);
- write_com(0x0f);
- }
- }
- if(Select_num==3)
- {
- if(Enter_num==1)
- {
- temp_set--;
- if(temp_set<0) //最高70度
- temp_set=100;
- Temperature_dispaly(0x80+0x40+12,temp_set);
- write_com(0x80+0x40+12);
- write_com(0x0f);
- }
- }
- }
- }
- }
- void Open(void)
- {
- float Now;
- float Set_L,Set_H;
- Now=Hour+Minute/60+Second/3600; //把实时时间化成小时为单位
- Set_L=Hour_L+Minute_L/60+Second_L/3600; //把设置下限时间化成小时为单位
- Set_H=Hour_H+Minute_H/60+Second_H/3600; //把设置上限时间化成小时为单位
- if(WATER==1) //表示有水
- {
- ADD=1; //停止加水
- BEEP=0; //关蜂鸣器
- CHECK=1; //缺水灯灭
- if(temperature<temp_set) //温度低于设置值 需要加热
- {
- if((Now>=Set_L)&(Now<=Set_H)) //实时时间在上下限时间范围内
- {
- HEAT=0; //加热
- JDQ=0; //闭合继电器
- }
- if((Now<Set_L)|(Now>Set_H)) //实时时间不在范围内
- {
- HEAT=1; //停止加热
- JDQ=1; //断开继电器
- }
- }
- else
- {
- HEAT=1; //停止加热
- JDQ=1; //断开继电器
- }
- if(CLOSED==0) //有水时 靠近开水泵出水
- PUMP=0;
- else
- PUMP=1;
- }
- else //如果缺水
- {
- CHECK=0; //缺水灯亮
- BEEP=1; //开蜂鸣器
- HEAT=1; //停止加热
- JDQ=1; //断开继电器
- ADD=0; //加水
- PUMP=1; //无水时无法出水
- }
- if((time_data[1]==2)&(Hour>=6)&(Hour<7)) //清洗功能 固定周一早上六点到七点 2表示一个星期第二天,星期一
- {
- CLEAN=0; //开启清洗电机
- CLEAN_LED=0; //开启清洗灯
- }
- else
- {
- CLEAN=1; //关闭清洗电机
- CLEAN_LED=1; //关闭清洗灯
- }
- }
- /****************************************************************************************************/
- /*void delay(uint y) //DS18B20延时函数(仿真用)
- {
- while(y--);
- }
- */
- void delay(uint z) //DS18B20延时函数(实物用)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=1;y>0;y--);
- }
- void write_byte(uint dat) //写一个字节
- {
- uchar i;
- for(i=0;i<8;i++) //循环八次 共有八位
- {
- DQ=0; //写零
- DQ=dat&0x01; //向总线写位数据,从最低位写起
- delay(4);
- DQ=1; //写一
- dat>>=1; //下次写作准备,移位数据
- }
- delay(4);
- }
- uchar read_byte(void) //读一个字节,返回值
- {
- uchar i;
- uint value;
- for(i=0;i<8;i++) //循环八次 共有八位
- {
- DQ=0;
- value>>=1;
- DQ=1; //释放总线
- if(DQ)
- value|=0x80; //DQ=1,value取1
- delay(4);
- }
- return value;
- }
- void ds18b20_init() //初始化函数
- {
- uint n;
- DQ=1;
- delay(8);
- DQ=0;
- delay(80); //低电平480——960us
- DQ=1; //总线释放
- delay(8); //等待50——100us
- n=DQ; //读取复位状态
- delay(4);
- }
- int readtemperature() //读整数部分
- {
- int a,b; //高八位,低八位
- ds18b20_init();
- write_byte(0xcc); //跳过rom匹配,跳过读序列号的操作,可节省操作时间
- write_byte(0x44); //启动温度检测
- delay(300); //测温度
- ds18b20_init(); //开始操作前需要复位
- write_byte(0xcc); //跳过rom匹配
- write_byte(0xbe); //写读寄存器中温度值的命令
- a=read_byte(); //low 低位开始读取
- b=read_byte(); //high 高位开始读取
- b<<=8; //把高位左移八位
- b=b|a; //高八位与第八位进行或运算,得到总和
- if(b>=0) //如果温度大于等于0
- {
- b=b*0.0625; //直接乘以0.0625
- }
- else //温度小于0
- {
- b=~b+1; //取反码再加一
- b=b*0.0625; //再运算
- }
- return b; //返回b,此时以表示温度
- }
- /*******************************************************************************************************/
- void T0_init(void)
- {
- TMOD=0x11; //设置定时器0为工作方式1
- TH0=(65536-50000)/256; //50MS定时
- TL0=(65536-50000)%256;
- EA=1; //开定时器T0的中断 总中断
- ET0=1; //允许T0中断
- TR0=1; //开启定时器
- }
- void UsartConfiguration(void)
- {
- SCON=0X50; //设置为工作方式1,8位数据,可变波特率
- TMOD=0X20; //设置计数器工作方式2
- PCON=0X00; //波特率不加倍
- TH1=0XFd; //计数器初始值设置,[url=mailto:9600@11.0592MHz]9600@11.0592MHz[/url]
- TL1=0XFd;
- TR1=1; //打开计数器
- ES = 1; //开串口中断
- EA = 1; //开总中断
- }
- void main()
- {
- BEEP=0; //关闭蜂鸣器
- T0_init(); //定时器初始化
- init(); //液晶初始化
- UsartConfiguration();
- while(1)
- {
- if(Adjust==0) //非调节模式下显示时间和开锁
- {
- Time_Display(); //显示时间
- if(Count>=10) //50ms*10次=0.5s
- {
- temperature=readtemperature(); //读取温度
- Temperature_dispaly(0x80+0x40+2,temperature);//显示温度
- Temperature_dispaly(0x80+2,temp_set); //显示设置温度
- Count=0; //清除计数
- }
- Open(); //动作判断
- }
- Keyscan(); //扫描键盘
- }
- }
- void Timer0() interrupt 1 //定时器T0中断函数
- {
- TH0=(65536-50000)/256; //赋初值=50ms
- TL0=(65536-50000)%256; //TH0=3C,TL0=B0
- Count++; //每中断一次,Count加一,计数20次,表示1s的时间到
- }
- void UART_SER(void) interrupt 4
- {
- EA=0;
- receive=SBUF;
- RI=0;
- if(receive=='1')
- {
- HEAT=0; //加热
- JDQ=0; //闭合继电器
- }
- if(receive=='2')
- {
- HEAT=1; //停止加热
- JDQ=1; //断开继电器
- }
- if(receive=='3')
- {
- CLEAN=0; //开启清洗电机
- CLEAN_LED=0; //开启清洗灯
- }
- if(receive=='4')
- {
- CLEAN=1; //关闭清洗电机
- CLEAN_LED=1; //关闭清洗灯
- }
-
- SBUF = receive; //将要发送的数据放入到发送寄存器
- while(!TI); //等待发送数据完成
- TI=0; //清除发送完成标志位
- EA=1;
- }
复制代码 |