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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5093|回復: 15
收起左側

12864+DS1302+DS18B20大字符時鐘原理圖與源程序

  [復制鏈接]
ID:669769 發表于 2019-12-21 14:12 | 顯示全部樓層 |閱讀模式
12864+DS1302 +DS18B20 大字符時鐘供大家學習。

               電子智能時鐘程序
                單 片 機:STC89C52RC
                晶    振:12MHz
                時鐘芯片:DS1302
                液 晶 屏:LCM-12864-ST7920
                時    間:2019年11月26修改完成
                LCM12864使用并口連接方式,PSB、RST接高電平   

制作出來的實物圖如下:
131469080663881995.jpg

電路原理圖如下:
51hei.png

單片機源程序如下:
  1. /*---------------------------------------------------------------------------
  2.                 電子智能時鐘程序
  3.                 單 片 機:STC89C52RC
  4.                 晶    振:12MHz
  5.                 時鐘芯片:DS1302
  6.                 液 晶 屏:LCM-12864-ST7920
  7.                 時    間:2019年11月26修改完成
  8.                 LCM12864使用并口連接方式,PSB、RST接高電平   
  9. ------------------------------------------------------------------------------*/

  10. /*-------------------------------頭文件---------------------------------------*/
  11. #include <reg52.h>
  12. #include <intrins.h>
  13. #include "LCD12864.h"
  14. #include "DS1302.h"
  15. #include "DS18B20.h"
  16. #include "nongli.h"
  17. #include "displaytime.h"
  18. //#include "jieqi.h"
  19. #define uint  unsigned int
  20. #define uchar unsigned char

  21. /*----------------------------定義按鍵---------------------------------------*/
  22. sbit K1  = P2^3; //K1-設置  
  23. sbit K2  = P2^2; //K2-確認、返回   
  24. sbit K3  = P2^1; //K3-加         
  25. sbit K4  = P2^0; //K4-減         
  26. //sbit K5  = P3^7; //液晶背光控制按鍵,按一下亮,再按一下滅                 
  27. //sbit BLK = P3^7; //液晶背光控制輸出,低電平有效,PNP三極管控制。

  28. /*---------------------函數聲明------------------------------*/
  29. void DelayM(uint);              
  30. void ds_w(void);
  31. void Conver_week(bit c,uchar year,uchar month,uchar day);
  32. /*-----------------------------定義全局變量------------------------------*/
  33. bit q=0, w=0;    //調時標志位
  34. unsigned char yy,mo,dd,xq,hh,mm,ss,month_moon,day_moon,week,tiangan,dizhi,moontemp1,moontemp2;//定義時間映射全局變量(專用寄存器)
  35. signed char address,item,max,mini;

  36. /*-----------------------------延時函數 1MS/次-------------------------------*/
  37. void DelayM(uint a)              
  38. {
  39.         uchar i;
  40.         while( --a != 0) { for(i = 0; i < 125; i++); }                                     
  41. }
  42. /*-----------------------------日期、時間設置函數-----------------------------*/

  43. void tiaozheng(void){
  44.         yy = read_clock(0x8d);//調用1302時鐘數據中的年數據,從地址0x8d中   
  45.         mo = read_clock(0x89);//調用1302時鐘數據中的月數據,從地址0x89中   
  46.         dd = read_clock(0x87);//從1302芯片中讀取日數據,從地址0x87中   
  47.         week = read_clock(0x8b);//從1302芯片中讀取星期數據,從地址0x8b中   
  48.         lcm_w_test(0,0x80);

  49.         lcm_w_word("20");//顯示內容字符20
  50.         write_data(yy/16+0x30);//函數參數1,代表本行寫數據,YY/16+0X30得出年十位數字的顯示碼地址,送顯示       
  51.         write_data(yy%16+0x30);//函數?
  52.         lcm_w_word("年");

  53.         write_data(mo/16+0x30);
  54.         write_data(mo%16+0x30);//與16取余數,得到月份的個位數,加0x30得到該數字的液晶內定顯示碼送顯示
  55.         lcm_w_word("月");     //調用字符顯示函數,顯示文字 月   

  56.         write_data(dd/16+0x30);
  57.         write_data(dd%16+0x30);//第一個1參數,表示本行寫數據,日數據與16取余得個位數,加0x30得到顯示碼
  58.         lcm_w_word("日");//顯示字符 日

  59.         if(read_clock(0x85) != hh){  //如果程序中的小時與1302芯片中的不同,
  60.                 hh = read_clock(0x85);  //刷新程序中的小時數據   
  61.         }
  62.         lcm_w_test(0,0x91);//第一個參數0,表示本行寫入LCM的是指令,指定顯示位置91H(第三行左端)
  63.         write_data(hh/16+0x30);  //顯示十位
  64.          
  65.         write_data(hh%16+0x30);  //顯示個位
  66.         lcm_w_word("時");

  67.         if(read_clock(0x83) != mm){//如果1302芯片中的分鐘數據與程序中的分鐘變量不相等               
  68.                 mm = read_clock(0x83);//刷新程序中的分鐘數據
  69.         }
  70.         write_data(mm/16+0x30);//向液晶寫數據,顯示分鐘的十位數
  71.         write_data(mm%16+0x30);//向液晶寫數據,顯示分鐘的個位數
  72.         lcm_w_word("分");

  73.         if(read_clock(0x81) != ss){//如果1302芯片中的分鐘數據與程序中的秒鐘變量不相等               
  74.                 ss = read_clock(0x81);//刷新程序中的秒鐘數據
  75.         }
  76.         write_data(ss/16+0x30);//向液晶寫數據,顯示分鐘的十位數
  77.         write_data(ss%16+0x30);//向液晶寫數據,顯示分鐘的個位數
  78.         lcm_w_word("秒");         

  79. }

  80. /**********************************************************************************************************/
  81. //調整時間子函數,設置鍵、數據范圍、上調加一,下調減一功能。
  82. void Set_time(unsigned char sel){ //根據選擇調整的相應項目加1并寫入DS1302,函數參數是按動設置鍵的次數
  83.   
  84.         write_com(0x30); write_com(0x06);

  85.         lcm_w_test(0,0x98);//第一參數0表示本行寫入指令,指定下面行的 調整 顯示起始位置為98H
  86.         lcm_w_word("★調整");//調用字符顯示函數,顯示 調整字樣
  87.   
  88. /*        if(sel==6)  {lcm_w_word("星期");address=0x8a; max=7;mini=1;          
  89.      tiaozheng();
  90.      ds_w();
  91.      tiaozheng();
  92.           }
  93. */
  94. //////////////////////////////////////////////////////////////
  95.         if(sel==5)  {lcm_w_word("秒鐘");address=0x80; max=59;mini=0;          
  96.                 tiaozheng();  //調用日期、時間調整函數
  97.            ds_w();                  //被調數據加一或減一函數
  98.            tiaozheng();
  99.                                             
  100.         }        //秒7,按動7次顯示 調整秒鐘   
  101.                 //并指定秒鐘數據寫入1302芯片的地址是0x82,秒鐘數據的最大值是59,最小值是0
  102.    /////////////////////////////////////////////////////////////////////////
  103.         if(sel==4)  {lcm_w_word("分鐘");address=0x82; max=59;mini=0;
  104.            tiaozheng();
  105.            ds_w();
  106.            tiaozheng();
  107.   
  108.         }        //分鐘6,按動6次顯示 調整分鐘
  109.                 //并指定分鐘數據寫入1302芯片的地址是0x82,分鐘數據的最大值是59,最小值是0


  110.         if(sel==3)  {lcm_w_word("小時");address=0x84; max=23;mini=0;
  111.         /***********************************************************/
  112.                  if(address > 12){
  113.                                            address = address-12;        }
  114.          /********************************************************/
  115.             tiaozheng();
  116.            ds_w();
  117.            tiaozheng();
  118.   
  119.         }        //小時5,按動5次顯示 調整小時
  120.                 //規定小時數據寫入1302芯片的位置是0x84,小時數據最大值23,最小值是0
  121.   

  122.         if(sel==2)  {lcm_w_word("日期");
  123.                 address=0x86;

  124.                 mo = read_clock(0x89);//讀月數據
  125.                 moontemp1=mo/16;
  126.                 moontemp2=mo%16;
  127.                 mo=moontemp1*10+moontemp2;//轉換成10進制月份數據

  128.       yy = read_clock(0x8d);//讀年數據
  129.         moontemp1=yy/16;
  130.                 moontemp2=yy%16;
  131.                 yy=moontemp1*10+moontemp2;//轉換成10進制年份數據

  132.         if(mo==2&&yy%4!=0){max=28;mini=1;}//平年2月28天
  133.                 if(mo==2&&yy%4==0){max=29;mini=1;}//閏年2月29天
  134.                 if(mo==1||mo==3||mo==5||mo==7||mo==8||mo==10||mo==12){max=31;mini=1;}//31天的月份
  135.                 if(mo==4||mo==6||mo==9||mo==11){max=30;mini=1;}//30天的月份
  136.                 tiaozheng();
  137.                 ds_w();
  138.                 tiaozheng(); //調用日期、時間調整函數

  139.   }        //日3,按動3次顯示 調整日期
  140.                 //規定日期數據寫入1302的位置地址是0x86,日期最大值31,最小值是1



  141.   if(sel==1)  {lcm_w_word("月份");address=0x88; max=12;mini=1;
  142.      tiaozheng();
  143.      ds_w();
  144.      tiaozheng();
  145.   
  146.    }        //月2,按動2次顯示 調整月份          
  147.                 //規定月份寫入1302的位置地址是0x88,月份最大值12,最小值1


  148.   if(sel==0)  {lcm_w_word("年份");address=0x8c; max=99; mini=0;
  149.      tiaozheng();
  150.      ds_w();                //被調數據加一或減一函數
  151.      tiaozheng();        //調用日期、時間調整函數

  152.    }        //年1,按動1次顯示 調整年份,
  153.                 //規定年份寫入1302的地址是0x8c,年份的最大值99,最小值0

  154. }

  155. /*****************************************************************************/
  156. //被調數據加一或減一,并檢查數據范圍,寫入1302指定地址保存
  157. void ds_w(void){

  158.         item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
  159.         if(K3 == 0){ //如果按動上調鍵
  160.                 item++;  //數加 1  
  161.         }                                                                                                                 
  162.         if(K4 == 0){  //如果按動下調鍵
  163.                   item--;   //數減 1
  164.         }
  165.         if(item>max) item=mini;//查看數值是否在有效范圍之內   
  166.         if(item<mini) item=max;//如果數值小于最小值,則自動等于最大值           
  167.         write_clock(0x8e,0x00);//允許寫1302芯片操作
  168.         write_clock(address,(item/10)*16+item%10);//轉換成16進制寫入1302
  169.         write_clock(0x8e,0x80);//寫保護,禁止寫操作
  170. }

  171. /****可參考***********可參考**************可參考***************以上是調試********

  172. /*主函數---------------------------------------------------------------------*/
  173. void main()
  174. {                            
  175.         uchar e=0;
  176.         K1=1;K2=1;K3=1;K4=1;//BLK=0;//K5=1;

  177.         Init_1302();                //時鐘芯片初始化  
  178.         lcm_init();                        //液晶初始化
  179.         welcome();                    //調用歡迎信息
  180.         DelayM(4000);                 //歡迎信息 延時時間  
  181.         lcm_clr();            //清屏
  182.         Clean_12864_GDRAM();         //清屏
  183.         while(1)
  184.         {
  185.                 if (w == 0)                  //正常走時
  186.                 {
  187.                         displaydate();         //顯示日期
  188. //                        displaynl();         //顯示農歷
  189.                         nongli();                 //顯示農歷
  190. //                        displayjieqi(); //顯示節氣
  191.                         displaytime();         //顯示時間
  192.                         read_temp();         //讀取溫度
  193.                         ds1820disp();          //顯示溫度
  194.                         displayxq();         //顯示星期
  195.                 }       
  196.                 else {}            //否則啟動調時  

  197. /*----------------------------設置時間--------------------------------------*/               
  198.                 if (K1 == 0)         
  199.                 {
  200.                         DelayM(20);                       //按鍵消抖
  201.                         if(K1 == 0 && w == 1)      //當是調時狀態 本鍵用于調整下一項   
  202.                         {
  203.                                 e++;
  204.                                 if (e >= 7 ) {e = 0;}
  205.                            while(! K1 );            //等待鍵松開
  206.                                 Set_time(e);           //調整                               
  207.                         }                       
  208.                         if(K1 == 0 && w == 0)      //當是正常狀態時就進入調時狀態   
  209.                         {
  210.                                 lcm_clr();            
  211.                                 Clean_12864_GDRAM();   //清屏
  212.                                 w=1;                       //進入調時
  213.                                 Set_time(e);
  214.                         }
  215.                            while(K1 == 0);            //等待鍵松開
  216.                 }
  217. /*--------------------------------------------------------------------------*/               
  218.                 if (K2 == 0)                   // 當在調時狀態時就退出調時
  219.                 {
  220.                         DelayM(20);
  221.                         if(K2 == 0 && w == 1)
  222.                         {                               
  223.                                 w = 0;                       //退出調時
  224.                                 e = 0;                           //"下一項"計數器清0                                                               
  225.                         }
  226.                         if(K2 == 0 && w == 0)
  227.                         {                               
  228.                                 lcm_clr(); Clean_12864_GDRAM();
  229.                                 write_com(0x30); write_com(0x06);
  230.                                 welcome();                               
  231.                                 while(K2 == 0);  
  232.                         }
  233.                         lcm_clr(); Clean_12864_GDRAM();
  234.                         displaydate();
  235.                         displayxq();
  236.                         displaynl();
  237.                         displaytime();
  238.                         read_temp();
  239.                         ds1820disp();
  240.                         while(K2 == 0);  
  241.                 }
  242. /*加調整--------------------------------------------------------------------*/               
  243.                 if (K3 == 0 && w == 1)
  244.                 {
  245.                         DelayM(20);
  246.                         if(K3 == 0 && w == 1) { Set_time(e); }
  247.                         while(K3 == 0);
  248.                         while(! K3 );
  249.                 }
  250. /*減調整--------------------------------------------------------------------*/               
  251.                 if (K4 == 0 && w == 1)
  252.                 {              
  253.                         DelayM(20);
  254.                         if(K4 == 0 && w == 1) { Set_time(e); }
  255.                         while(K4 == 0);
  256.                         while(! K4 );
  257.                 }
  258. /*液晶背光控制,按一下亮,再按一下滅----------------------------------------*/
  259. /*                if(K5 == 0)        
  260.                 {
  261.                         DelayM(20); q = ~q;      //標志位取反
  262.                          if(q){BLK = BLK | 1;}   
  263.                                  else {BLK = BLK & 0;}   
  264.                         while(K5 == 0);           
  265.                 }                          */
  266.         }
  267. }
  268. /*結束----------------------------------------------------------------------*/
