1602液晶显示器显示当前时间,温湿度和时间,通过按键可以设置时间和闹钟,当闹钟响起时按下增加或者减少按键取消闹钟
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg52.h>
- #include"ds1302.h"
- #include"lcd.h"
- #include "DHT111.h"
- #define uint unsigned int
- #define uchar unsigned char
- sbit Key_1 = P3^3;
- sbit Key_2 = P3^4;
- sbit Key_3 = P3^5;
- sbit Buzzer = P3^6;
- uchar KeyValue = 0; //按键值
- uchar Sec_temp;
- uchar Clock_Hour=8,Clock_Min=59;
- uchar Loc = 1;
- uchar Clock_Flag;
- void Key_Scan();
- void Delay10ms(uchar delaytime);
- void Main_DisPlay();
- void Display();
- void Time_Set();
- void Cursor_Set();
- void Set_Screen();
- void Set_Clock();
- void Clock_Check();
- void main()
- {
- Delay10ms(100);
- LcdInit();
- Ds1302Init();
- Ds1302ReadTime();
- Main_DisPlay();
- while(1)
- {
- Key_Scan();
- Display(); //检查时间是否发生变化
- Set_Screen();
- Time_Set();
- Clock_Check(); //闹钟检测
- }
- }
- void Key_Scan()
- {
- KeyValue = 0;
- if(Key_1 == 0) //增加按键按下
- {
- Delay10ms(1);
- if(Key_1 == 0)
- {
- KeyValue = 1;
- while(Key_1 == 0); //等待按键释放
- }
- }
- if(Key_2 == 0) //减少按键按下
- {
- Delay10ms(1);
- if(Key_2 == 0)
- {
- KeyValue = 2;
- while(Key_2 == 0); //等待按键释放
- }
- }
- if(Key_3 == 0) //设置按键按下
- {
- Delay10ms(1);
- if(Key_3 == 0)
- {
- KeyValue = 3;
- while(Key_3 == 0); //等待按键释放
- }
- }
- }
- void Display()
- {
- RH();
- LcdWriteNum(2,6,U8T_data_H_temp);
- LcdWriteNum(2,12,U8RH_data_H_temp);
- Ds1302ReadTime();
- if(Sec_temp != TIME[0])
- {
- Sec_temp = TIME[0];
- LcdWriteNum(1,7,TIME[2]); //写入时
- LcdWriteNum(1,10,TIME[1]); //写入分
- LcdWriteNum(1,13,TIME[0]); //写入秒
- LcdWriteNum(1,1,TIME[4]); //写入月
- LcdWriteNum(1,4,TIME[3]); //写入日
- }
- }
- void Main_DisPlay()
- {
- LcdClear();
- LcdWriteStr(1,1,"00-00 00:00:00");
- LcdWriteStr(2,1,"TEMP:00 RH:00");
- LcdWriteNum(1,7,TIME[2]); //写入时
- LcdWriteNum(1,10,TIME[1]); //写入分
- LcdWriteNum(1,13,TIME[0]); //写入秒
- LcdWriteNum(1,1,TIME[4]); //写入月
- LcdWriteNum(1,4,TIME[3]); //写入日
- Sec_temp = TIME[0]; //读取当前秒
- }
- void Time_Set()
- {
- if(KeyValue == 3)
- {
- LcdClear();
- Ds1302ReadTime();
- LcdWriteStr(1,1,"SET:00-00-00 ");
- LcdWriteStr(2,1," 00:00:00");
- LcdWriteNum(2,5,TIME[2]); //写入时
- LcdWriteNum(2,8,TIME[1]); //写入分
- LcdWriteNum(2,11,TIME[0]); //写入秒
- LcdWriteNum(1,5,TIME[6]); //写入年
- LcdWriteNum(1,8,TIME[4]); //写入月
- LcdWriteNum(1,11,TIME[3]); //写入日
- LcdWriteCom(0x0f); //开光标
- LcdWriteCom(0x80+4);
- while(1)
- {
- Key_Scan();
- if(KeyValue == 1)
- {
- switch(Loc)
- {
- case 1: //设置年
- TIME[6]++;
- LcdWriteNum(1,5,TIME[6]); //写入年
- break;
- case 2: //设置月
- if( TIME[4] <12)
- TIME[4]++;
- else
- TIME[4] = 1;
- LcdWriteNum(1,8,TIME[4]); //写入月
- break;
- case 3: //设置日
- if(TIME[3] < 31)
- TIME[3]++;
- else
- TIME[3] = 1;
- LcdWriteNum(1,11,TIME[3]); //写入日
- break;
- case 4: //设置时
- if(TIME[2] < 24)
- TIME[2]++;
- else
- TIME[2] = 0;
- LcdWriteNum(2,5,TIME[2]); //写入时
- break;
- case 5: //设置分
- if(TIME[1] < 59)
- TIME[1]++;
- else
- TIME[1] = 0;
- LcdWriteNum(2,8,TIME[1]); //写入分
- break;
- case 6: //设置秒
- if(TIME[0] < 59)
- TIME[0]++;
- else
- TIME[0] = 0;
- LcdWriteNum(2,11,TIME[0]); //写入秒
- break;
- }
- Cursor_Set();
- }
- if(KeyValue == 2)
- {
- switch(Loc)
- {
- case 1: //设置年
- TIME[6]--;
- LcdWriteNum(1,5,TIME[6]); //写入年
- break;
- case 2: //设置月
- if( TIME[4] > 1)
- TIME[4]--;
- else
- TIME[4] = 12;
- LcdWriteNum(1,8,TIME[4]); //写入月
- break;
- case 3: //设置日
- if(TIME[3] > 1)
- TIME[3]--;
- else
- TIME[3] = 31;
- LcdWriteNum(1,11,TIME[3]); //写入日
- break;
- case 4: //设置时
- if(TIME[2] > 0)
- TIME[2]--;
- else
- TIME[2] = 24;
- LcdWriteNum(2,5,TIME[2]); //写入时
- break;
- case 5: //设置分
- if(TIME[1] > 0)
- TIME[1]--;
- else
- TIME[1] = 59;
- LcdWriteNum(2,8,TIME[1]); //写入分
- break;
- case 6: //设置秒
- if(TIME[0] > 0)
- TIME[0]--;
- else
- TIME[0] = 59;
- LcdWriteNum(2,11,TIME[0]); //写入秒
- break;
- }
- Cursor_Set();
- }
- if(KeyValue == 3)
- {
- if(Loc < 6)
- Loc++;
- else
- {
- Ds1302WriteTime(); //写入时间
- LcdWriteCom(0x0c); //开显示不显示光标
- return;
- }
- Cursor_Set();
- }
- }
- }
- }
- void Clock_Check()
- {
- static uchar i;
- if(KeyValue == 1 || KeyValue == 2)
- {
- Buzzer = 1;
- Clock_Flag = 2;
- }
- if(TIME[1] == Clock_Min) //分相等
- {
- if(Clock_Flag == 0)
- {
- if(TIME[2] == Clock_Hour) //时相等
- {
- i++;
- if(i > 5)
- {
- i = 0;
- Buzzer = ~Buzzer;
- }
- }
- }
- }
- else
- {
- i = 0;
- Clock_Flag = 0;
- Buzzer = 1;
- }
- }
- void Cursor_Set()
- {
- if(Loc <= 3)
- {
- LcdWriteCom(0x80+4+(Loc-1)*3);
- }
- else
- {
- LcdWriteCom(0xc0+4+(Loc-4)*3);
- }
- }
- void Set_Screen()
- {
- uchar Cursor;
- if(KeyValue == 3)
- {
- Cursor = 1; //设置光标
- LcdClear();
- LcdWriteStr(1,1,">");
- LcdWriteStr(1,3,"Set Time");
- LcdWriteStr(2,3,"Set Clock");
- while(1)
- {
- Key_Scan();
- if(KeyValue == 1 || KeyValue == 2)
- {
- if(KeyValue == 1)
- Cursor++;
- if(KeyValue == 2)
- Cursor--;
- if(Cursor == 0)
- Cursor=2;
- if(Cursor == 3)
- Cursor=1;
- if(Cursor == 1)
- {
- LcdWriteStr(1,1,">");
- LcdWriteStr(2,1," ");
- }
- if(Cursor == 2)
- {
- LcdWriteStr(1,1," ");
- LcdWriteStr(2,1,">");
- }
- }
- if(KeyValue == 3)
- {
- switch(Cursor)
- {
- case 1:
- Time_Set();
- break;
- case 2:
- Set_Clock();
- break;
- }
- Main_DisPlay();
- KeyValue = 0;
- return;
- }
- }
- }
- }
- void Set_Clock()
- {
- uchar Cursor=0;
- LcdClear();
- LcdWriteStr(1,3," Set Clock ");
- LcdWriteStr(2,5," : ");
- LcdWriteNum(2,5,Clock_Hour);
- LcdWriteNum(2,8,Clock_Min);
- LcdWriteCom(0xc0+5);
- LcdWriteCom(0x0f); //光标闪烁
- while(1)
- {
- Key_Scan();
- if(KeyValue == 1)
- {
- if(Cursor == 0)
- {
- if(Clock_Hour < 59)
- Clock_Hour++;
- LcdWriteNum(2,5,Clock_Hour);
- LcdWriteCom(0xc0+5);
- }
- if(Cursor == 1)
- {
- Clock_Min++;
- if(Clock_Hour < 59)
- Clock_Min++;
- LcdWriteNum(2,8,Clock_Min);
- LcdWriteCom(0xc0+8);
- }
- }
- if(KeyValue == 2)
- {
- if(Cursor == 0)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
资料.zip
(157.43 KB, 下载次数: 146)
|