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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DS1302時鐘程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:75926 發表于 2015-4-3 01:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
ds1302.h頭文件:http://www.zg4o1577.cn/bbs/dpj-32396-1.html
  1. //關閉DS1302充電二級管,不能對后備電池進行充電,防止發脹
  2. //如果同時按下UP和DOWN鍵則初始化1302,該語句在while(1)前,只執行一次,需要復位,防止誤操作
  3. #include <REGX51.H>                    
  4. #include "ds1302.h"   //包含DS1302頭文件
  5. #define leddata P0   //定義LED數據口
  6. #define sec 0x80   //1302秒寄存器地址
  7. #define min 0x82   //1302分寄存器地址
  8. #define hou 0x84   //1302時寄存器地址
  9. #define read 0x01   //讀操作,因為讀的時候地址要加1,使最低位為1
  10. sbit MODE=P3^4;    //按鍵定義,下同
  11. sbit SET=P3^5;
  12. sbit UP=P3^6;
  13. sbit DOWN=P3^7;
  14. sbit led0=P2^0;    //LED位選,因為布線不是按順序布的,程序定義一下就可以了,下同
  15. sbit led1=P2^3;
  16. sbit led2=P2^7;
  17. sbit led3=P2^4;
  18. sbit led4=P2^6;
  19. sbit led5=P2^5;
  20. //**************函數聲明*****************
  21. void delays(unsigned char);
  22. void display(void);
  23. void Scan_Key(void);
  24. void id_case1_key();
  25. void Set_id(unsigned char ,unsigned char);
  26. //*************變量定義******************
  27. unsigned char id=0,timecount,re_disp=0;  //定義用到的變量,id為調整模式用,不為0時表示調整模式,調整哪個量由id值確定
  28.            //timecount用于500ms定時記數,時間到取反flag標志位,re_disp記數200次共10s,調整狀態下按鍵無操作10s自動返回正常顯示狀態
  29. bit hour,minute,second,flag;    //定義位變量,hour,minute,second分別為調整時閃爍標志位,flag 500ms取反一次,調整位閃爍及冒號閃爍用
  30. unsigned char code tab[]={0x48,0xEE,0x54,0xC4,0xE2,0xC1,0x41,0xEC,0x40,0xC0,0x60}; //LED碼表,根據硬件修改
  31. unsigned char inittime[7]={0x00,0x00,0x12,0x16,0x11,0x06,0x04};      //初始化1302時用到的初始化數據
  32. //                          秒  分鐘 小時  日   月   年  星期
  33. void t0(void) interrupt 1 using 0   //中斷處理程序,主要用于取反標志位,返回正常顯示狀態
  34. {
  35.    TH0=(65535-50000)/256; //50ms定時
  36.    TL0=(65535-50000)%256;  
  37.    timecount++;re_disp++;
  38.    if(timecount>9)
  39.      {
  40.    timecount=0;
  41.       flag=~flag;
  42.      }
  43. if(re_disp>200){re_disp=0;if(id)id=0;}
  44. }
  45. void delays(unsigned char k)    //延時函數
  46. {
  47. unsigned char i,j;
  48. for(i=0;i<k;i++)
  49.   for(j=0;j<50;j++);
  50. }
  51. void display(void)       //顯示函數
  52. {
  53. if(flag&hour)       //如hour為1表示調整時,flag為1時不顯示
  54.   {
  55.    led0=0;leddata=0xff;delays(10);led0=1;    //這句中的0xff是數碼管的滅碼
  56.    led1=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);led1=1; //&~((unsigned char)~flag<<6)該句根據flag的值決定來顯示小數點,為1時顯示,4個小數點組成兩對冒號,下同
  57.   }
  58. else         //flag為0時顯示,產生閃爍效果,下同
  59.   {
  60.    leddata=tab[Read1302(hou|read)/16];led0=0;delays(10);led0=1;
  61.    leddata=tab[Read1302(hou|read)%16]&~((unsigned char)~flag<<6);led1=0;delays(10);led1=1;
  62.   }
  63. if(flag&minute)
  64.   {
  65.    led2=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);led2=1;    //這句中的0xff是數碼管的滅碼
  66.    led3=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);led3=1;
  67.   }
  68. else
  69.   {
  70.    leddata=tab[Read1302(min|read)/16]&~((unsigned char)~flag<<6);led2=0;delays(10);led2=1;
  71.    leddata=tab[Read1302(min|read)%16]&~((unsigned char)~flag<<6);led3=0;delays(10);led3=1;
  72.   }
  73. if(flag&second)
  74.   {
  75.    led4=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);led4=1;
  76.    led5=0;leddata=0xff;delays(10);led5=1;
  77.   }
  78. else
  79.   {
  80.    leddata=tab[Read1302(sec|read)/16]&~((unsigned char)~flag<<6);led4=0;delays(10);led4=1;
  81.    leddata=tab[Read1302(sec|read)%16];led5=0;delays(10);led5=1;
  82.   }
  83. }
  84. void Scan_Key(void)    //鍵盤檢測函數
  85. {
  86. display();     //程序開頭調用顯示函數
  87. if(!SET)   
  88.   {
  89.    while(!SET)display(); //等待按鍵釋放,如一直按下一直調用顯示函數,防止顯示中斷
  90.    re_disp=0;    //清除記數,重新開始10s定時
  91.    id++;if(id>3)id=0;  //id加1,后面根據id值對應調整項目
  92.   }
  93. if(id==0){hour=0;minute=0;second=0;} //根據id值跳到相應處理函數
  94. if(id==1){hour=1;id_case1_key();}  //id為1,選擇調整小時位,閃爍標志位置1,然后跳到鍵盤處理函數,下同
  95. if(id==2){hour=0;minute=1;id_case1_key();}
  96. if(id==3){minute=0;second=1;id_case1_key();}
  97. }
  98. void id_case1_key(void)      //鍵盤處理函數,只有按下set鍵時才會進入,
  99. {
  100. display();        
  101.    if (!DOWN) //減少
  102.        {
  103.          while(!DOWN)display();   //等待按鍵釋放,如一直按下一直調用顯示函數,防止顯示中斷
  104.    re_disp=0;      //清除記數,重新開始10s定時
  105.       Set_id(id,0);     //跳到加減判斷函數,下同,
  106.        }
  107.     if (!UP)  //增加
  108.        {
  109.          while(!UP)display();
  110.    re_disp=0;
  111.       Set_id(id,1);   
  112.        }
  113. }
  114. //根據選擇調整相應項目并寫入DS1302
  115. void Set_id(unsigned char sel,unsigned char sel_1)  //執行調整項目的函數
  116. {
  117.    signed char max,mini,address,item;   
  118. if(sel==1)  {address=hou; max=23;mini=0;}    //小時 //根據id值確定要調整的項,并確定調整上下限,下同
  119. if(sel==2)  {address=min; max=59;mini=0;}    //分鐘
  120.    if(sel==3)  {address=sec; max=0;mini=0;}     //秒
  121.    item=Read1302(address|read)/16*10+Read1302(address|read)%16; //從相應的地址讀取當前數據并轉換為十進制
  122.    if (sel_1==0) item--;  else item++;        //確定是對項目加還是減,并對越限處理
  123.   if(item>max) item=mini;  
  124.    if(item<mini) item=max;
  125. Write1302(0x8e,0x00);//允許寫操作
  126.    Write1302(address,item/10*16+item%10);       //將調整結果轉換成壓縮BCD碼重新寫入1302
  127.    Write1302(0x8e,0x80);//寫保護,禁止寫操作  
  128. }
  129. void main()       //主函數
  130. {  
  131.   TMOD=0x01;     //初始化定時器
  132.     TH0=(65535-50000)/256;
  133.     TL0=(65535-50000)%256;
  134.     EA=1;
  135.     ET0=1;
  136.   TR0=1;
  137.   Write1302(0x90,0xa0);//關閉充電二級管,不能對后備電池進行充電,防止發脹,原來的程序是打開的請關閉
  138.    Write1302(0x8e,0x80);//寫保護,禁止寫操作
  139.   if(!UP&!DOWN)Set1302(inittime);   //如果同時按下UP和DOWN鍵則初始化1302,該語句在while(1)前,只執行一次,需要復位,防止誤操作
  140.   while(1)
  141.    {  
  142.     Scan_Key();      //主程序一直調用鍵盤檢測函數即可
  143.    }
  144. }
復制代碼


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人福利在线视频 | 日韩亚洲一区二区 | 国产高清一二三区 | 成人免费大片黄在线播放 | 亚洲美女一区 | 亚洲欧美国产精品一区二区 | 91精品国产一区二区三区 | 超碰97免费在线 | 亚洲一区二区三区在线 | 精品1区2区 | 91亚洲视频在线 | 成人午夜影院 | 亚洲精品一 | 一区二区三区高清 | 亚洲电影免费 | av在线二区 | 刘亦菲国产毛片bd | 能看的av| 久久综合九色综合欧美狠狠 | 欧美高清成人 | 欧美一区二区视频 | 999re5这里只有精品 | 91xxx在线观看| 黄色国产在线播放 | 国产成在线观看免费视频 | 中文成人在线 | 一级毛片免费完整视频 | 欧美一区二区在线观看 | 久草热播 | 欧美精品乱码久久久久久按摩 | 久久专区 | 在线免费中文字幕 | 麻豆hd| 国产精品高潮呻吟久久 | 免费午夜视频 | 欧美日韩国产一区二区三区 | 日本一区视频在线观看 | 在线观看视频中文字幕 | 成年视频在线观看福利资源 | www操操| 日日碰狠狠躁久久躁96avv |