復制代碼

所有資料51hei提供下載:
12864大字符時鐘原理圖.rar (16.91 KB, 下載次數: 80)
12864+DS1302 +DS18B20 大字符時鐘.rar (126.78 KB, 下載次數: 100)
12864+DS1302 +DS18B20 大字符時鐘原理圖.pdf (377.31 KB, 下載次數: 67)

評分

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

查看全部評分

回復

使用道具 舉報

ID:669769 發表于 2019-12-24 10:27 | 顯示全部樓層
管理員你好!如何修改已發的帖子?
回復

使用道具 舉報

ID:56002 發表于 2019-12-25 11:01 | 顯示全部樓層
這是杜洋程序,貼出請注明出處! 電子制作其樂無窮!
回復

使用道具 舉報

ID:669769 發表于 2019-12-30 15:33 | 顯示全部樓層
oplink 發表于 2019-12-25 11:01
這是杜洋程序,貼出請注明出處! 電子制作其樂無窮!

沒有聽懂你的意思啊?
回復

使用道具 舉報

ID:59151 發表于 2020-1-22 23:59 | 顯示全部樓層
正在學習中,謝謝分享!
回復

使用道具 舉報

ID:59151 發表于 2020-1-23 00:00 | 顯示全部樓層
正在學習中,謝謝分享!
回復

