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

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

QQ登錄

只需一步,快速開始

搜索
查看: 2913|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

DS1302時(shí)鐘程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:75926 發(fā)表于 2015-4-3 01:28 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
ds1302.h頭文件:http://www.zg4o1577.cn/bbs/dpj-32396-1.html
  1. //關(guān)閉DS1302充電二級(jí)管,不能對(duì)后備電池進(jìn)行充電,防止發(fā)脹
  2. //如果同時(shí)按下UP和DOWN鍵則初始化1302,該語(yǔ)句在while(1)前,只執(zhí)行一次,需要復(fù)位,防止誤操作
  3. #include <REGX51.H>                    
  4. #include "ds1302.h"   //包含DS1302頭文件
  5. #define leddata P0   //定義LED數(shù)據(jù)口
  6. #define sec 0x80   //1302秒寄存器地址
  7. #define min 0x82   //1302分寄存器地址
  8. #define hou 0x84   //1302時(shí)寄存器地址
  9. #define read 0x01   //讀操作,因?yàn)樽x的時(shí)候地址要加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位選,因?yàn)椴季不是按順序布的,程序定義一下就可以了,下同
  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. //**************函數(shù)聲明*****************
  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為調(diào)整模式用,不為0時(shí)表示調(diào)整模式,調(diào)整哪個(gè)量由id值確定
  28.            //timecount用于500ms定時(shí)記數(shù),時(shí)間到取反flag標(biāo)志位,re_disp記數(shù)200次共10s,調(diào)整狀態(tài)下按鍵無(wú)操作10s自動(dòng)返回正常顯示狀態(tài)
  29. bit hour,minute,second,flag;    //定義位變量,hour,minute,second分別為調(diào)整時(shí)閃爍標(biāo)志位,flag 500ms取反一次,調(diào)整位閃爍及冒號(hào)閃爍用
  30. unsigned char code tab[]={0x48,0xEE,0x54,0xC4,0xE2,0xC1,0x41,0xEC,0x40,0xC0,0x60}; //LED碼表,根據(jù)硬件修改
  31. unsigned char inittime[7]={0x00,0x00,0x12,0x16,0x11,0x06,0x04};      //初始化1302時(shí)用到的初始化數(shù)據(jù)
  32. //                          秒  分鐘 小時(shí)  日   月   年  星期
  33. void t0(void) interrupt 1 using 0   //中斷處理程序,主要用于取反標(biāo)志位,返回正常顯示狀態(tài)
  34. {
  35.    TH0=(65535-50000)/256; //50ms定時(shí)
  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)    //延時(shí)函數(shù)
  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)       //顯示函數(shù)
  52. {
  53. if(flag&hour)       //如hour為1表示調(diào)整時(shí),flag為1時(shí)不顯示
  54.   {
  55.    led0=0;leddata=0xff;delays(10);led0=1;    //這句中的0xff是數(shù)碼管的滅碼
  56.    led1=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);led1=1; //&~((unsigned char)~flag<<6)該句根據(jù)flag的值決定來(lái)顯示小數(shù)點(diǎn),為1時(shí)顯示,4個(gè)小數(shù)點(diǎn)組成兩對(duì)冒號(hào),下同
  57.   }
  58. else         //flag為0時(shí)顯示,產(chǎn)生閃爍效果,下同
  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是數(shù)碼管的滅碼
  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)    //鍵盤檢測(cè)函數(shù)
  85. {
  86. display();     //程序開頭調(diào)用顯示函數(shù)
  87. if(!SET)   
  88.   {
  89.    while(!SET)display(); //等待按鍵釋放,如一直按下一直調(diào)用顯示函數(shù),防止顯示中斷
  90.    re_disp=0;    //清除記數(shù),重新開始10s定時(shí)
  91.    id++;if(id>3)id=0;  //id加1,后面根據(jù)id值對(duì)應(yīng)調(diào)整項(xiàng)目
  92.   }
  93. if(id==0){hour=0;minute=0;second=0;} //根據(jù)id值跳到相應(yīng)處理函數(shù)
  94. if(id==1){hour=1;id_case1_key();}  //id為1,選擇調(diào)整小時(shí)位,閃爍標(biāo)志位置1,然后跳到鍵盤處理函數(shù),下同
  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)      //鍵盤處理函數(shù),只有按下set鍵時(shí)才會(huì)進(jìn)入,
  99. {
  100. display();        
  101.    if (!DOWN) //減少
  102.        {
  103.          while(!DOWN)display();   //等待按鍵釋放,如一直按下一直調(diào)用顯示函數(shù),防止顯示中斷
  104.    re_disp=0;      //清除記數(shù),重新開始10s定時(shí)
  105.       Set_id(id,0);     //跳到加減判斷函數(shù),下同,
  106.        }
  107.     if (!UP)  //增加
  108.        {
  109.          while(!UP)display();
  110.    re_disp=0;
  111.       Set_id(id,1);   
  112.        }
  113. }
  114. //根據(jù)選擇調(diào)整相應(yīng)項(xiàng)目并寫入DS1302
  115. void Set_id(unsigned char sel,unsigned char sel_1)  //執(zhí)行調(diào)整項(xiàng)目的函數(shù)
  116. {
  117.    signed char max,mini,address,item;   
  118. if(sel==1)  {address=hou; max=23;mini=0;}    //小時(shí) //根據(jù)id值確定要調(diào)整的項(xiàng),并確定調(diào)整上下限,下同
  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; //從相應(yīng)的地址讀取當(dāng)前數(shù)據(jù)并轉(zhuǎn)換為十進(jìn)制
  122.    if (sel_1==0) item--;  else item++;        //確定是對(duì)項(xiàng)目加還是減,并對(duì)越限處理
  123.   if(item>max) item=mini;  
  124.    if(item<mini) item=max;
  125. Write1302(0x8e,0x00);//允許寫操作
  126.    Write1302(address,item/10*16+item%10);       //將調(diào)整結(jié)果轉(zhuǎn)換成壓縮BCD碼重新寫入1302
  127.    Write1302(0x8e,0x80);//寫保護(hù),禁止寫操作  
  128. }
  129. void main()       //主函數(shù)
  130. {  
  131.   TMOD=0x01;     //初始化定時(shí)器
  132.     TH0=(65535-50000)/256;
  133.     TL0=(65535-50000)%256;
  134.     EA=1;
  135.     ET0=1;
  136.   TR0=1;
  137.   Write1302(0x90,0xa0);//關(guān)閉充電二級(jí)管,不能對(duì)后備電池進(jìn)行充電,防止發(fā)脹,原來(lái)的程序是打開的請(qǐng)關(guān)閉
  138.    Write1302(0x8e,0x80);//寫保護(hù),禁止寫操作
  139.   if(!UP&!DOWN)Set1302(inittime);   //如果同時(shí)按下UP和DOWN鍵則初始化1302,該語(yǔ)句在while(1)前,只執(zhí)行一次,需要復(fù)位,防止誤操作
  140.   while(1)
  141.    {  
  142.     Scan_Key();      //主程序一直調(diào)用鍵盤檢測(cè)函數(shù)即可
  143.    }
  144. }
復(fù)制代碼


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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美一级大片免费观看 | 欧美日韩在线精品 | 一区二区在线观看av | 成人九色 | 羞羞网站在线观看 | 国产一区二区影院 | 精品久久久久久中文字幕 | 麻豆视频国产在线观看 | 欧美日韩国产中文 | 91久久国产精品 | 精品成人一区二区 | 久久精品国产一区二区 | 亚洲中午字幕 | 一级大片| 成人一区二区三区在线观看 | 91欧美激情一区二区三区成人 | 中文字幕在线观看成人 | 久久精品国产一区二区三区不卡 | 日韩在线| 成人一级视频在线观看 | 情侣酒店偷拍一区二区在线播放 | 激情国产 | 久久久久久国产 | 一区二区日本 | 自拍偷拍第一页 | 羞羞的视频在线观看 | 视频在线亚洲 | 91中文字幕在线 | 国产精品久久久久久久岛一牛影视 | 欧美一级免费黄色片 | 欧美高清hd | 午夜影院在线观看版 | 国产97人人超碰caoprom | 日本精品在线一区 | 日本在线观看视频 | 成人中文字幕av | 国产成人综合在线 | 久久久成人动漫 | 国产精品一级 | 欧美一级片在线 | 久久国产精品久久久久 |