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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

通過單片機DS12C887時鐘做一個定時器程序,設置了兩個響應點

[復制鏈接]
跳轉到指定樓層
樓主
ID:389070 發表于 2019-7-29 14:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
使用AT89C52開發,通過DS12C887實時時鐘芯片可以保持千年無誤差計算。斷電也不會歸零,而是和電腦一樣,給一次數據就好。時間的設置可以通過按鍵調節,不知道怎么調節的問我就好。加入了四個邏輯設置定時,控制開和關。24小時一個循環,有1602數碼管顯示。即插即用,   

單片機源程序如下:
  1. /******************************************************************************/
  2. /* 項目名稱  :  DS12C887實時時鐘                                   */
  3. /* 主控芯片  : STC89C52                                                       */
  4. /* 文件名稱  :設置定時器                                                      */
  5. /* 文件功能  : DS12C887實時時鐘操作設置定時器                                 */
  6. /******************************************************************************/
  7. /**********************************包含頭文件**********************************/
  8. #include<reg52.h>
  9. #include<define.h>
  10. sbit LED=P2^4;

  11. void delay(uint z)//延時函數
  12. {
  13.         uint x,y;
  14.         for(x=z;x>0;x--)
  15.                 for(y=110;y>0;y--);
  16. }

  17. //鬧鐘1的時間判斷開
  18. void shijiankai1_Time(void)
  19. {
  20. if(shi==0&&fen==0&&miao==05)         //判斷開的時間,如果為真打開LED
  21.         {
  22.          LED=0;                                      //LED開
  23.         }                 
  24. }

  25. //鬧鐘1的時間判斷關
  26. void shijianguan1_Time(void)
  27. {
  28. if(shi==0&&fen==0&&miao==10)         //判斷關的時間,如果為真打開LED
  29.         {
  30.          LED=1;                                      //LED開
  31.         }                 
  32. }

  33. //鬧鐘2的時間判斷開
  34. void shijiankai2_Time(void)
  35. {
  36. if(shi==0&&fen==0&&miao==15)         //判斷開的時間,如果為真打開LED
  37.         {
  38.          LED=0;                                      //LED開
  39.         }                 
  40. }

  41. //鬧鐘2的時間判斷關
  42. void shijianguan2_Time(void)
  43. {
  44. if(shi==0&&fen==0&&miao==20)         //判斷關的時間,如果為真打開LED
  45.         {
  46.          LED=1;                                      //LED開
  47.         }                 
  48. }


  49. void di() //蜂鳴器報警聲音
  50. {
  51.         beep=0;
  52.         delay(100);
  53.         beep=1;
  54. }
  55. void write_com(uchar com)
  56. {//寫液晶命令函數
  57.         rs=0;
  58.         lcden=0;
  59.         P0=com;
  60.         delay(3);
  61.         lcden=1;
  62.         delay(3);
  63.         lcden=0;       
  64. }
  65. void write_date(uchar date)
  66. {//寫液晶數據函數
  67.         rs=1;
  68.         lcden=0;
  69.         P0=date;
  70.         delay(3);
  71.         lcden=1;
  72.         delay(3);
  73.         lcden=0;       
  74. }
  75. void init()
  76. {//初始化函數
  77.         uchar num;
  78.         EA=1;//打開總中斷
  79.         EX1=1;//開外部中斷1
  80.         IT1=1;//設置負跳變沿觸發中斷
  81.         flag1=0;//變量初始化
  82.         t0_num=0;
  83.         s1num=0;
  84.         week=1;
  85.         dula=0;//關閉數碼管顯示
  86.         wela=0;
  87.         lcden=0;
  88.         rd=0;
  89. /*以下幾行在首次設置DS12C887時使用,以后不必再寫入*/
  90.         write_ds(0x0A,0x20);//打開振蕩器
  91.         write_ds(0x0B,0x26);//設置24小時模式,數據二進制格式
  92. //-----------------------------------------------------
  93.         write_com(0x38);//1602液晶初始化
  94.         write_com(0x0c);
  95.         write_com(0x06);
  96.         write_com(0x01);
  97.         write_com(0x80);
  98.         for(num=0;num<15;num++)//寫入液晶固定部分顯示
  99.                 {
  100.                         write_date(table[num]);
  101.                         delay(1);
  102.                 }
  103.         write_com(0x80+0x40);
  104.         for(num=0;num<11;num++)
  105.                 {
  106.                         write_date(table1[num]);
  107.                         delay(1);
  108.                 }
  109. }
  110. void write_sfm(uchar add,char date)
  111. {//1602液晶刷新時分秒函數4為時,7為分,10為秒
  112.         char shi,ge;
  113.         shi=date/10;
  114.         ge=date%10;
  115.         write_com(0x80+0x40+add);
  116.         write_date(0x30+shi);
  117.         write_date(0x30+ge);
  118. }
  119. void write_nyr(uchar add,char date)
  120. {//1602液晶刷新年月日函數3為年,6為分,9為秒
  121.         char shi,ge;
  122.         shi=date/10;
  123.         ge=date%10;
  124.         write_com(0x80+add);
  125.         write_date(0x30+shi);
  126.         write_date(0x30+ge);
  127. }
  128. void write_week(char we)
  129. {//寫液晶星期顯示函數
  130.         write_com(0x80+12);
  131.         switch(we)
  132.         {
  133.                 case 1:        write_date('M');delay(5);
  134.                                 write_date('O');delay(5);
  135.                                 write_date('N');
  136.                                 break;
  137.                 case 2:        write_date('T');delay(5);
  138.                                 write_date('U');delay(5);
  139.                                 write_date('E');
  140.                                 break;
  141.                 case 3:        write_date('W');delay(5);
  142.                                 write_date('E');delay(5);
  143.                                 write_date('D');
  144.                                 break;
  145.                 case 4:        write_date('T');delay(5);
  146.                                 write_date('H');delay(5);
  147.                                 write_date('U');
  148.                                 break;
  149.                 case 5:        write_date('F');delay(5);
  150.                                 write_date('R');delay(5);
  151.                                 write_date('I');
  152.                                 break;
  153.                 case 6:        write_date('S');delay(5);
  154.                                 write_date('A');delay(5);
  155.                                 write_date('T');
  156.                                 break;
  157.                 case 7:        write_date('S');delay(5);
  158.                                 write_date('U');delay(5);
  159.                                 write_date('N');
  160.                                 break;
  161.         }
  162. }

  163. void write_ds(uchar add,uchar date)
  164. {//寫12C887函數
  165.         dscs=0;
  166.         dsas=1;
  167.         dsds=1;
  168.         dsrw=1;
  169.         P0=add;//先寫地址
  170.         dsas=0;
  171.         dsrw=0;
  172.         P0=date;//再寫數據
  173.         dsrw=1;
  174.         dsas=1;
  175.         dscs=1;                               
  176. }

  177. uchar read_ds(uchar add)
  178. {//讀12C887函數
  179.         uchar ds_date;
  180.         dsas=1;
  181.         dsds=1;
  182.         dsrw=1;
  183.         dscs=0;
  184.         P0=add;//先寫地址
  185.         dsas=0;
  186.         dsds=0;
  187.         P0=0xff;
  188.         ds_date=P0;//再讀數據
  189.         dsds=1;
  190.         dsas=1;
  191.         dscs=1;
  192.         return ds_date;       
  193. }

  194. void main()//主函數
  195. {
  196.         init();//調用初始化函數
  197.         while(1)
  198.         {
  199.                         year=read_ds(9);//讀取12C887數據
  200.                         month=read_ds(8);       
  201.                         day=read_ds(7);
  202.                         week=read_ds(6);
  203.                         shi=read_ds(4);
  204.                         fen=read_ds(2);
  205.                         miao=read_ds(0);       
  206.                         write_sfm(10,miao);//送液晶顯示
  207.                         write_sfm(7,fen);
  208.                         write_sfm(4,shi);
  209.                         write_week(week);
  210.                         write_nyr(3,year);
  211.                         write_nyr(6,month);
  212.                         write_nyr(9,day);
  213.                 }

  214.                     shijiankai1_Time();         //鬧鐘時間設置開
  215.                  shijianguan1_Time();         //鬧鐘時間設置關
  216.                     shijiankai2_Time();         //鬧鐘時間設置開
  217.                  shijianguan2_Time();         //鬧鐘時間設置關
  218. }

  219. void exter() interrupt 2//外部中斷1服務程序
  220. {        uchar c; //進入中斷表示鬧鐘時間到,
  221.         flag_ri=1; //設置標志位,用以大程序中報警提示
  222.         c=read_ds(0x0c);//讀取12C887的C寄存器表示響應了中斷
  223. }
