久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2238|回復: 0
打印 上一主題 下一主題
收起左側

LCD2004+DS1302+STC89C52單片機數字鐘制作 附仿真代碼

[復制鏈接]
跳轉到指定樓層
樓主
使用LCD2004+DS1302+STC89C52制作的數字鐘

數字鐘正面


數字鐘電路板布線




數字鐘電路板

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

附近有程序+仿真圖

單片機源程序如下:
  1. /**********引用文件**********/
  2. #include <intrins.h>        //函數,應用于程序設計
  3. #include <stdio.h>        //標準輸入輸出
  4. #include <math.h>        //常用的一些數學運算
  5. #include <REG52.H>        //單片機頭文件

  6. #include "1.Delay.h"
  7. #include "2.Timer0.h"
  8. #include "3.LCD2004.h"
  9. #include "4.DS1302.h"
  10. #include "5.Key.h"

  11. unsigned char KeyNum;                                                        //按鍵值
  12. unsigned char MODE;                                                                //模式
  13. unsigned char TimeSetSelect;                        //設置選擇位
  14. unsigned char TimeSetFlashFlag;                //閃爍標志位

  15. void TimeShow(void)                //時間顯示功能
  16.         {
  17.                 DS1302_ReadTime();                                                                                //讀取時間
  18.                 LCD_ShowNum(2,6,DS1302_Time[0],2);                //顯示年
  19.                 LCD_ShowNum(2,11,DS1302_Time[1],2);                //顯示月
  20.                 LCD_ShowNum(2,16,DS1302_Time[2],2);                //顯示日
  21.                 LCD_ShowNum(3,5,DS1302_Time[3],2);                //顯示時
  22.                 LCD_ShowNum(3,10,DS1302_Time[4],2);                //顯示分
  23.                 LCD_ShowNum(3,15,DS1302_Time[5],2);                //顯示秒                                
  24.                 switch(DS1302_Time[6])
  25.                         {
  26.                                 case 1:LCD_ShowString(4,6,"  Monday ");break;                //星期一
  27.                                 case 2:LCD_ShowString(4,6," Tuesday ");break;                //星期二
  28.                                 case 3:LCD_ShowString(4,6,"Wednesday");break;                //星期三
  29.                                 case 4:LCD_ShowString(4,6," Thursday");break;                //星期四
  30.                                 case 5:LCD_ShowString(4,6,"  Friday ");break;                //星期五
  31.                                 case 6:LCD_ShowString(4,6," Saturday");break;                //星期六
  32.                                 case 7:LCD_ShowString(4,6,"  Sunday ");break;                //星期日
  33.                                 }
  34.         }

  35. void TimeSet(void)                //時間設置功能
  36.         {
  37.                 if(KeyNum==2)                //按鍵2按下
  38.                         {
  39.                                 TimeSetSelect++;                //設置選擇位加1
  40.                                 if(TimeSetSelect==7)
  41.                                         {
  42.                                                 TimeSetSelect=0;                //越界清零功能為0--6
  43.                                                 }
  44.                         }

  45.                 if(KeyNum==3)//按鍵3按下
  46.                         {
  47.                                 DS1302_Time[TimeSetSelect]++;                //時間設置位數值加1
  48.                                 if(DS1302_Time[0]>99)                //年越界判斷
  49.                                         {
  50.                                                 DS1302_Time[0]=0;
  51.                                         }
  52.                                 if(DS1302_Time[1]>12)                //月越界判斷
  53.                                         {
  54.                                                 DS1302_Time[1]=1;
  55.                                         }
  56.                                 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)                //日越界判斷
  57.                                         {
  58.                                                 if(DS1302_Time[2]>31)                //大月
  59.                                                         {
  60.                                                                 DS1302_Time[2]=1;
  61.                                                         }
  62.                                         }
  63.                                         else if(DS1302_Time[1]==4||DS1302_Time[1]==6||DS1302_Time[1]==9||DS1302_Time[1]==11)
  64.                                                 {
  65.                                                         if(DS1302_Time[2]>30)                //小月
  66.                                                                 {
  67.                                                                         DS1302_Time[2]=1;
  68.                                                                 }
  69.                                                 }
  70.                                         else if(DS1302_Time[1]==2)
  71.                                                 {
  72.                                                         if(DS1302_Time[0]%4==0)                //判斷閏年
  73.                                                                 {
  74.                                                                         if(DS1302_Time[2]>29)                //閏年2月
  75.                                                                                 {
  76.                                                                                         DS1302_Time[2]=1;
  77.                                                                                 }
  78.                                                                 }
  79.                                                                 else
  80.                                                                         {
  81.                                                                                 if(DS1302_Time[2]>28)                //平年2月
  82.                                                                                         {
  83.                                                                                                 DS1302_Time[2]=1;
  84.                                                                                         }
  85.                                                                         }
  86.                                                 }
  87.                                 if(DS1302_Time[3]>23)                //時越界判斷
  88.                                         {
  89.                                                 DS1302_Time[3]=0;
  90.                                         }
  91.                                 if(DS1302_Time[4]>59)                //分越界判斷
  92.                                         {
  93.                                                 DS1302_Time[4]=0;
  94.                                         }
  95.                                 if(DS1302_Time[5]>59)                //秒越界判斷
  96.                                         {
  97.                                                 DS1302_Time[5]=0;
  98.                                         }
  99.                                 if(DS1302_Time[6]>7)                //周越界判斷
  100.                                         {
  101.                                                 DS1302_Time[6]=1;
  102.                                         }
  103.                         }

  104.                 if(KeyNum==4)//按鍵4按下
  105.                         {
  106.                                 DS1302_Time[TimeSetSelect]--;                //時間設置位數值減1
  107.                                 if(DS1302_Time[0]<0)                //年越界判斷
  108.                                         {
  109.                                                 DS1302_Time[0]=99;
  110.                                         }
  111.                                 if(DS1302_Time[1]<1)                //月越界判斷
  112.                                         {
  113.                                                 DS1302_Time[1]=12;
  114.                                         }
  115.                                 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)                //日越界判斷
  116.                                         {
  117.                                                 if(DS1302_Time[2]<1)                //大月
  118.                                                         {
  119.                                                                 DS1302_Time[2]=31;
  120.                                                         }
  121.                                                 if(DS1302_Time[2]>31)                //保證在進行月改變的時候,日也可以正確
  122.                                                         {
  123.                                                                 DS1302_Time[2]=1;
  124.                                                         }
  125.                                         }
  126.                                         else if(DS1302_Time[1]==4||DS1302_Time[1]==6||DS1302_Time[1]==9||DS1302_Time[1]==11)
  127.                                                 {
  128.                                                         if(DS1302_Time[2]<1)                //小月
  129.                                                                 {
  130.                                                                         DS1302_Time[2]=30;
  131.                                                                 }
  132.                                                         if(DS1302_Time[2]>30)                //保證在進行月改變的時候,日也可以正確
  133.                                                                 {
  134.                                                                         DS1302_Time[2]=1;
  135.                                                                 }
  136.                                                 }
  137.                                         else if(DS1302_Time[1]==2)
  138.                                                 {
  139.                                                         if(DS1302_Time[0]%4==0)                //判斷閏年
  140.                                                                 {
  141.                                                                         if(DS1302_Time[2]<1)                //閏年2月
  142.                                                                                 {
  143.                                                                                         DS1302_Time[2]=29;
  144.                                                                                 }
  145.                                                                         if(DS1302_Time[2]>29)                //保證在進行月改變的時候,日也可以以正確
  146.                                                                                 {
  147.                                                                                         DS1302_Time[2]=1;
  148.                                                                                 }
  149.                                                                 }
  150.                                                                 else
  151.                                                                         {
  152.                                                                                 if(DS1302_Time[2]<1)                //平年2月
  153.                                                                                         {
  154.                                                                                                 DS1302_Time[2]=28;
  155.                                                                                         }
  156.                                                                                 if(DS1302_Time[2]>28)//保證在進行月改變的時候,日也可以以正確
  157.                                                                                         {
  158.                                                                                                 DS1302_Time[2]=1;
  159.                                                                                         }
  160.                                                                         }
  161.                                                 }
  162.                                 if(DS1302_Time[3]<0)                //時越界判斷
  163.                                         {
  164.                                                 DS1302_Time[3]=23;
  165.                                         }
  166.                                 if(DS1302_Time[4]<0)                //分越界判斷
  167.                                         {
  168.                                                 DS1302_Time[4]=59;
  169.                                         }
  170.                                 if(DS1302_Time[5]<0)                //秒越界判斷
  171.                                         {
  172.                                                 DS1302_Time[5]=59;
  173.                                         }
  174.                                 if(DS1302_Time[6]<1)                //周越界判斷
  175.                                         {
  176.                                                 DS1302_Time[6]=7;
  177.                                         }
  178.                         }

  179.                         if(TimeSetSelect==0&&TimeSetFlashFlag==1)                //更新顯示,根據TimeSetSelect(設置時間模式)和TimeSetFlashFlag判斷可完成閃爍功能
  180.                                 {
  181.                                         LCD_ShowString(2,6,"  ");
  182.                                 }
  183.                                 else
  184.                                         {
  185.                                                 LCD_ShowNum(2,6,DS1302_Time[0],2);                //顯示年
  186.                                                 }
  187.                         if(TimeSetSelect==1&&TimeSetFlashFlag==1)
  188.                                 {
  189.                                         LCD_ShowString(2,11,"  ");
  190.                                 }
  191.                                 else
  192.                                         {
  193.                                                 LCD_ShowNum(2,11,DS1302_Time[1],2);                //顯示月
  194.                                                 }
  195.                         if(TimeSetSelect==2&&TimeSetFlashFlag==1)
  196.                                 {
  197.                                         LCD_ShowString(2,16,"  ");
  198.                                 }
  199.                                 else
  200.                                         {
  201.                                                 LCD_ShowNum(2,16,DS1302_Time[2],2);                //顯示日
  202.                                         }
  203.                         if(TimeSetSelect==3&&TimeSetFlashFlag==1)
  204.                                 {
  205.                                         LCD_ShowString(3,5,"  ");
  206.                                 }
  207.                                 else
  208.                                         {
  209.                                                 LCD_ShowNum(3,5,DS1302_Time[3],2);                //顯示時
  210.                                                 }
  211.                         if(TimeSetSelect==4&&TimeSetFlashFlag==1)
  212.                                 {
  213.                                         LCD_ShowString(3,10,"  ");
  214.                                 }
  215.                                 else
  216.                                         {
  217.                                                 LCD_ShowNum(3,10,DS1302_Time[4],2);                //顯示分
  218.                                                 }
  219.                         if(TimeSetSelect==5&&TimeSetFlashFlag==1)
  220.                                 {
  221.                                         LCD_ShowString(3,15,"  ");
  222.                                 }
  223.                                 else
  224.                                         {
  225.                                                 LCD_ShowNum(3,15,DS1302_Time[5],2);                //顯示秒
  226.                                         }
  227.                         if(TimeSetSelect==6&&TimeSetFlashFlag==1)
  228.                                 {
  229.                                         LCD_ShowString(4,6,"          ");
  230.                                 }
  231.                                 else
  232.                                         {
  233.                                                 switch(DS1302_Time[6])                //顯示周
  234.                                                         {
  235.                                                                 case 1:LCD_ShowString(4,6,"  Monday ");break;                //星期一
  236.                                                                 case 2:LCD_ShowString(4,6," Tuesday ");break;                //星期二
  237.                                                                 case 3:LCD_ShowString(4,6,"Wednesday");break;                //星期三
  238.                                                                 case 4:LCD_ShowString(4,6," Thursday");break;                //星期四
  239.                                                                 case 5:LCD_ShowString(4,6,"  Friday ");break;                //星期五
  240.                                                                 case 6:LCD_ShowString(4,6," Saturday");break;                //星期六
  241.                                                                 case 7:LCD_ShowString(4,6,"  Sunday ");break;                //星期日
  242.                                                                 }
  243.                                         }
  244.         }

  245. void main()
  246.         {
  247.                 LCD_Init();
  248.                 DS1302_Init();
  249.                 Timer0Init();
  250.                 LCD_ShowString(1,4,"Happy everyday");
  251.                 LCD_ShowString(2,4,"20");//靜態字符初始化顯示
  252.                 LCD_ShowString(2,9,"-");//靜態字符初始化顯示
  253.                 LCD_ShowString(2,14,"-");//靜態字符初始化顯示
  254.                 LCD_ShowString(3,8,":");
  255.                 LCD_ShowString(3,13,":");
  256. //        DS1302_SetTime();                //設置初始時間,在DS1302子函數的數組中
  257.                 while(1)
  258.                         {
  259.                                 KeyNum=Key();
  260. ……………………

  261. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

Keil代碼與Proteus仿真下載:
Keil.rar (45.3 KB, 下載次數: 39)
Proteus.rar (16.71 KB, 下載次數: 20)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人精品999在线观看 | 亚洲成人一区二区 | 一级午夜aaa免费看三区 | www.男人天堂.com | 日韩www视频 | 日韩国产一区二区三区 | 久久日韩精品 | 四虎影视一区二区 | 久草在线高清 | 亚洲一区二区三区四区五区午夜 | 精品欧美乱码久久久久久1区2区 | 雨宫琴音一区二区在线 | 久久久久久成人 | 精品久久一 | 人人艹人人爽 | 日韩一区二区av | 亚洲九九精品 | 久久久91精品国产一区二区三区 | 久久不卡日韩美女 | 亚洲二区在线 | 黄色网络在线观看 | 欧美日韩专区 | 日韩视频在线免费观看 | h视频免费在线观看 | 免费特黄视频 | 国产精品精品视频一区二区三区 | 国产精品视频网址 | 91国内外精品自在线播放 | 亚洲一区二区三区在线免费 | 青青久久久 | 人人草人人干 | 伊人网站| 亚洲成人黄色 | 国内精品伊人久久久久网站 | 国产成人精品网站 | 激情在线视频 | 午夜精品视频在线观看 | 成人在线观看网址 | 农村妇女毛片精品久久久 | 亚洲巨乳自拍在线视频 | 伊人中文字幕 |