找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 7827|回復(fù): 16
打印 上一主題 下一主題
收起左側(cè)

DS1302與1602LCD設(shè)計(jì)的可調(diào)式電子日歷與時(shí)鐘 含仿真

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
DS1302與1602LCD設(shè)計(jì)含仿真 自己做的 大家可以看看代碼

仿真原理圖


部分程序預(yù)覽:
  1. #include "DS1302.h"


  2. /*---------延時(shí)程序------------------*/
  3. void DelayMS(uint ms)
  4. {
  5.         uchar i;
  6.         while(ms--){for(i=0;i<120;i++);}
  7. }

  8. //-----------讀LCD狀態(tài)------------------//
  9. uchar Read_LCD_State()
  10. {        uchar state;
  11.         RS=0;RW=1;EN=1;         //輸出:D0~D7=狀態(tài)字
  12.         DelayMS(1);
  13.         state=P0;                  //從P0口讀LCD狀態(tài)
  14.         EN = 0;DelayMS(1);
  15.         return state;
  16. }
  17. //-----------忙等待------------------//
  18. void LCD_Busy_Wait()
  19. {
  20.         while((Read_LCD_State()&0x80)==0x80);
  21.         DelayMS(5);
  22. }       
  23. //-----------向LCD寫(xiě)數(shù)據(jù)------------------//
  24. void Write_LCD_Data(uchar dat)
  25. {
  26.         LCD_Busy_Wait();
  27.         RS=1;EN=0;RW=0;                 //寫(xiě)數(shù)據(jù),EN為高脈沖,
  28.         P0=dat;EN=1;DelayMS(1);EN=0;       
  29. }
  30. //-------------寫(xiě)LCD指令-------------------//
  31. void Write_LCD_Command(uchar cmd)
  32. {
  33.         LCD_Busy_Wait();
  34.         RS=0;EN=0;        RW=0; //寫(xiě)指令,EN高脈沖,輸出:D0~D7=數(shù)據(jù)
  35.         P0=cmd;EN=1;DelayMS(1);EN=0;       
  36. }
  37. //-------------LCD初始化-------------------//
  38. void Init_LCD()
  39. {
  40.         Write_LCD_Command(0x38);  //設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
  41.         DelayMS(1);       
  42.         Write_LCD_Command(0x01);  //顯示清零,數(shù)據(jù)指針清零
  43.         DelayMS(1);       
  44.         Write_LCD_Command(0x06);  //寫(xiě)一個(gè)字符后地址指針自動(dòng)加1
  45.         DelayMS(1);       
  46.         Write_LCD_Command(0x0c);   //設(shè)置開(kāi)顯示,不顯示光標(biāo)
  47.         DelayMS(1);       
  48. }
  49. //------------------------------------------
  50. //設(shè)置液晶顯示位置
  51. //------------------------------------------
  52. void Set_LCD_POS(uchar p){
  53.         Write_LCD_Command(p|0x80);//相當(dāng)于在0x80基礎(chǔ)上加入位置量       
  54. }
  55. //----在LCD上顯示字符串---------//
  56. void Display_LCD_String(uchar p,uchar *s)
  57. {                uchar i;
  58.         Set_LCD_POS(p);
  59.         for(i=0;i<16;i++)
  60.         {
  61.                 Write_LCD_Data(s[i]);  //在固定位置顯示時(shí)間日期
  62.                 DelayMS(1);
  63.         }
  64. }
  65. //---------日期與時(shí)間值轉(zhuǎn)換為數(shù)字字符----------------//
  66. void Format_DateTime(uchar d,uchar *a)
  67. {
  68.         a[0]=d/10+'0';
  69.         a[1]=d%10+'0';
  70. }
  71. //判斷是否為閏年
  72. uchar isLeapYear(uint y)
  73. {        return (y%4==0&&y%100!=0)||(y%400==0);}
  74. //求自2000.1.1開(kāi)始的任何一天是星期幾
  75. //函數(shù)沒(méi)有通過(guò),求出總天數(shù)后再求星期幾
  76. //因?yàn)榍罂偺鞌?shù)可能會(huì)超出uint的范圍
  77. void RefreshWeekDay()
  78. {        uint i,d,w=5;         //已知1999.12.31是周五
  79.         for(i=2000;i<2000+DateTime[6];i++)
  80.         {
  81.                 d=isLeapYear(i)?366:365;
  82.                 w=(w+d)%7;
  83.         }
  84.         d=0;
  85.         for(i=1;i<DateTime[4];i++)
  86.         {        d+=MonthsDays[i];        }
  87.         d+=DateTime[3];
  88.         //保存星期,0~6表示星期日,星期一,二,...,六,為了與DS1302的星期格式匹配,返回值需要加1
  89.         DateTime[5]=(w+d)%7+1;
  90. }
  91. //*****年月日時(shí)分++/--********//
  92. void DateTime_Adjust(char x)
  93. {                switch(Adjust_Index)
  94.         {
  95.                 case 6:          //年00-99
  96.                         if(x==1&&DateTime[6]<99) DateTime[6]++;
  97.                         if(x==-1&&DateTime[6]>0) DateTime[6]--;
  98.                         //獲取2月天數(shù)
  99.                         MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;
  100.                         //如果年份變化后當(dāng)前月份的天數(shù)大于上限則設(shè)為上限
  101.                         if(DateTime[3]>MonthsDays[DateTime[4]])
  102.                         {        DateTime[3]=MonthsDays[DateTime[4]];}
  103.                         RefreshWeekDay();  //刷新星期
  104.                         break;
  105.                 case 4:         //月01-12
  106.                         if(x==1&&DateTime[4]<12) DateTime[4]++;
  107.                         if(x==-1&&DateTime[4]>1) DateTime[4]--;
  108.                         MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;
  109.                         if(DateTime[3]>MonthsDays[DateTime[4]])
  110.                         {        DateTime[3]=MonthsDays[DateTime[4]];}
  111.                         RefreshWeekDay();
  112.                         break;
  113.                 case 3:          //日00-28、29、30、31,調(diào)節(jié)之前首先根據(jù)年份得出該年中斷二月 天數(shù)
  114.                         MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;
  115.                         //根據(jù)當(dāng)前月份決定調(diào)節(jié)日期的上限
  116.                         if(x==1&&DateTime[3]<MonthsDays[DateTime[4]]) DateTime[3]++;
  117.                         if(x==-1&&DateTime[3]>0) DateTime[3]--;
  118.                         RefreshWeekDay();
  119.                         break;
  120.                 case 2:           //時(shí)
  121.                         if(x==1&&DateTime[2]<23) DateTime[2]++;
  122.                         if(x==-1&&DateTime[2]>0) DateTime[2]--;
  123.                         break;
  124.                 case 1:                //分
  125.                         if(x==1&&DateTime[1]<59) DateTime[1]++;
  126.                         if(x==-1&&DateTime[1]>0) DateTime[1]--;
  127.                         break;
  128.         }
  129. }
  130. //---定時(shí)器0每秒刷新LCD顯示----//
  131. void T0_INT() interrupt 1
  132. {
  133.         TH0=-50000/256;
  134.         TL0=-50000%256;
  135.         if(++tCount !=2)        return;
  136.         tCount=0;
  137.         //按指定格式生成待顯示的日期時(shí)間串
  138.         Format_DateTime(DateTime[6],LCD_DSY_BUFFER1+5);
  139.         Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+8);
  140.         Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+11);
  141.         //星期
  142.         strcpy(LCD_DSY_BUFFER1+13,WEEK[DateTime[5]-1]);
  143.         //時(shí)分秒
  144.         Format_DateTime(DateTime[2],LCD_DSY_BUFFER2+5);
  145.         Format_DateTime(DateTime[1],LCD_DSY_BUFFER2+8);
  146.         Format_DateTime(DateTime[0],LCD_DSY_BUFFER2+11);
  147.         //顯示年月日,星期,時(shí)分秒
  148.         Display_LCD_String(0x00,LCD_DSY_BUFFER1);
  149.         Display_LCD_String(0x40,LCD_DSY_BUFFER2);
  150. }
  151. //----------鍵盤中斷(INT0)-------------//
  152. void EX_INT0() interrupt 0
  153. {       
  154.         if(K1==0)          //選擇調(diào)整對(duì)象(Y M D H M)
  155.         {
  156.                 DelayMS(10);
  157.                 if(K1==0){                         
  158.                 //while(K1==0);
  159.                 if(Adjust_Index==-1||Adjust_Index==1)
  160.                 {
  161.                         Adjust_Index=7;
  162.                 }
  163.                 Adjust_Index--;
  164.                 if(Adjust_Index==5) Adjust_Index=4;
  165.                 LCD_DSY_BUFFER2[13]='[';
  166.             LCD_DSY_BUFFER2[14]=Change_Flag[Adjust_Index]; //顯示調(diào)節(jié)對(duì)象
  167.                 LCD_DSY_BUFFER2[15]=']';
  168.                 }
  169.         }
  170.         else if(K2==0)                          //加
  171.         {        //while(K2==0);
  172.                 DelayMS(10);
  173.                 if(K2==0)
  174.                  DateTime_Adjust(1);
  175.         }
  176.         else if(K3==0)                         //減
  177.         {
  178.                         DelayMS(10);//while(K3==0);
  179.                 if(K3==0)
  180.                         DateTime_Adjust(-1);
  181.         }
  182.         else if(K4==0)                           //確定
  183.         {
  184.                 //while(K4==0);
  185.                 DelayMS(10);
  186.                 if(K4==0){
  187.                 SET_DS1302();                         //將調(diào)整后的時(shí)間寫(xiě)入DS1302
  188.                                 LCD_DSY_BUFFER2[13]=' ';
  189.                 LCD_DSY_BUFFER2[14]=' ';
  190.                 LCD_DSY_BUFFER2[15]=' ';
  191.                 Adjust_Index=-1;
  192.                 }
  193.         }
  194. }
  195. void main()
  196. {        Init_LCD();                //液晶初始化
  197.         IE=0x83;           //允許INT0,T0中斷,EA=1,,ET0=1,EX0=1
  198.         IP=0x01;           //設(shè)置外部中斷0為高級(jí)中斷
  199.         IT0=0x01;           //外部中斷0為電平觸發(fā),低電平有效
  200.         TMOD=0x01;           //設(shè)置定時(shí)器T0工作方式為方式1,
  201.         TH0=-50000/256;                //裝入初始值,定時(shí)1秒
  202.         TL0=-50000%256;
  203.         TR0=1;                   //啟動(dòng)定時(shí)器
  204.         while(1)
  205.         {
  206.         //如果未執(zhí)行調(diào)整操作則正常讀取當(dāng)前時(shí)間
  207.                 if(Adjust_Index==-1)        GetTime();
  208.         }
  209. }
