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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4223|回復: 5
收起左側

采用DS12CR887時鐘芯片驅動的51單片機數字時鐘,lcd1602顯示

[復制鏈接]
ID:140725 發表于 2017-3-16 02:53 | 顯示全部樓層 |閱讀模式
基于51單片機數字時鐘,網上一般都是用51單片機+ds1302做的精度沒有我這個好,這次是采用DS12CR887時鐘芯片,1602液晶顯示,經過本人測試成功.特發布在51黑電子論壇.
0.png
完整源碼下載: 51-clock.rar (75.05 KB, 下載次數: 37)



DS12CR887的驅動程序:
  1. /*
  2. * RTC.c
  3. *
  4. * Created: 12/3
  5. * Author: 詹磊
  6. */
  7. #include"File_h\main.h"
  8. #include"File_h\LCD1602.h"
  9. #include"File_h\key.h"
  10. #include"File_h\RTC.h"
  11. //-------------------------------------------//
  12. //函數名:寫DS12CR887數據函數
  13. //入口:Addre:所寫數據的地址
  14. //                Data:需要寫入的數據
  15. //出口:Void
  16. //功能:寫DS12CR887內數據
  17. //-------------------------------------------//
  18. void WriteDS12CR887(unsigned char Addre,unsigned char Data)
  19. {
  20.         DS12CR887_DS=1;
  21.         DS12CR887_RW=1;
  22.         DS12CR887_AS=1;
  23.         DS12CR887_DataPutIO=Addre;
  24.         DS12CR887_CS=0;               
  25.         DS12CR887_AS=0;
  26.         DS12CR887_DataPutIO=Data;
  27.         DS12CR887_RW=0;
  28.         DS12CR887_RW=1;
  29.         DS12CR887_CS=1;
  30.         DS12CR887_AS=1;
  31. }
  32. //-------------------------------------------//
  33. //函數名:讀DS12CR887數據函數
  34. //入口:Addre:所讀數據的地址
  35. //出口:unsigned char :所讀出的數據
  36. //功能:讀DS12CR887內數據
  37. //-------------------------------------------//
  38. unsigned char ReadDS12CR887(unsigned char Addre)
  39. {
  40.          unsigned char ds_date;
  41.         DS12CR887_RW=1;                           
  42.         DS12CR887_DS=1;
  43.         DS12CR887_AS=1;        
  44.         DS12CR887_DataPutIO=Addre;
  45.         DS12CR887_CS=0;
  46.         DS12CR887_AS=0;
  47.         DS12CR887_DataPutIO=0xff;
  48.         DS12CR887_DS=0;
  49.         ds_date=DS12CR887_DataPutIO;
  50.         DS12CR887_DS=1;
  51.         DS12CR887_CS=1;
  52.         DS12CR887_AS=1;
  53.         return ds_date;        
  54. }
  55. //-------------------------------------------//
  56. //函數名:時鐘芯片始化
  57. //入口:Void
  58. //出口:Void
  59. //功能:配置相關寄存器等
  60. //-------------------------------------------//
  61. void RTC_Init()
  62. {        
  63.         /*
  64.         WriteDS12CR887(0x00,0x57);
  65.         WriteDS12CR887(0x02,0x59);
  66.         WriteDS12CR887(0x04,0x23);
  67.         WriteDS12CR887(0x06,0x07);
  68.         WriteDS12CR887(0x07,0x30);
  69.         WriteDS12CR887(0x08,0x12);
  70.         WriteDS12CR887(0x09,0x01);
  71.         */
  72.         ///*
  73.         WriteDS12CR887(0x00,57);
  74.         WriteDS12CR887(0x02,59);
  75.         WriteDS12CR887(0x04,23);
  76.         WriteDS12CR887(0x06,07);
  77.         WriteDS12CR887(0x07,30);
  78.         WriteDS12CR887(0x08,12);
  79.         WriteDS12CR887(0x09,01);
  80.         //*/
  81.         WriteDS12CR887(0x0A,0x20);
  82.         WriteDS12CR887(0x0B,0x06);
  83. }
  84. //-------------------------------------------//
  85. //函數名:讀時鐘數據函數
  86. //入口:*tp:所讀時間數據的結構體指針
  87. //                *dp:所讀日期數據的結構體指針
  88. //出口:Void
  89. //功能:讀時鐘數據
  90. //-------------------------------------------//
  91. void GetRTC_Data(TimeData *tp,DateData *dp)
  92. {        
  93.         tp->second=ReadDS12CR887(0x00);
  94.         tp->minute=ReadDS12CR887(0x02);
  95.         tp->hour=ReadDS12CR887(0x04);
  96.         dp->day=ReadDS12CR887(0x06);
  97.         dp->date=ReadDS12CR887(0x07);
  98.         dp->month=ReadDS12CR887(0x08);
  99.         dp->year=ReadDS12CR887(0x09);
  100. }
  101. //-------------------------------------------//
  102. //函數名:調時間數據函數
  103. //入口:*tp:所寫時間數據的結構體指針
  104. //出口:Void
  105. //功能:調時間數據
  106. //-------------------------------------------//
  107. void WriteRTC_TimeData(TimeData *tp)
  108. {
  109.         WriteDS12CR887(0x00,tp->second);
  110.         WriteDS12CR887(0x02,tp->minute);
  111.         WriteDS12CR887(0x04,tp->hour);
  112. }
  113. //-------------------------------------------//
  114. //函數名:調日期數據函數
  115. //入口:*dp:所寫日期數據的結構體指針
  116. //出口:Void
  117. //功能:調日期數據
  118. //-------------------------------------------//
  119. void WriteRTC_DateData(DateData *dp)
  120. {
  121.         WriteDS12CR887(0x06,dp->day);
  122.         WriteDS12CR887(0x07,dp->date);
  123.         WriteDS12CR887(0x08,dp->month);
  124.         WriteDS12CR887(0x09,dp->year);
  125. }
  126. //-------------------------------------------//
  127. //函數名:調鬧鐘數據函數
  128. //入口:*atp:所寫鬧鐘數據的結構體指針
  129. //出口:Void
  130. //功能:調鬧鐘數據
  131. //-------------------------------------------//
  132. void WriteRTC_AlarmData(TimeData *atp)
  133. {
  134.         WriteDS12CR887(0x01,atp->second);
  135.         WriteDS12CR887(0x03,atp->minute);
  136.         WriteDS12CR887(0x05,atp->hour);
  137. }
