找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4274|回復: 2
打印 上一主題 下一主題
收起左側(cè)

單片機+DS3232可調(diào)時鐘程序與Proteus仿真 LCD12864顯示

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:794979 發(fā)表于 2021-4-4 21:40 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include <STC89C5xRC.H>
  2. #include "12864.h"
  3. #include "1302.h"
  4. #include "wenzi.h"
  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. //===============接口定義===============
  8. sbit key1 = P3^2; //確定/設置 按鍵
  9. sbit key2 = P3^3; //減  鍵
  10. sbit key3 = P3^4; //加  鍵
  11. sbit key4 = P3^5; //返回鍵
  12. sbit LED = P2^0;  //背光
  13. sbit beep = P2^1; //喇叭
  14. sbit GY=P3^7;
  15. //======================================
  16. uchar year,month,date,xq,hour,minute,second,shi,ge,ge1,shi1,ddd;                                                 //時間/鬧鐘相關
  17. uchar t_ss,t_ss1,t_mm,t_hh,t_dd,t_xq,t_yf,t_yy;                                                    //走時變量
  18. uchar idata t,danian;                         //農(nóng)歷  t:節(jié)日顯示跳轉(zhuǎn)時間 danian判斷12月份大小月

  19. bit idata f0,f1,f2,f3;                                                                                                          //反白相關標志
  20. uchar idata setk,setc;                                                       
  21. uchar e,k,n;
  22. uchar idata kk,kk1,bgk,bsj,bld;
  23. bit idata w;
  24. uchar idata ta,tb;
  25. bit idata dinga;



  26. //==============延時函數(shù)===================
  27. void Delay(int num)       
  28. {
  29.         while(num--) ;
  30. }


  31. //============反白標志================
  32. void f_qc(void)
  33. {
  34.         f0=f1=f2=f3=0;
  35. }

  36. void displaytime(void)
  37. {
  38.   year=read_random(DS3231_YEAR);//調(diào)用3231時鐘數(shù)據(jù)中的年數(shù)據(jù),從地址0x8d中
  39.   WRITE_STRING(3,0,0,year/10,0);       
  40.   WRITE_STRING(3,1,0,year%10,0);       
  41.         WRITE_STRING(3,1,1,8,0);         //年       
  42.        
  43.         month=read_random(DS3231_MONTH);//調(diào)用3231時鐘數(shù)據(jù)中的月數(shù)據(jù),從地址0x05中
  44.         WRITE_STRING(3,4,0,month/10,0);         
  45.   WRITE_STRING(3,5,0,month%10,0);       
  46.         WRITE_STRING(3,3,1,7,0);         //月       
  47.        
  48.         date=read_random(DS3231_DAY);//從3231芯片中讀取日數(shù)據(jù),從地址0x04中
  49.         WRITE_STRING(3,8,0,date/10,0);       
  50.   WRITE_STRING(3,9,0,date%10,0);       
  51.         WRITE_STRING(3,5,1,6,0);                  //日
  52.        
  53.   xq=read_random(DS3231_WEEK);//從3231芯片中讀取日數(shù)據(jù),從地址0x04中
  54.         WRITE_STRING(3,7,1,xq-1,0);       


  55.     //小時
  56.         hour =read_random(DS3231_HOUR);        //從3231芯片中讀取小時數(shù)據(jù),從地址0x02中
  57.         WRITE_STRING(0,0,2,hour/10,0);         
  58.   WRITE_STRING(0,1,2,hour%10,0);       
  59.         WRITE_STRING(0,2,2,10,0);                  //時
  60.         //分鐘
  61.         minute= read_random(DS3231_MINUTE); //從3231芯片中讀取分鐘數(shù)據(jù),從地址0x01中
  62.         WRITE_STRING(0,3,2,minute/10,0);         
  63.   WRITE_STRING(0,4,2,minute%10,0);       
  64.         WRITE_STRING(0,5,2,10,0);                  //分
  65.         //秒鐘
  66.         second =read_random(DS3231_SECOND); //從3231芯片中讀取秒鐘數(shù)據(jù),從地址0x01中
  67.         WRITE_STRING(0,6,2,second/10,0);         
  68.   WRITE_STRING(0,7,2,second%10,0);       

  69.        
  70.         //WRITE_STRING(3,7,1,xq,c);

  71. }
  72.        
  73.         void Set_time(uchar sel)
  74. {
  75.           signed char address,item;
  76.           signed char max,mini;

  77.         if(sel==0) {WRITE_STRING(2,7,1,8,0);address=DS3231_YEAR; max=99; mini=0;}  //年?????
  78.         if(sel==1) {WRITE_STRING(2,7,1,7,0);address=DS3231_MONTH; max=12; mini=1;}  //月
  79.         if(sel==2) {WRITE_STRING(2,7,1,6,0);address=DS3231_DAY; max=31; mini=1;}  //日
  80.         if(sel==3) {WRITE_STRING(2,7,1,9,0);address=DS3231_WEEK; max=7;mini=1;}//星
  81.         if(sel==4) {WRITE_STRING(2,7,1,11,0);address=DS3231_HOUR; max=23;mini=0;}//時
  82.         if(sel==5) {WRITE_STRING(2,7,1,12,0);address=DS3231_MINUTE; max=59;mini=0;}//鐘
  83.        

  84.   //讀取3231某地址上的數(shù)值轉(zhuǎn)換成10進制賦給item
  85.           item=(read_random(address));
  86.           if(key3 == 0){item++;}
  87.           if(key4 == 0){item--;}
  88.           if(item>max) item=mini;   
  89.           if(item<mini) item=max;           
  90.           //write_byte(0, 0x98);//允許寫操作
  91.         write_byte(address,(item/10)*16+item%10);//轉(zhuǎn)換成10進制寫入3231
  92.   //        write_byte(0x8e,0x80);//寫保護,禁止寫操作
  93.                
  94.                 DelayM(20);  
  95.           displaytime();
  96.        

  97. }






  98.        
  99.         void main()
  100. {
  101.         uchar e=0;

  102.         LCD_ST7565_INIT();                //液晶初始化
  103.         Lcd12864_ClearScreen();   //清屏
  104.         while(1)
  105.         {
  106.                 if(w==0)
  107.                 {
  108.                         displaytime();//顯示時間
  109.                 }   //正常走時
  110.                 else {}                    //否則啟動調(diào)時
  111. //設置鍵------------------------------------------------------------------------               
  112.                 if (key1 == 0)               // 設置時間
  113.                 {
  114.                         DelayM(20);                   //按鍵消抖
  115.                         if(key1 == 0 && w == 1)  //當是調(diào)時狀態(tài) 本鍵用于調(diào)整下一項
  116.                         {
  117.                                 e++;
  118.                                 if (e >= 6 ){e = 0;}
  119.                                 Set_time(e);       //調(diào)整                               
  120.                         }                       
  121.                         if(key1 == 0 && w == 0)  //當是正常狀態(tài)時就進入調(diào)時狀態(tài)
  122.                         {
  123.               Lcd12864_ClearScreen();   //清屏
  124.                                 w=1;                   //進入調(diào)時                               
  125.                                 Set_time(e);       //調(diào)整
  126.                         }
  127.                            while(key1 == 0);        //等待鍵松開
  128.                 }
  129. //確認,返回鍵-------------------------------------------------------------------               
  130.                 if (key2 == 0)               //在調(diào)時狀態(tài)時就退出調(diào)時
  131.                 {
  132.                         DelayM(20);            //按鍵消抖
  133.                         if(key2 == 0 && w == 1)
  134.                         {                               
  135.                                 w = 0;                   //退出調(diào)時
  136.                                 e = 0;                       //"下一項"計數(shù)器清0                                                               
  137.                         }
  138.                         if(key2 == 0 && w == 0)
  139.                         {                               
  140.               Lcd12864_ClearScreen();   //清屏                       
  141.                                 while(key2 == 0);   
  142.                         }
  143.              Lcd12864_ClearScreen();   //清屏
  144.                         displaytime();                   //顯示時間

  145.                         while(key2 == 0);  
  146.                 }
  147. //加調(diào)整------------------------------------------------------------------------               
  148.                 if (key3 == 0 && w == 1)
  149.                 {                                                          
  150.                         DelayM(20);
  151.                         if(key3 == 0 && w == 1) {        Set_time(e); }
  152.                         while(key3 == 0);
  153.                 }
  154. //減調(diào)整------------------------------------------------------------------------               
  155.                 if (key4 == 0 && w == 1)
  156.                 {              
  157.                         DelayM(20);
  158.                         if(key4 == 0 && w == 1) { Set_time(e); }
  159.                         while(key4 == 0);
  160.                 }
  161.         }
  162. /*液晶背光控制,按一下亮,再按一下滅----------------------------------------
  163.                 if(K5 == 0)        
  164.                 {
  165.                         DelayM(20); q = ~q;      //標志位取反
  166.                          if(q){BLK = BLK | 1;}   
  167.                                  else {BLK = BLK & 0;}   
  168.                         while(K5 == 0);           
  169.                 }                                                                                                                                        */
  170. }
復制代碼

所有資料51hei提供下載:
st12864電子鐘+ds3232 -成功顯示可調(diào)時鐘.7z (125.97 KB, 下載次數(shù): 105)


評分

參與人數(shù) 2黑幣 +60 收起 理由
jialishoushi + 10 支持下 不錯 剛好有個串口屏可以玩玩了
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:794979 發(fā)表于 2021-4-5 06:33 | 只看該作者
7c4337 可以使用相同程序驅(qū)動
回復

使用道具 舉報

板凳
ID:161785 發(fā)表于 2021-4-21 15:53 | 只看該作者
非常好。正需要。謝謝無私分享。
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表