復(fù)制代碼


所有資料下載:
A3020.rar (104.25 KB, 下載次數(shù): 228)

評(píng)分

參與人數(shù) 2黑幣 +55 收起 理由
WEIDADETG + 5 共享資料的黑幣獎(jiǎng)勵(lì)!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:230899 發(fā)表于 2017-9-15 22:30 | 只看該作者
謝謝樓主
回復(fù)

使用道具 舉報(bào)

板凳
ID:230899 發(fā)表于 2017-9-15 22:31 | 只看該作者
謝謝樓主
回復(fù)

使用道具 舉報(bào)

地板
ID:230899 發(fā)表于 2017-9-15 22:32 | 只看該作者
謝謝樓主啥啥啥
回復(fù)

使用道具 舉報(bào)

5#
ID:225426 發(fā)表于 2017-12-8 23:50 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

6#
ID:130345 發(fā)表于 2017-12-9 00:24 | 只看該作者
感謝樓主分享
回復(fù)

使用道具 舉報(bào)

7#
ID:268362 發(fā)表于 2017-12-28 20:00 | 只看該作者
為什么用你的主函數(shù)創(chuàng)建HEX文件仿真不出來(lái),而用你自帶的HEX文件卻可以?
回復(fù)

使用道具 舉報(bào)