復制代碼


按鍵驅動程序:
  1. /*
  2. * key.c
  3. *
  4. * Created: 12/3
  5. * Author: 詹磊
  6. */
  7. #include"File_h\main.h"
  8. #include"File_h\LCD1602.h"
  9. #include"File_h\key.h"
  10. #include"File_h\RTC.h"
  11. //-------------------------------------------//
  12. bit KEY_flag=0;
  13. bit LongKEY_flag=0,LongKEY_START=1;
  14. unsigned char KeyBuffer[KeyBufferSize]={0,0,0,0};                //鍵盤緩存區數組
  15. unsigned char KeyIndexW=0;                                                                //鍵盤緩存隊列寫入指針
  16. unsigned char KeyIndexR=0;                                                                //鍵盤緩存隊列讀取指針
  17. unsigned char KeyCount=0;                                                                //鍵盤緩存隊列內記錄的按鍵次數
  18. //-------------------------------------------//
  19. //函數名:按鍵始化
  20. //入口:Void
  21. //出口:Void
  22. //功能:配置按鍵IO口模式等
  23. //-------------------------------------------//
  24. void InitKey()
  25. {
  26.         KEYControl|=KEYFullValue;
  27. }
  28. //-------------------------------------------//
  29. //函數名:按鍵壓棧函數
  30. //入口:Key:需要壓入按鍵緩存的鍵值
  31. //出口:Void
  32. //功能:將一次鍵值壓入按鍵緩存中
  33. //-------------------------------------------//
  34. void KeyInBuffer(unsigned char Key)
  35. {
  36.         bit tempEA;
  37.         if(KeyCount>=KeyBufferSize)                                                        //緩存已滿,放棄本次按鍵
  38.                 return;
  39.         tempEA=EA;
  40.         EA=0;                                                                                                //涉及共享數據,關中斷
  41.         KeyCount++;
  42.         KeyBuffer[KeyIndexW]=Key;
  43.         if(++KeyIndexW>=KeyBufferSize)                                                //如果隊列頭指針越界,循環隊列
  44.                 KeyIndexW=0;
  45.         EA=tempEA;                                                                                        //開中斷
  46. }
  47. //-------------------------------------------//
  48. //函數名:按鍵出棧函數
  49. //入口:Void
  50. //出口:unsigned char 返回鍵值
  51. //功能:從鍵盤緩存中讀取一次鍵值,調用一次會把按鍵緩存中所調用的那個按鍵的鍵值刪除
  52. //-------------------------------------------//
  53. unsigned char GetKey()
  54. {
  55.         uchar Key;
  56.         bit tempEA;
  57.         if(KeyCount==0)
  58.                 return 0;
  59.         tempEA=EA;
  60.         EA=0;                                                                                                //涉及共享數據,關中斷
  61.         KeyCount--;
  62.         Key=KeyBuffer[KeyIndexR];
  63.         if(++KeyIndexR>=KeyBufferSize)                                                //如果隊列頭指針越界,循環隊列
  64.                 KeyIndexR=0;
  65.         EA=tempEA;                                                                                        //開中斷
  66.         return Key;
  67. }
  68. //-------------------------------------------//
  69. //函數名:按鍵掃描函數
  70. //入口:Void
  71. //出口:Void
  72. //功能:掃描IO口按鍵輸入情況,如果有按鍵事件,那么就保存鍵值到按鍵堆棧區中
  73. //-------------------------------------------//
  74. void CheckKey()
  75. {
  76.         static unsigned char KeyTemp,KeyStateTime;
  77.         unsigned int temp;
  78.         unsigned char timeTemp;
  79.         if((TestKey!=KEYFullValue)&&(KEY_flag!=1))                        //查詢是否有按鍵按下
  80.         {               
  81.                 for(temp=KeyDelayTime;temp>0;temp--)                        //延時消抖
  82.                         if(TestKey==KEYFullValue)
  83.                                 return;
  84.                 if(TestKey!=KEYFullValue)                                                //消抖后檢測按鍵是否還按下;如果是,
  85.                                                                                                                 //則說明是有效按鍵;如果不是,
  86.                                                                                                                 //則認為抖動
  87.                 {
  88.                         LongKEY_START=1;                                                        //長按開始標志
  89.                         KEY_flag=1;                                                                        //標志有按鍵按下
  90.                         KeyTemp=KEYControl&KEYFullValue;                        //記錄鍵值
  91.                 }               
  92.         }
  93.         if((TestKey==KEYFullValue)&&(KEY_flag==1)&&(LongKEY_flag==0))        //松手且之前有按鍵按下去過,但未響應過長按鍵
  94.         {
  95.                 KEY_flag=0;
  96.                 switch(KeyTemp)                                                                        //鍵值壓棧
  97.                 {
  98.                         case KEY1:KeyInBuffer(1);
  99.                                 break;
  100.                         case KEY2:KeyInBuffer(2);
  101.                                 break;
  102.                         case KEY3:KeyInBuffer(3);
  103.                                 break;
  104.                         case KEY4:KeyInBuffer(4);
  105.                                 break;
  106.                         case KEY5:KeyInBuffer(5);
  107.                                 break;
  108.                         case KEY6:KeyInBuffer(6);
  109.                                 break;
  110.                         /*case KEY7:
  111.                                 break;
  112.                         case KEY8:
  113.                                 break;*/
  114.                         default:
  115.                                 break;
  116.                 }
  117.         }
  118.         else if((TestKey!=KEYFullValue)&&(KEY_flag==1))                //如果消抖完成且一直按鍵按著
  119.         {
  120.                 KeyStateTime++;                                                                           //那么按鍵狀態時間自++
  121.                 if(LongKEY_START)
  122.                         timeTemp=LongKeyActionTime;
  123.                 else
  124.                         timeTemp=KeyStateTimeFull;
  125.                 if(KeyStateTime>timeTemp)                                                   //檢測按鍵狀態時間是否達到所需時間
  126.                 {
  127.                         LongKEY_flag=1;                                                                   //長按鍵標志置位,表示響應長按鍵
  128.                         KeyStateTime=0;                                                                   //清除按鍵狀態時間,為下次做準備
  129.                         LongKEY_START=0;
  130.                         switch(KeyTemp)                                                                //鍵值壓棧
  131.                         {
  132.                                 case KEY1:KeyInBuffer(0x81);
  133.                                         break;
  134.                                 case KEY2:KeyInBuffer(0x82);
  135.                                         break;
  136.                                 case KEY3:KeyInBuffer(0x83);
  137.                                         break;
  138.                                 case KEY4:KeyInBuffer(0x84);
  139.                                         break;
  140.                                 case KEY5:KeyInBuffer(0x85);
  141.                                         break;
  142.                                 case KEY6:KeyInBuffer(0x86);
  143.                                         break;
  144.                                 /*case KEY7:
  145.                                         break;
  146.                                 case KEY8:
  147.                                         break;*/
  148.                                 default:
  149.                                         break;
  150.                         }
  151.                  }
  152.         }
  153.         if((LongKEY_flag==1)&&(TestKey==KEYFullValue))                //如果響應過長按鍵,且按鍵現在松開了
  154.         {
  155.                 KEY_flag=0;
  156.                 KeyStateTime=0;
  157.                 LongKEY_flag=0;
  158.         }
  159. }
