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

QQ登錄

只需一步,快速開(kāi)始

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

單片機(jī)多功能時(shí)鐘程序 溫度計(jì)+鬧鐘+整點(diǎn)報(bào)時(shí)+正計(jì)時(shí)器+倒計(jì)時(shí)器+計(jì)數(shù)器

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
功能:實(shí)時(shí)時(shí)鐘+溫度計(jì)+鬧鐘+整點(diǎn)報(bào)時(shí)+正計(jì)時(shí)器+倒計(jì)時(shí)器+計(jì)數(shù)器

電路原理圖如下:


多功能時(shí)鐘 元件清單


1·一寸數(shù)碼管                       4個(gè)
2·單片機(jī)STC89C51RC         1個(gè)
3·DIP40芯片底座                 1個(gè)
4·PCB電路板                        1個(gè)
5·按鍵(帶鐵架)               3個(gè)
6·DS1302芯片                      1個(gè)
7·DIP8芯片底座                   1個(gè)
8·32.768K晶振                     1個(gè)
10·蜂鳴器                             1個(gè)
11·紐扣電池槽                     1個(gè)
12·紐扣電池                         1個(gè)
13·DC電源座                       1個(gè)
14·三極管S8550                  5個(gè)
15·12M晶振                         1個(gè)
16·30P瓷片電容                  2個(gè)
17·104(0.1UF)瓷片電容       1個(gè)
18·光敏電阻                         1個(gè)
19·DS18B20溫度傳感器      1個(gè)
20·47電阻                            8個(gè)
21·4.7K電阻                         6個(gè)
22·10K電阻                          1個(gè)
23·3P空心插針                    1個(gè)
24·USB供電線(xiàn)                      1個(gè)



