智能饮水机
操作说明
操作包含三部分,第一是设置时间,第二是设置定时加热的开始时间和结束时间,第三是设置水温。
正常情况下,显示实时时间,当需要进行按键操作时,可按照下列步骤执行:
长按选择按键一次后释放,出现:
再按下确定键表示进入实时时间的设置;
按下选择按键二次,出现:
再按下确定按键表示进入设置定时时间;
按下选择按键三次,出现:
再按下确定按键表示进入水温的设置;
一. 进入实时时间设置:
进入设置界面如下,首先默认调节年,通过“加”“减”键来调节年的大小,调节完成后按确认键完成年的调节,然后光标跳到月的调节,表示调节月,同理按顺序可以调节日、时、分、秒、星期,最后设置完成,会到主界面显示实时时间;
二. 进入定时时间的设置:
进入设置界面如下,首先默认调节开始时间的时,通过“加”“减”键来调节时的大小,调节完成后按确认键完成时的调节,然后光标跳到分的调节,同理可调节分和秒;
完成开始时间的设置后,进入设置结束时间,界面如下,首先默认调节结束时间的时,通过“加”“减”键来调节时的大小,调节完成后按确认键完成时的调节,然后光标跳到分的调节,同理可调节分和秒;
三. 进入水温的设置:
进入设置界面如下,通过“加”“减”键来调节温度的大小,范围0-100度,调节完成后按确认即可。
完整版 电路图和程序代码 下载地址
https://pan.baidu.com/s/15rIF2yzF_pyBw3ahmgawlg?pwd=8888
部分代码展示
#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";
uchar code table12[]="Date: 2000/00/00";
uchar code table13[]="Time: 00:00:00 0";
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^2; //声响检测端口
sbit WATER=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();
/*********************************************************************************************************************/
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);
}
}
}