使用LCD2004+DS1302+STC89C52制作的數字鐘
1.jpg (5.06 MB, 下載次數: 45)
下載附件
2022-12-7 18:48 上傳
數字鐘正面
2.jpg (7.06 MB, 下載次數: 41)
下載附件
2022-12-7 18:48 上傳
數字鐘電路板布線
3.jpg (1.1 MB, 下載次數: 51)
下載附件
2022-12-7 18:48 上傳
數字鐘電路板
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (85.27 KB, 下載次數: 36)
下載附件
2022-12-7 19:12 上傳
附近有程序+仿真圖
單片機源程序如下:
- /**********引用文件**********/
- #include <intrins.h> //函數,應用于程序設計
- #include <stdio.h> //標準輸入輸出
- #include <math.h> //常用的一些數學運算
- #include <REG52.H> //單片機頭文件
- #include "1.Delay.h"
- #include "2.Timer0.h"
- #include "3.LCD2004.h"
- #include "4.DS1302.h"
- #include "5.Key.h"
-
- unsigned char KeyNum; //按鍵值
- unsigned char MODE; //模式
- unsigned char TimeSetSelect; //設置選擇位
- unsigned char TimeSetFlashFlag; //閃爍標志位
- void TimeShow(void) //時間顯示功能
- {
- DS1302_ReadTime(); //讀取時間
- LCD_ShowNum(2,6,DS1302_Time[0],2); //顯示年
- LCD_ShowNum(2,11,DS1302_Time[1],2); //顯示月
- LCD_ShowNum(2,16,DS1302_Time[2],2); //顯示日
- LCD_ShowNum(3,5,DS1302_Time[3],2); //顯示時
- LCD_ShowNum(3,10,DS1302_Time[4],2); //顯示分
- LCD_ShowNum(3,15,DS1302_Time[5],2); //顯示秒
- switch(DS1302_Time[6])
- {
- case 1:LCD_ShowString(4,6," Monday ");break; //星期一
- case 2:LCD_ShowString(4,6," Tuesday ");break; //星期二
- case 3:LCD_ShowString(4,6,"Wednesday");break; //星期三
- case 4:LCD_ShowString(4,6," Thursday");break; //星期四
- case 5:LCD_ShowString(4,6," Friday ");break; //星期五
- case 6:LCD_ShowString(4,6," Saturday");break; //星期六
- case 7:LCD_ShowString(4,6," Sunday ");break; //星期日
- }
- }
- void TimeSet(void) //時間設置功能
- {
- if(KeyNum==2) //按鍵2按下
- {
- TimeSetSelect++; //設置選擇位加1
- if(TimeSetSelect==7)
- {
- TimeSetSelect=0; //越界清零功能為0--6
- }
- }
- if(KeyNum==3)//按鍵3按下
- {
- DS1302_Time[TimeSetSelect]++; //時間設置位數值加1
- if(DS1302_Time[0]>99) //年越界判斷
- {
- DS1302_Time[0]=0;
- }
- if(DS1302_Time[1]>12) //月越界判斷
- {
- DS1302_Time[1]=1;
- }
- if(DS1302_Time[1]==1||DS1302_Time[1]==3||DS1302_Time[1]==5||DS1302_Time[1]==7||DS1302_Time[1]==8||DS1302_Time[1]==10||DS1302_Time[1]==12) //日越界判斷
- {
- if(DS1302_Time[2]>31) //大月
- {
- DS1302_Time[2]=1;
- }
- }
- else if(DS1302_Time[1]==4||DS1302_Time[1]==6||DS1302_Time[1]==9||DS1302_Time[1]==11)
- {
- if(DS1302_Time[2]>30) //小月
- {
- DS1302_Time[2]=1;
- }
- }
- else if(DS1302_Time[1]==2)
- {
- if(DS1302_Time[0]%4==0) //判斷閏年
- {
- if(DS1302_Time[2]>29) //閏年2月
- {
- DS1302_Time[2]=1;
- }
- }
- else
- {
- if(DS1302_Time[2]>28) //平年2月
- {
- DS1302_Time[2]=1;
- }
- }
- }
- if(DS1302_Time[3]>23) //時越界判斷
- {
- DS1302_Time[3]=0;
- }
- if(DS1302_Time[4]>59) //分越界判斷
- {
- DS1302_Time[4]=0;
- }
- if(DS1302_Time[5]>59) //秒越界判斷
- {
- DS1302_Time[5]=0;
- }
- if(DS1302_Time[6]>7) //周越界判斷
- {
- DS1302_Time[6]=1;
- }
- }
- if(KeyNum==4)//按鍵4按下
- {
- DS1302_Time[TimeSetSelect]--; //時間設置位數值減1
- if(DS1302_Time[0]<0) //年越界判斷
- {
- DS1302_Time[0]=99;
- }
- if(DS1302_Time[1]<1) //月越界判斷
- {
- DS1302_Time[1]=12;
- }
- if(DS1302_Time[1]==1||DS1302_Time[1]==3||DS1302_Time[1]==5||DS1302_Time[1]==7||DS1302_Time[1]==8||DS1302_Time[1]==10||DS1302_Time[1]==12) //日越界判斷
- {
- if(DS1302_Time[2]<1) //大月
- {
- DS1302_Time[2]=31;
- }
- if(DS1302_Time[2]>31) //保證在進行月改變的時候,日也可以正確
- {
- DS1302_Time[2]=1;
- }
- }
- else if(DS1302_Time[1]==4||DS1302_Time[1]==6||DS1302_Time[1]==9||DS1302_Time[1]==11)
- {
- if(DS1302_Time[2]<1) //小月
- {
- DS1302_Time[2]=30;
- }
- if(DS1302_Time[2]>30) //保證在進行月改變的時候,日也可以正確
- {
- DS1302_Time[2]=1;
- }
- }
- else if(DS1302_Time[1]==2)
- {
- if(DS1302_Time[0]%4==0) //判斷閏年
- {
- if(DS1302_Time[2]<1) //閏年2月
- {
- DS1302_Time[2]=29;
- }
- if(DS1302_Time[2]>29) //保證在進行月改變的時候,日也可以以正確
- {
- DS1302_Time[2]=1;
- }
- }
- else
- {
- if(DS1302_Time[2]<1) //平年2月
- {
- DS1302_Time[2]=28;
- }
- if(DS1302_Time[2]>28)//保證在進行月改變的時候,日也可以以正確
- {
- DS1302_Time[2]=1;
- }
- }
- }
- if(DS1302_Time[3]<0) //時越界判斷
- {
- DS1302_Time[3]=23;
- }
- if(DS1302_Time[4]<0) //分越界判斷
- {
- DS1302_Time[4]=59;
- }
- if(DS1302_Time[5]<0) //秒越界判斷
- {
- DS1302_Time[5]=59;
- }
- if(DS1302_Time[6]<1) //周越界判斷
- {
- DS1302_Time[6]=7;
- }
- }
- if(TimeSetSelect==0&&TimeSetFlashFlag==1) //更新顯示,根據TimeSetSelect(設置時間模式)和TimeSetFlashFlag判斷可完成閃爍功能
- {
- LCD_ShowString(2,6," ");
- }
- else
- {
- LCD_ShowNum(2,6,DS1302_Time[0],2); //顯示年
- }
- if(TimeSetSelect==1&&TimeSetFlashFlag==1)
- {
- LCD_ShowString(2,11," ");
- }
- else
- {
- LCD_ShowNum(2,11,DS1302_Time[1],2); //顯示月
- }
- if(TimeSetSelect==2&&TimeSetFlashFlag==1)
- {
- LCD_ShowString(2,16," ");
- }
- else
- {
- LCD_ShowNum(2,16,DS1302_Time[2],2); //顯示日
- }
- if(TimeSetSelect==3&&TimeSetFlashFlag==1)
- {
- LCD_ShowString(3,5," ");
- }
- else
- {
- LCD_ShowNum(3,5,DS1302_Time[3],2); //顯示時
- }
- if(TimeSetSelect==4&&TimeSetFlashFlag==1)
- {
- LCD_ShowString(3,10," ");
- }
- else
- {
- LCD_ShowNum(3,10,DS1302_Time[4],2); //顯示分
- }
- if(TimeSetSelect==5&&TimeSetFlashFlag==1)
- {
- LCD_ShowString(3,15," ");
- }
- else
- {
- LCD_ShowNum(3,15,DS1302_Time[5],2); //顯示秒
- }
- if(TimeSetSelect==6&&TimeSetFlashFlag==1)
- {
- LCD_ShowString(4,6," ");
- }
- else
- {
- switch(DS1302_Time[6]) //顯示周
- {
- case 1:LCD_ShowString(4,6," Monday ");break; //星期一
- case 2:LCD_ShowString(4,6," Tuesday ");break; //星期二
- case 3:LCD_ShowString(4,6,"Wednesday");break; //星期三
- case 4:LCD_ShowString(4,6," Thursday");break; //星期四
- case 5:LCD_ShowString(4,6," Friday ");break; //星期五
- case 6:LCD_ShowString(4,6," Saturday");break; //星期六
- case 7:LCD_ShowString(4,6," Sunday ");break; //星期日
- }
- }
- }
-
- void main()
- {
- LCD_Init();
- DS1302_Init();
- Timer0Init();
- LCD_ShowString(1,4,"Happy everyday");
- LCD_ShowString(2,4,"20");//靜態字符初始化顯示
- LCD_ShowString(2,9,"-");//靜態字符初始化顯示
- LCD_ShowString(2,14,"-");//靜態字符初始化顯示
- LCD_ShowString(3,8,":");
- LCD_ShowString(3,13,":");
- // DS1302_SetTime(); //設置初始時間,在DS1302子函數的數組中
- while(1)
- {
- KeyNum=Key();
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
Keil代碼與Proteus仿真下載:
Keil.rar
(45.3 KB, 下載次數: 39)
2022-12-7 18:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
Proteus.rar
(16.71 KB, 下載次數: 20)
2022-12-7 18:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|