復制代碼



回復

使用道具 舉報

ID:47286 發表于 2017-3-16 09:34 | 顯示全部樓層
已經下載收藏 慢慢學習 感謝分享
回復

使用道具 舉報

ID:74784 發表于 2017-3-16 19:06 | 顯示全部樓層
沒有硬件接線圖嗎?
回復

使用道具 舉報

ID:37684 發表于 2017-7-12 12:39 | 顯示全部樓層
努力賺黑比啊!
回復

使用道具 舉報

ID:482380 發表于 2019-3-1 16:27 | 顯示全部樓層
下載學習中
回復

使用道具 舉報

ID:419064 發表于 2019-3-1 19:38 | 顯示全部樓層
可惜沒有硬件接線圖,試著從源碼查看,只能逐一實驗單片機腳看看能否接的對
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久久久久久爱 | 在线国产99 | 亚洲精品视频在线观看视频 | 中文字幕乱码一区二区三区 | 亚洲三区在线观看 | 毛片免费在线 | 可以看黄的视频 | 欧美日韩久久精品 | 91久久精品国产91久久性色tv | xx性欧美肥妇精品久久久久久 | 精精国产xxxx视频在线播放 | 激情国产视频 | 在线看亚洲 | 欧美一区二区在线看 | 亚洲免费人成在线视频观看 | 一道本不卡视频 | 精品国产欧美一区二区 | 成人综合一区二区 | 日本韩国欧美在线观看 | 亚洲成人国产综合 | 蜜桃视频一区二区三区 | 日韩欧美高清dvd碟片 | 婷婷一级片| 久久精品青青大伊人av | 亚洲午夜av久久乱码 | 欧美一二区 | 国产精品a久久久久 | 日韩视频1 | 久久国产精品亚洲 | 欧美日韩亚洲三区 | 国产不卡一 | 天天躁日日躁狠狠躁2018小说 | a国产视频| 在线国产视频 | www成人啪啪18 | 欧美日韩国产一区二区三区 | 91在线精品秘密一区二区 | 国产精品永久免费 | 性高朝久久久久久久3小时 av一区二区三区四区 | 婷婷亚洲综合 | 国产片一区二区三区 |