單片機(jī)源程序:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define smg_data    P0//定義數(shù)碼管數(shù)據(jù)

  6. sbit smg1=P2^4;//位碼1聲明 時(shí)
  7. sbit smg2=P2^5;//位碼2聲明
  8. sbit smg3=P2^6;//位碼3聲明 分
  9. sbit smg4=P2^7;//位碼4聲明
  10. sbit smg5=P1^6;//位碼5聲明 秒
  11. sbit smg6=P1^7;//位碼6聲明
  12. sbit gm=P1^3; //黑暗時(shí)等于1
  13. sbit k1=P1^2; //按鍵k1的聲明
  14. sbit k2=P1^1; //按鍵k2的聲明
  15. sbit k3=P1^0; //按鍵k3的聲明

  16. sbit bell=P3^7;        //蜂鳴器聲明
  17. sbit clk_ds1302=P2^0;//定義控制DS1302的時(shí)鐘線(xiàn)
  18. sbit io_ds1302=P2^1;//定義控制DS1302的串行數(shù)據(jù)
  19. sbit rest_ds1302=P2^2;

  20. const uchar tab1[16]={//共陽(yáng)數(shù)碼管段碼表
  21. 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x86,0x87,0xFF,0xc6,0xbf,0xff};
  22. //0        ,1        ,2        ,3        ,4        ,5        ,6        ,7        ,8        ,9        ,                       
  23. const uchar tab2[16]={//數(shù)碼管3特殊處理用的段碼表
  24. 0xc0,0xf9,0x64,0x70,0x59,0x52,0x42,0xf8,0x40,0x50,0x86,0x87,0xFF,0xc6,0x7f,0xff};
  25.                         //    C      -
  26. bit gm_en=0,zdbs_en=0;//光敏使能信號(hào)/整點(diǎn)報(bào)時(shí)使能信號(hào)
  27. uchar gm_time=40; //光敏控制亮度值
  28. char shi,fen,miao,b_shi=7,b_fen=0; //必須是有符號(hào)型:數(shù)據(jù)暫存單元shi/fen/miao,鬧鈴時(shí)間b_shi,b_fen,
  29. uchar hour,minute,second,n=0,a=0,b=0;//從1302讀出的實(shí)時(shí)時(shí)間數(shù)據(jù)hour,minute,second,        b控制字符閃爍
  30. uchar tab23[3];//={0x40,0x59,0x23,0x28,0x11,0x06,0x09};//首次上電時(shí)默認(rèn)的時(shí)間
  31. uchar bell_en=0,x=1;//鬧鐘使能信號(hào),任意鍵關(guān)閉鈴聲標(biāo)志位
  32. char zjs_en=0,zjs_shi=0,zjs_fen=0,djs_en=0,djs_shi=60,djs_fen=0,jsq_shi=0,jsq_fen=0;
  33. void key();
  34. void  delay_3us();//3US的延時(shí)程序
  35. void  delay_50us(uint t);//延時(shí)50*T微妙函數(shù)的聲明
  36. void  display(uchar shi,fen,miao);//顯示子程序
  37. void  set_ds1302();//設(shè)置時(shí)間
  38. void  get_ds1302();//讀取當(dāng)前時(shí)間
  39. void  w_1byte_ds1302(uchar t);//向DS1302寫(xiě)一個(gè)字節(jié)的數(shù)據(jù)
  40. uchar r_1byte_ds1302();//從DS1302讀一個(gè)字節(jié)的數(shù)據(jù)
  41. void init(); //初始化函數(shù)

  42. void baojing()//報(bào)警函數(shù)
  43. {
  44.          uint j=10,i=10;
  45.          bell=0;
  46.          while(i--)display(shi,fen,miao);
  47.          bell=1;
  48.          while(j--)display(shi,fen,miao);
  49. }

  50. /******溫度傳感器18b20  IO引腳定義********/
  51. sbit DS=P2^3;           //定義DS18B20接口
  52. uchar ly_dis[4];                //定義顯示溫度的緩沖區(qū)
  53. float tt;                        //定義浮點(diǎn)型變量tt存放溫度值
  54. uchar temp_en=0;
  55. uchar wendu=0;
  56. uint t=0;

  57. /**********18b20延時(shí)子函數(shù) *************/
  58. void delayb(uint count)
  59. {
  60.   uint i;
  61.   while(count)
  62.   {
  63.     i=200;
  64.     while(i>0)
  65.     i--;
  66.     count--;
  67.   }
  68. }

  69. /*********DS18B20初始化************/
  70. void dsreset(void)
  71. {
  72.   uint i;
  73.   DS=0;
  74.   i=103;
  75.   while(i>0)i--;
  76.   DS=1;
  77.   i=4;
  78.   while(i>0)i--;
  79. }

  80. /**********18b20讀一位***********/
  81. bit tmpreadbit(void)
  82. {
  83.    uint i;
  84.    bit dat;
  85.    DS=0;
  86.    i++;          //小延時(shí)一下
  87.    DS=1;
  88.    i++;i++;
  89.    dat=DS;
  90.    i=8;
  91.    while(i>0)i--;
  92.    return (dat);
  93. }

  94. /**********18b20讀一個(gè)**********/
  95. uchar tmpread(void)
  96. {
  97.   uchar i,j,dat;
  98.   dat=0;
  99.   for(i=1;i<=8;i++)
  100.   {
  101.     j=tmpreadbit();
  102.     dat=(j<<7)|(dat>>1);   //讀出的數(shù)據(jù)最低位在最前面,這樣剛好//一個(gè)字節(jié)在DAT里
  103.   }
  104.   return(dat);             //將一個(gè)字節(jié)數(shù)據(jù)返回
  105. }

  106. /**********18b20寫(xiě)一個(gè)字節(jié)**********/
  107. void tmpwritebyte(uchar dat)
  108. {
  109.   uint i;
  110.   uchar j;
  111.   bit testb;
  112.   for(j=1;j<=8;j++)
  113.   {
  114.     testb=dat&0x01;
  115.     dat=dat>>1;
  116.     if(testb)     // 寫(xiě)1部分
  117.     {
  118.       DS=0;
  119.       i++;i++;
  120.       DS=1;
  121.       i=8;
  122.           while(i>0)i--;
  123.     }
  124.     else
  125.     {
  126.       DS=0;       //寫(xiě)0部分
  127.       i=8;
  128.           while(i>0)i--;
  129.       DS=1;
  130.       i++;i++;
  131.     }
  132.   }
  133. }

  134. /***********18b20發(fā)送溫度轉(zhuǎn)換命令*************/
  135. void tmpchange(void)
  136. {
  137.   dsreset();             //初始化DS18B20
  138.   delayb(1);             //延時(shí)
  139.   tmpwritebyte(0xcc);  // 跳過(guò)序列號(hào)命令
  140.   tmpwritebyte(0x44);  //發(fā)送溫度轉(zhuǎn)換命令
  141. }

  142. /***********獲得溫度************/
  143. int tmp()
  144. {
  145.   int temp;
  146.   uchar a,b;
  147.   dsreset();
  148.   delayb(1);

  149.   tmpwritebyte(0xcc);  
  150.   tmpwritebyte(0xbe);   //發(fā)送讀取數(shù)據(jù)命令

  151.   a=tmpread();          //連續(xù)讀兩個(gè)字節(jié)數(shù)據(jù)
  152.   b=tmpread();
  153.   temp=b;
  154.   temp<<=8;
  155.   temp=temp|a;                 //兩字節(jié)合成一個(gè)整型變量。
  156.   return temp;     //返回溫度值
  157. }
  158. void dis_temp()
  159. {        
  160.         tmpchange();              //溫度轉(zhuǎn)換
  161.         tt=tmp()*0.0625;          //得到真實(shí)十進(jìn)制溫度值,因?yàn)镈S18B20
  162.         wendu=tt;                                                                //可以精確到0.0625度,所以讀回?cái)?shù)據(jù)的最低位代表的是0.0625度。
  163.         if(tt<0)        //判斷第一位顯示整數(shù)還是負(fù)號(hào)
  164.         tt=0;        
  165.         if((wendu%100/10)<1) //如果溫度小于10,不顯示十位
  166.         smg1=1;
  167.         else
  168.         {
  169.                 smg_data=tab1[wendu%100/10];//送顯示斷碼  十位
  170.                 smg1=0;
  171.                 delay_50us(gm_time);
  172.                 smg1=1;
  173.         }
  174.         smg_data=tab1[wendu%10];//送顯示斷碼  個(gè)位
  175.         smg2=0;
  176.         delay_50us(gm_time);
  177.         smg2=1;
  178.         smg_data=tab1[10];//送顯示斷碼  ℃
  179.         smg3=0;
  180.         delay_50us(gm_time);
  181.         smg3=1;        
  182.         smg4=1;
  183. }
  184. //***********************************************************************
  185. //主程序
  186. void main()
  187. {        
  188.         tmpchange();              //溫度轉(zhuǎn)換,為了消除首次顯示的85,每次提前轉(zhuǎn)換一次即可解決
  189.     init();
  190.         gm=1;
  191.         while(1)
  192.     {        
  193.                 if(n==0&&temp_en==1)
  194.                 dis_temp();//每15秒切換顯示溫度一次
  195.                 else
  196.                 {
  197.                         get_ds1302();
  198.                         display(shi,fen,miao);
  199.                         key();
  200.                         if(n==0&&x==1&&bell_en==1&&b_shi==hour&&b_fen==minute)
  201.                         baojing();
  202.                         if(hour==b_shi&&minute==b_fen+1)x=1;
  203.                 }
  204.                 if(gm_en==1)//光敏控制亮度開(kāi)關(guān)
  205.                 {
  206.                         if(gm==1)
  207.                         gm_time=1;
  208.                         else gm_time=40;
  209.                 }
  210.                 else gm_time=40;
  211.                 if(zdbs_en==1&&n==0&&minute==0&&miao==0)//整點(diǎn)報(bào)時(shí)開(kāi)關(guān)
  212.                 baojing();                                                                 
  213.     }
  214. }

  215. //數(shù)碼管顯示程序
  216. void  display(uchar s,f,m)
  217. {
  218.    if((s/10)<1) smg1=1;
  219.    else
  220.    {
  221.            smg_data=tab1[s/10];//送顯示斷碼  時(shí)
  222.            if((n==1||n==3)&&a<5)
  223.            smg1=1;//鎖存數(shù)據(jù)
  224.            else smg1=0;
  225.            delay_50us(gm_time);
  226.            smg1=1;        
  227.    }

  228.    if((n==1||n==3)&&a<5)        smg_data=0x7f; //字符閃爍,小點(diǎn)不閃
  229.    else if(b>=10)                        smg_data=tab1[s%10]-0x80;//小點(diǎn)閃爍,字符不閃
  230.    else                                         smg_data=tab1[s%10];//送顯示斷碼
  231.    smg2=0;
  232.    delay_50us(gm_time);
  233.    smg2=1;

  234.    if((n==2||n==4)&&a<5)         smg_data=0xbf;//b是控制小數(shù)點(diǎn)閃爍的,需要閃爍的時(shí)候他等于a
  235.    else if(b>=10)                        smg_data=tab2[f/10]&0xbf; //顯示小點(diǎn)//送顯示斷碼
  236.    else                                                smg_data=tab2[f/10];//送顯示斷碼         分
  237.    smg3=0;//鎖存數(shù)據(jù)
  238.    delay_50us(gm_time);
  239.    smg3=1;         

  240.    if(bell_en==1)         smg_data=tab1[f%10]-0x80;//送顯示斷碼
  241.    else                         smg_data=tab1[f%10];//送顯示斷碼
  242.    if((n==2||n==4)&&a<5)
  243.    smg4=1;//鎖存數(shù)據(jù)
  244.    else smg4=0;
  245.    delay_50us(gm_time);
  246.    smg4=1;
  247. /**************秒,不需要顯示********************/   
  248.    smg_data=tab2[m/10];//送顯示斷碼   秒
  249.    smg5=0;//鎖存數(shù)據(jù)
  250.    delay_50us(40);
  251.    smg5=1;

  252.    smg_data=tab1[m%10];//送顯示斷碼
  253.    smg6=0;//鎖存數(shù)據(jù)
  254.    delay_50us(40);
  255.    smg6=1;
  256. /*********************************************/

  257. }
  258. void key() //按鍵控制函數(shù)
  259. {
  260.         if(k2==0&&k3==0) //k2k3同時(shí)按下,切換鬧鈴開(kāi)關(guān) 并且在按下之后查看鬧鐘時(shí)間松手后恢復(fù)時(shí)間顯示
  261.         {
  262.                 delay_50us(1);
  263.                 if(k2==0&&k3==0)
  264.                 {        
  265.                         shi=b_shi;
  266.                         fen=b_fen;
  267.                         bell_en=!bell_en;
  268.                         baojing();
  269.                         baojing();
  270.                         while(k2==0&&k3==0)display(shi,fen,miao);//等待松手
  271.                         shi=hour;
  272.                         fen=minute;
  273.                 }
  274.         }
  275.         
  276.         if(k1==0&&k3==0) //k1k3同時(shí)按下,切換鬧鈴開(kāi)關(guān) 并且在按下之后查看鬧鐘時(shí)間松手后恢復(fù)時(shí)間顯示
  277.         {
  278.                 delay_50us(1);
  279.                 if(k1==0&&k3==0)
  280.                 {        
  281.                         gm_en=!gm_en;
  282.                         if(gm_en==1)//使能的話(huà)報(bào)警兩聲
  283.                         {baojing();baojing();}
  284.                         else baojing();//無(wú)效的話(huà)報(bào)警一聲
  285.                         while(k1==0&&k3==0)display(shi,fen,miao);//等待松手
  286.                 }
  287.         }
  288.         if(k1==0&&k2==0) //k1k2同時(shí)按下,切換整點(diǎn)報(bào)時(shí)開(kāi)關(guān)
  289.         {
  290.                 delay_50us(1);
  291.                 if(k1==0&&k2==0)
  292.                 {        
  293.                         zdbs_en=!zdbs_en;
  294.                         if(zdbs_en==1)//使能的話(huà)報(bào)警兩聲
  295.                         {baojing();baojing();}
  296.                         else baojing();//無(wú)效的話(huà)報(bào)警一聲        
  297.                         while(k1==0&&k2==0)display(shi,fen,miao);//等待松手
  298.                 }
  299.         }
  300.         if(n==0&&(k2==0||k3==0)&&bell_en==1&&b_shi==hour&&b_fen==minute&&x==1)
  301.         { //功能鍵k1被按下
  302.                 delay_50us(1);//消抖延時(shí)
  303.                 if(n==0&&(k2==0||k3==0)&&bell_en==1&&b_shi==hour&&b_fen==minute&&x==1)
  304.                 {        
  305.                         x=0;   //如果處于響零狀態(tài),就任意鍵關(guān)閉響鈴
  306.                         while(k1==0)display(shi,fen,miao);//等待松手
  307.                 }
  308.         }
  309.         if(k1==0)
  310.         { //功能鍵k1被按下
  311.                 delay_50us(1);//消抖延時(shí)
  312.                 if(k1==0)
  313.                 {        
  314.                         uint i=0;
  315.                         while(k1==0)
  316.                         {
  317.                                 display(shi,fen,miao);//等待松手
  318.                                 i++;
  319.                                 if(i>(2*(70-gm_time))){n=0;baojing();baojing();break;}//長(zhǎng)按K1退出
  320.                         }
  321.                         if(bell_en==1&&b_shi==hour&&b_fen==minute&&x==1)x=0;   //如果處于響零狀態(tài),就任意鍵關(guān)閉響鈴
  322.                         else if(i<=(2*(70-gm_time)))
  323.                         {
  324.                                 n++;//n記錄功能鍵狀態(tài)
  325.                                 if(n>7)  n=0; //n清零
  326.                                 baojing();        
  327.                         }
  328.                         i=0;                        
  329.                 }
  330.         }

  331.         if(n==0)//狀態(tài)0,正常顯示時(shí)間
  332.         {
  333.                 b=a; //b是控制小數(shù)點(diǎn)閃爍的
  334.                 shi=hour;
  335.                 fen=minute;
  336.                 miao=second;
  337.         }        
  338.         if(n==1)//狀態(tài)1:調(diào)節(jié)時(shí)間的“時(shí)”
  339.         {
  340.                 b=10;
  341.                 if(k2==0)
  342.                 { //k2被按下
  343.                         uint i=6,j=10;
  344.                         while(i--)display(shi,fen,miao);//長(zhǎng)按連續(xù)遞減                        
  345.                         if(k2==0)
  346.                         {
  347.                                 shi++;//小時(shí)加一
  348.                                 if(shi==24)
  349.                                 shi=0;//達(dá)到24清零        
  350.                         }
  351.                          while(j--)display(shi,fen,miao);//長(zhǎng)按連續(xù)遞減
  352.                 }
  353.                
  354.                 if(k3==0)
  355.                 {  //k3被按下
  356.                         uint i=6,j=10;
  357.                         while(i--)display(shi,fen,miao);//長(zhǎng)按連續(xù)遞減        
  358.                         if(k3==0)
  359.                         {
  360.                                 shi--; //小時(shí)減一
  361.                                 if(shi<0)
  362.                                 shi=23;//小于0,重新復(fù)制
  363.                         }
  364.                         while(j--)display(shi,fen,miao);//長(zhǎng)按連續(xù)遞減
  365.                 }               
  366.         }
  367.         if(n==2)//狀態(tài)2:調(diào)節(jié)時(shí)間的“分”
  368.         {        b=10;
  369.                  if(k2==0)
  370.                 { //k2被按下
  371.                         uint i=6,j=10;
  372.                         while(i--)display(shi,fen,miao);//長(zhǎng)按連續(xù)遞減
  373.                         if(k2==0)
  374.                         {
  375.                                 fen++;//分加一
  376.                                 if(fen==60)
  377.                                 fen=0;//分到達(dá)60 分清零        
  378.                         }        
  379.                         while(j--)display(shi,fen,miao);//長(zhǎng)按連續(xù)遞減
  380.                 }
  381.                
  382.                 if(k3==0)
  383.                 {  //k3被按下
  384.                         uint i=6,j=10;
  385.                         while(i--)display(shi,fen,miao);//長(zhǎng)按連續(xù)遞減
  386.                         if(k3==0)
  387.                         {
  388.                                 fen--;//分減一
  389.                                 if(fen<0)
  390.                                 fen=59;//分小于0,分重新賦值59                                          
  391.                         }
  392.                         while(j--)display(shi,fen,miao);//長(zhǎng)按連續(xù)遞減
  393.                 }
  394.                 tab23[2]=shi/10*16+shi%10;
  395.         tab23[1]=fen/10*16+fen%10;
  396.         hour=shi;
  397.         minute=fen;
  398.         second=0;
  399.         tab23[0]=0;
  400.         set_ds1302();//設(shè)置DS1302的初始時(shí)間               
  401.         }
  402.         
  403.         if(n==3)//狀態(tài)三:調(diào)節(jié)鬧鈴“時(shí)”
  404.         {        
  405.                 shi=b_shi;
  406.                 fen=b_fen;
  407.                 b=10;
  408.                 if(k2==0)
  409.                 {  //k2被按下
  410.                         uint i=6,j=10;
  411.                         while(i--)display(shi,fen,miao);//長(zhǎng)按連續(xù)遞減
  412.                         if(k2==0)
  413.                         {
  414.                                 b_shi++;//鬧鈴時(shí)間加一
  415.                                 if(b_shi==24)
  416.                                 b_shi=0;//鬧鈴時(shí)間清零        
  417.                         }
  418.                         while(j--)display(shi,fen,miao);//長(zhǎng)按連續(xù)遞減
  419.                 }
  420.                
  421.                 if(k3==0)
  422.                 {  //k3被按下
  423.                         uint i=6,j=10;
  424.                         while(i--)display(shi,fen,miao);//長(zhǎng)按連續(xù)遞減
  425.                         if(k3==0)
  426.                         {
  427.                                 b_shi--;//鬧鈴時(shí)間減一
  428.                                 if(b_shi<0)
  429.                                 b_shi=23;//鬧鈴時(shí)間        
  430.                         }
  431.                         while(j--)display(shi,fen,miao);//長(zhǎng)按連續(xù)遞減
  432.                 }               
  433.         }

  434.         if(n==4)//狀態(tài)四 :調(diào)節(jié)鬧鈴的”分“
  435.         {        b=10;
  436.         shi=b_shi;
  437.                 fen=b_fen;
  438.                 if(k2==0)
  439.                 {  //k2被按下
  440.                         uint i=6,j=10;
  441.                         while(i--)display(shi,fen,miao);//長(zhǎng)按連續(xù)遞減
  442.                         if(k2==0)
  443.                         {
  444.                                 b_fen++;//鬧鈴時(shí)間分加一
  445.                                 if(b_fen==60)
  446.                                 b_fen=0;//鬧鈴分到達(dá)60 清零        
  447.                         }        
  448.                         while(j--)display(shi,fen,miao);//長(zhǎng)按連續(xù)遞減
  449.                 }
  450.                
  451.                 if(k3==0)
  452.                 {  //k3被按下
  453.                         uint i=6,j=10;
  454.                         while(i--)display(shi,fen,miao);//長(zhǎng)按連續(xù)遞減
  455.                         if(k3==0)
  456.                         {
  457.                                 b_fen--;//鬧鈴時(shí)間分減一
  458.                                 if(b_fen<0)
  459.                                 b_fen=59;//鬧鈴時(shí)間分重新賦值
  460.                         }
  461.                         while(j--)display(shi,fen,miao);//長(zhǎng)按連續(xù)遞減                        
  462.                 }               
  463.         }
  464.         if(n==5)//狀態(tài)5 :正計(jì)時(shí)
  465.         {
  466.                 b=10; //顯示小點(diǎn)
  467.                 shi=zjs_shi;
  468.                 fen=zjs_fen;
  469.                 if(k2==0)
  470.                 {  //k2被按下
  471.                         delay_50us(1);//消抖延時(shí)
  472.                         if(k2==0)
  473.                         {        
  474.                                 zjs_en=!zjs_en;        
  475.                                 baojing();
  476.                                 while(k2==0)display(shi,fen,miao);//等待松手
  477.                         }
  478.                 }
  479.                
  480.                 if(k3==0)
  481.                 {  //k3被按下
  482.                         delay_50us(1);//消抖延時(shí)
  483.                         if(k3==0)
  484.                         {
  485.                                 zjs_shi=0;
  486.                                 zjs_fen=0;
  487.                                 baojing();
  488.                                 while(k3==0)display(shi,fen,miao);//等待松手        
  489.                         }
  490.                 }               
  491.         }
  492.         if(n==6)//狀態(tài)5 :倒計(jì)時(shí)
  493.         {        b=10; //顯示小點(diǎn)
  494.         shi=djs_shi;
  495.                 fen=djs_fen;
  496.                 if(k2==0)
  497.                 {  //k2被按下
  498.                         delay_50us(1);//消抖延時(shí)
  499.                         if(k2==0)
  500.                         {        
  501.                                 djs_en=!djs_en;        
  502.                                 baojing();
  503.                                 while(k2==0)display(shi,fen,miao);//等待松手
  504.                         }
  505.                 }
  506.                
  507.                 if(k3==0&&djs_en==0)
  508.                 {  //k3被按下
  509.                         uint i=6,j=10;
  510.                         while(i--)display(shi,fen,miao);//長(zhǎng)按連續(xù)遞減
  511.                         if(k3==0)
  512.                         {
  513.                                 djs_shi--;
  514.                                 if(djs_shi<0)
  515.                                 djs_shi=60;               
  516.                         }
  517.                         while(j--)display(shi,fen,miao);//長(zhǎng)按連續(xù)遞減
  518.                 }
  519.                 if(k3==0&&djs_en==1)
  520.                 {  //k3被按下
  521.                         delay_50us(1);//消抖延時(shí)
  522.                         if(k3==0)
  523.                         {
  524.                                 djs_shi=60;
  525.                                 djs_fen=0;
  526.                                 baojing();
  527.                                 while(k3==0)display(shi,fen,miao);//等待松手        
  528.                         }
  529.                 }               
  530.         }
  531.         if(n==7)//狀態(tài)5 :計(jì)數(shù)器
  532.         {        
  533.                 b=1; //不顯示小點(diǎn)
  534.                 shi=jsq_shi;
  535.                 fen=jsq_fen;
  536.         
  537.                 if(k2==0)
  538.                 {  
  539.                         uint i=6,j=10;
  540.                         while(i--)display(shi,fen,miao);//長(zhǎng)按連續(xù)遞減
  541.                         if(k2==0)
  542.                         {
  543.                                 jsq_fen++;
  544.                                 if(jsq_fen>99)
  545.                                 {
  546.                                         jsq_fen=0;
  547.                                         jsq_shi++;
  548.                                         if(jsq_shi>99)
  549.                                         jsq_shi=0;
  550.                                 }                        
  551.                         }
  552.                         while(j--)display(shi,fen,miao);//長(zhǎng)按連續(xù)遞減
  553.                 }
  554.                 if(k3==0)
  555.                 {  //k3被按下
  556.                         delay_50us(1);//消抖延時(shí)
  557.                         if(k3==0)
  558.                         {
  559.                                 jsq_shi=0;
  560.                                 jsq_fen=0;
  561.                                 baojing();
  562.                                 while(k3==0)display(shi,fen,miao);//等待松手        
  563.                         }
  564.                 }               
  565.         }                        
  566. }
  567. void init()        //初始化函數(shù)
  568. {
  569.         IE=0X82;//1000 0010
  570.         TMOD=0X01;    //0000 0001選擇定時(shí)器0的工作方式1        選擇定時(shí)器1的工作方式1
  571.         TH0=(65536-50000)/256;//初值15536定時(shí)50mS
  572.         TL0=(65536-50000)%256;
  573.         TR0=1; //開(kāi)啟定時(shí)器0
  574. }

  575. void timer0() interrupt        1  //定時(shí)器0中斷服務(wù)程序,用來(lái)設(shè)置冒號(hào)閃爍頻率
  576. {
  577.         TH0=(65536-50000)/256;//進(jìn)入中斷重新賦初值15536
  578.         TL0=(65536-50000)%256;//計(jì)數(shù)5萬(wàn)次(50毫秒)
  579.         a++; //標(biāo)志位b,用來(lái)確定光標(biāo)閃爍頻率
  580.         t++;
  581.         if(t==300)t=0;
  582.         if(t>260)temp_en=1;
  583.         else temp_en=0;
  584.         
  585.         if(a==20)
  586.         {        
  587.                 a=0;//a=20 時(shí)被清零        
  588.                 if(zjs_en==1)        //正計(jì)時(shí)
  589.                 {
  590.                         zjs_fen++;
  591.                         if(zjs_fen==60)
  592.                         {
  593.                                 zjs_fen=0;
  594.                                 zjs_shi++;
  595.                                 if(zjs_shi==60)
  596.                                 {
  597.                                         zjs_shi=0;        
  598.                                 }
  599.                         }        
  600.                 }
  601.                 /**********倒計(jì)時(shí)**********/
  602.                 if(djs_en==1)
  603.                 {
  604.                         djs_fen--;
  605.                         if(djs_fen==-1)
  606.                         {
  607.                                 djs_fen=59;
  608.                                 djs_shi--;
  609.                                 if(djs_shi==-1)
  610.                                 {
  611.                                         djs_shi=0;
  612.                                         djs_fen=0;
  613.                                         djs_en=0;//關(guān)閉倒計(jì)時(shí)
  614.                                         baojing();
  615.                                 baojing();
  616.                                 baojing();
  617.                                 }
  618.                         }        
  619.                 }
  620.                 /*************************/
  621.         }
  622. }


  623. //函數(shù)名稱(chēng):void delay_50US(unsigned int t)
  624. //功能: 延時(shí)50*t(us)
  625. void delay_50us(uint t)
  626. {
  627.   unsigned char j;
  628.   for(;t>0;t--)
  629.   {
  630.     for(j=19;j>0;j--);
  631.   }
  632. }
  633. //*******************************************************************************

  634. //*******************************************************************************
  635. //3微秒延時(shí)程序
  636. void delay_3us()
  637. {
  638.   ;
  639.   ;
  640. }


  641. //;##############################################################################
  642. //;子程序名:w_1byte_ds1302
  643. //;功能:    向DS1302寫(xiě)一個(gè)字節(jié)的數(shù)據(jù)
  644. void w_1byte_ds1302(uchar t)
  645. {
  646.   uchar i;
  647.   for(i=0;i<8;i++)
  648.   {
  649.     if(t & 0x01)
  650.      {io_ds1302=1;}
  651.     else
  652.      {io_ds1302=0;}
  653.     clk_ds1302=1;
  654.     delay_3us();
  655.     delay_3us();
  656.     clk_ds1302=0;
  657.     delay_3us();
  658.     delay_3us();
  659.     t>>=1;
  660.   }  
  661. }
  662. //;########################################################################
  663. //;子程序名:r_1byte_ds1302()
  664. //;功能:    從DS1302讀一個(gè)字節(jié)的數(shù)據(jù)
  665. uchar r_1byte_ds1302()
  666. {
  667.   uchar i,temp11=0;
  668.   io_ds1302=1;//置IO為1,準(zhǔn)備讀入數(shù)據(jù)
  669.   for(i=0;i<8;i++)
  670.   {
  671.     temp11>>=1;
  672.     if(io_ds1302) temp11 |= 0x80;
  673.     clk_ds1302=1;
  674.     delay_3us();
  675.     delay_3us();
  676.     clk_ds1302=0;
  677.     delay_3us();
  678.   }
  679.   return(temp11);
  680. }  
  681. //;#################################################################################
  682. //;子程序名:setbds1302
  683. //;功能:   設(shè)置DS1302初始時(shí)間,并啟動(dòng)計(jì)時(shí)
  684. void set_ds1302()
  685. {
  686.   uchar i,j;
  687.   rest_ds1302=0;
  688.   delay_3us();
  689.   clk_ds1302=0;
  690.   delay_3us();
  691.   rest_ds1302=1;
  692.   delay_3us();
  693.   w_1byte_ds1302(0x8e);//寫(xiě)控制命令字
  694.   delay_3us();
  695.   w_1byte_ds1302(0x00);//寫(xiě)保護(hù)關(guān)閉
  696.   clk_ds1302=1;
  697.   delay_3us();
  698.   rest_ds1302=0;
  699.   for(i=0,j=0x80;i<7;i++,j+=2)
  700.   {
  701.     rest_ds1302=0;
  702.     delay_3us();
  703.     clk_ds1302=0;
  704.     delay_3us();
  705.     rest_ds1302=1;
  706.     delay_3us();
  707.     w_1byte_ds1302(j);
  708.     delay_3us();
  709.     w_1byte_ds1302(tab23[i]);
  710.     delay_3us();
  711.     delay_3us();
  712.     clk_ds1302=1;

  713. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼


全部資料下載地址:
多功能時(shí)鐘.rar (171.7 KB, 下載次數(shù): 309)



評(píng)分

參與人數(shù) 2黑幣 +52 收起 理由
tbjgdtcn + 2 很給力!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:232619 發(fā)表于 2018-1-3 13:15 | 只看該作者
黑幣沒(méi)有啊
回復(fù)

使用道具 舉報(bào)

板凳
ID:261637 發(fā)表于 2018-1-5 21:52 | 只看該作者
無(wú)法編譯?咋搞的
回復(fù)

使用道具 舉報(bào)

地板
ID:157662 發(fā)表于 2018-3-6 23:14 | 只看該作者
tbjgdtcn 發(fā)表于 2018-1-5 21:52
無(wú)法編譯?咋搞的

你要下載才能看見(jiàn)完整程序,如果你沒(méi)有下載就不能看見(jiàn)完整程序就無(wú)法編譯
回復(fù)

使用道具 舉報(bào)

5#
ID:170318 發(fā)表于 2018-3-7 08:47 | 只看該作者
下來(lái)參考學(xué)習(xí),謝謝分享
回復(fù)

使用道具 舉報(bào)

6#
ID:237239 發(fā)表于 2018-4-14 23:36 | 只看該作者
最近正在搞這方面的設(shè)計(jì),樓主強(qiáng)無(wú)敵。。
回復(fù)

使用道具 舉報(bào)

7#
ID:124995 發(fā)表于 2018-4-15 12:13 | 只看該作者
無(wú)敵了 謝謝
回復(fù)

使用道具 舉報(bào)

8#
ID:232619 發(fā)表于 2018-10-15 10:09 | 只看該作者

樓主你好。編譯不了,有問(wèn)題
回復(fù)

使用道具 舉報(bào)

9#
ID:436543 發(fā)表于 2018-12-6 23:45 | 只看該作者
下載不下來(lái)
回復(fù)

使用道具 舉報(bào)

10#
ID:474921 發(fā)表于 2019-2-10 14:07 來(lái)自手機(jī) | 只看該作者
好東西,收藏備用。
回復(fù)

使用道具 舉報(bào)

11#
ID:438499 發(fā)表于 2019-2-11 19:18 | 只看該作者
硬件電路可以,軟件部分挖了不少坑,不管是仿真還是真硬件都顯示亂!
回復(fù)

使用道具 舉報(bào)

12#
ID:492259 發(fā)表于 2019-3-18 18:45 | 只看該作者
沒(méi)有DSN文件 給了元件清單和原理圖是要自己畫(huà)嗎
回復(fù)

使用道具 舉報(bào)

13#
ID:122152 發(fā)表于 2019-3-20 12:38 | 只看該作者
謝謝分享!參考學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

14#
ID:436894 發(fā)表于 2019-6-24 21:15 | 只看該作者
無(wú)法編譯
回復(fù)

使用道具 舉報(bào)

15#
ID:363405 發(fā)表于 2019-7-14 19:28 來(lái)自手機(jī) | 只看該作者
試一下
回復(fù)

使用道具 舉報(bào)

16#
ID:257340 發(fā)表于 2020-4-3 16:57 | 只看該作者
樓上各位,請(qǐng)問(wèn)資料能用嗎
回復(fù)

使用道具 舉報(bào)

17#
ID:28992 發(fā)表于 2021-5-3 06:37 | 只看該作者
great job, thank you Sir!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表