復制代碼

所有資料51hei提供下載:
資料夾.zip (5.41 KB, 下載次數: 29)



評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:676699 發表于 2020-1-2 18:27 來自手機 | 只看該作者
你好,請問怎么通過按鍵設置時間呢?
回復

使用道具 舉報

板凳
ID:378116 發表于 2020-4-20 13:58 | 只看該作者
沒有電路圖嗎?
回復

使用道具 舉報

地板
ID:378116 發表于 2020-4-20 13:59 | 只看該作者
沒有電路圖嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品区二区三区日本 | 国产高清在线精品一区二区三区 | 中文字幕在线电影观看 | 亚洲欧美日韩一区 | 久久男人天堂 | 亚洲自拍偷拍免费视频 | 91色视频在线观看 | 久久久免费在线观看 | 国产高清视频一区二区 | 久久精品一区二区三区四区 | 日韩福利片 | 久久综合狠狠综合久久综合88 | 日韩1区| 九九热在线视频观看这里只有精品 | www国产亚洲精品久久网站 | 亚洲国产一区二区三区在线观看 | 亚洲精品电影网在线观看 | www.婷婷| 成人免费一区二区三区牛牛 | 精品一区二区电影 | www免费视频| 国产精品成人一区 | 免费福利视频一区二区三区 | 日本a∨精品中文字幕在线 亚洲91视频 | 久久久久久国产精品三区 | 91网站在线播放 | 爱综合 | 日韩在线精品 | 欧美天堂在线 | 成人av免费在线观看 | 欧美性影院| 91大神在线资源观看无广告 | 不卡的av在线 | 在线观看成人av | 亚洲天堂日韩精品 | 美女黄频 | 久久九九网站 | av中文字幕网 | 成人一区二区三区在线观看 | 亚洲 欧美 日韩在线 | 美女国内精品自产拍在线播放 |