8#
ID:267646 發(fā)表于 2018-1-1 16:35 | 只看該作者
厲害了
回復(fù)

使用道具 舉報(bào)

9#
ID:260932 發(fā)表于 2018-1-2 20:49 來(lái)自觸屏版 | 只看該作者
蟹蟹樓主
回復(fù)

使用道具 舉報(bào)

10#
ID:271828 發(fā)表于 2018-1-5 15:14 | 只看該作者
樓主怎么才能看源代碼
回復(fù)

使用道具 舉報(bào)

11#
ID:270694 發(fā)表于 2018-1-8 14:44 來(lái)自觸屏版 | 只看該作者
我想問(wèn)一下為什么我燒出來(lái)在LCD上怎么不能刷新時(shí)間?
回復(fù)

使用道具 舉報(bào)

12#
ID:270694 發(fā)表于 2018-1-8 14:50 來(lái)自觸屏版 | 只看該作者
樓主樓主,我用了你的代碼仿真能成功,但是連接到實(shí)物圖上卻不能一秒一秒的顯示,只能顯示固定的數(shù)字為什么呢
回復(fù)

使用道具 舉報(bào)

13#
ID:79544 發(fā)表于 2018-2-2 17:23 | 只看該作者
感謝分享學(xué)習(xí)一下!�。。。。�!
回復(fù)

使用道具 舉報(bào)

14#
ID:159177 發(fā)表于 2018-9-5 12:08 | 只看該作者
謝謝樓主
回復(fù)

使用道具 舉報(bào)

15#
ID:307566 發(fā)表于 2018-9-7 15:41 | 只看該作者
謝謝樓主了
回復(fù)

使用道具 舉報(bào)

16#
ID:395057 發(fā)表于 2018-9-7 16:06 | 只看該作者
感謝分享學(xué)習(xí)一下�。。。。。�!
回復(fù)

使用道具 舉報(bào)

17#
ID:653099 發(fā)表于 2019-11-30 17:07 | 只看該作者
感謝樓主分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表