使用道具 舉報

ID:634466 發表于 2020-1-25 13:02 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:400262 發表于 2020-1-28 22:46 | 顯示全部樓層
背光控制那里,注釋掉了,去掉注釋重新編譯是不是就可以用了?
回復

使用道具 舉報

ID:208733 發表于 2020-2-1 17:07 | 顯示全部樓層
這里面是不是有源程序
回復

使用道具 舉報

ID:200118 發表于 2020-2-2 17:47 | 顯示全部樓層
謝謝分享。。。
回復

使用道具 舉報

ID:200118 發表于 2020-2-2 17:51 | 顯示全部樓層
謝謝分享。。。
回復

使用道具 舉報

ID:288930 發表于 2020-2-3 11:59 | 顯示全部樓層
東西不錯,謝謝分享!
回復

使用道具 舉報

ID:669769 發表于 2020-2-4 15:18 | 顯示全部樓層
不吃草的牛 發表于 2020-2-1 17:07
這里面是不是有源程序

12864+DS1302 +DS18B20 大字符時鐘.rar 有的
回復

使用道具 舉報

14#
無效樓層,該帖已經被刪除
ID:669769 發表于 2024-5-27 14:29 | 顯示全部樓層
有源程序的!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九一视频在线播放 | 欧美大片在线观看 | 成在线人视频免费视频 | 精品国产免费一区二区三区演员表 | 亚洲福利av | 99亚洲精品| 草久久久 | 日本精品裸体写真集在线观看 | 91色在线视频 | 日韩中文字幕在线视频 | 中文字幕精 | 日韩在线一区二区三区 | 久久蜜桃av一区二区天堂 | www.婷婷亚洲基地 | 99久热在线精品视频观看 | 国产精品国产三级国产aⅴ中文 | 日韩黄a| 四虎精品在线 | 婷婷久久综合 | 九九九视频在线 | 亚洲精品在线播放 | 综合久久网 | 久久99精品久久久久婷婷 | 99精品热视频 | 日韩免费看片 | 国产91精品久久久久久久网曝门 | 天天拍天天草 | 精品一二区 | 91国内外精品自在线播放 | 97精品超碰一区二区三区 | 免费精品 | 日一日操一操 | 日韩精品一区二区三区久久 | 欧美精品欧美精品系列 | 国产小视频在线 | 一区中文字幕 | 岛国在线免费观看 | 久草在线在线精品观看 | 91视频在线| 国产女人与拘做受视频 | 亚洲国产精品视频一区 |