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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

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

電路原理圖如下:


多功能時鐘 元件清單


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



單片機(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聲明 時
  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; //黑暗時等于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的時鐘線
  18. sbit io_ds1302=P2^1;//定義控制DS1302的串行數(shù)據(jù)
  19. sbit rest_ds1302=P2^2;

  20. const uchar tab1[16]={//共陽數(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;//光敏使能信號/整點(diǎn)報時使能信號
  27. uchar gm_time=40; //光敏控制亮度值
  28. char shi,fen,miao,b_shi=7,b_fen=0; //必須是有符號型:數(shù)據(jù)暫存單元shi/fen/miao,鬧鈴時間b_shi,b_fen,
  29. uchar hour,minute,second,n=0,a=0,b=0;//從1302讀出的實(shí)時時間數(shù)據(jù)hour,minute,second,        b控制字符閃爍
  30. uchar tab23[3];//={0x40,0x59,0x23,0x28,0x11,0x06,0x09};//首次上電時默認(rèn)的時間
  31. uchar bell_en=0,x=1;//鬧鐘使能信號,任意鍵關(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的延時程序
  35. void  delay_50us(uint t);//延時50*T微妙函數(shù)的聲明
  36. void  display(uchar shi,fen,miao);//顯示子程序
  37. void  set_ds1302();//設(shè)置時間
  38. void  get_ds1302();//讀取當(dāng)前時間
  39. void  w_1byte_ds1302(uchar t);//向DS1302寫一個字節(jié)的數(shù)據(jù)
  40. uchar r_1byte_ds1302();//從DS1302讀一個字節(jié)的數(shù)據(jù)
  41. void init(); //初始化函數(shù)

  42. void baojing()//報警函數(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ù) *************/
  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++;          //小延時一下
  87.    DS=1;
  88.    i++;i++;
  89.    dat=DS;
  90.    i=8;
  91.    while(i>0)i--;
  92.    return (dat);
  93. }

  94. /**********18b20讀一個**********/
  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ù)最低位在最前面,這樣剛好//一個字節(jié)在DAT里
  103.   }
  104.   return(dat);             //將一個字節(jié)數(shù)據(jù)返回
  105. }

  106. /**********18b20寫一個字節(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)     // 寫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;       //寫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);             //延時
  139.   tmpwritebyte(0xcc);  // 跳過序列號命令
  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ù)讀兩個字節(jié)數(shù)據(jù)
  152.   b=tmpread();
  153.   temp=b;
  154.   temp<<=8;
  155.   temp=temp|a;                 //兩字節(jié)合成一個整型變量。
  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ù)號
  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];//送顯示斷碼  個位
  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)//光敏控制亮度開關(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)報時開關(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];//送顯示斷碼  時
  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)閃爍的,需要閃爍的時候他等于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同時按下,切換鬧鈴開關(guān) 并且在按下之后查看鬧鐘時間松手后恢復(fù)時間顯示
  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同時按下,切換鬧鈴開關(guān) 并且在按下之后查看鬧鐘時間松手后恢復(fù)時間顯示
  277.         {
  278.                 delay_50us(1);
  279.                 if(k1==0&&k3==0)
  280.                 {        
  281.                         gm_en=!gm_en;
  282.                         if(gm_en==1)//使能的話報警兩聲
  283.                         {baojing();baojing();}
  284.                         else baojing();//無效的話報警一聲
  285.                         while(k1==0&&k3==0)display(shi,fen,miao);//等待松手
  286.                 }
  287.         }
  288.         if(k1==0&&k2==0) //k1k2同時按下,切換整點(diǎn)報時開關(guān)
  289.         {
  290.                 delay_50us(1);
  291.                 if(k1==0&&k2==0)
  292.                 {        
  293.                         zdbs_en=!zdbs_en;
  294.                         if(zdbs_en==1)//使能的話報警兩聲
  295.                         {baojing();baojing();}
  296.                         else baojing();//無效的話報警一聲        
  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);//消抖延時
  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);//消抖延時
  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;}//長按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,正常顯示時間
  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é)時間的“時”
  339.         {
  340.                 b=10;
  341.                 if(k2==0)
  342.                 { //k2被按下
  343.                         uint i=6,j=10;
  344.                         while(i--)display(shi,fen,miao);//長按連續(xù)遞減                        
  345.                         if(k2==0)
  346.                         {
  347.                                 shi++;//小時加一
  348.                                 if(shi==24)
  349.                                 shi=0;//達(dá)到24清零        
  350.                         }
  351.                          while(j--)display(shi,fen,miao);//長按連續(xù)遞減
  352.                 }
  353.                
  354.                 if(k3==0)
  355.                 {  //k3被按下
  356.                         uint i=6,j=10;
  357.                         while(i--)display(shi,fen,miao);//長按連續(xù)遞減        
  358.                         if(k3==0)
  359.                         {
  360.                                 shi--; //小時減一
  361.                                 if(shi<0)
  362.                                 shi=23;//小于0,重新復(fù)制
  363.                         }
  364.                         while(j--)display(shi,fen,miao);//長按連續(xù)遞減
  365.                 }               
  366.         }
  367.         if(n==2)//狀態(tài)2:調(diào)節(jié)時間的“分”
  368.         {        b=10;
  369.                  if(k2==0)
  370.                 { //k2被按下
  371.                         uint i=6,j=10;
  372.                         while(i--)display(shi,fen,miao);//長按連續(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);//長按連續(xù)遞減
  380.                 }
  381.                
  382.                 if(k3==0)
  383.                 {  //k3被按下
  384.                         uint i=6,j=10;
  385.                         while(i--)display(shi,fen,miao);//長按連續(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);//長按連續(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的初始時間               
  401.         }
  402.         
  403.         if(n==3)//狀態(tài)三:調(diào)節(jié)鬧鈴“時”
  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);//長按連續(xù)遞減
  412.                         if(k2==0)
  413.                         {
  414.                                 b_shi++;//鬧鈴時間加一
  415.                                 if(b_shi==24)
  416.                                 b_shi=0;//鬧鈴時間清零        
  417.                         }
  418.                         while(j--)display(shi,fen,miao);//長按連續(xù)遞減
  419.                 }
  420.                
  421.                 if(k3==0)
  422.                 {  //k3被按下
  423.                         uint i=6,j=10;
  424.                         while(i--)display(shi,fen,miao);//長按連續(xù)遞減
  425.                         if(k3==0)
  426.                         {
  427.                                 b_shi--;//鬧鈴時間減一
  428.                                 if(b_shi<0)
  429.                                 b_shi=23;//鬧鈴時間        
  430.                         }
  431.                         while(j--)display(shi,fen,miao);//長按連續(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);//長按連續(xù)遞減
  442.                         if(k2==0)
  443.                         {
  444.                                 b_fen++;//鬧鈴時間分加一
  445.                                 if(b_fen==60)
  446.                                 b_fen=0;//鬧鈴分到達(dá)60 清零        
  447.                         }        
  448.                         while(j--)display(shi,fen,miao);//長按連續(xù)遞減
  449.                 }
  450.                
  451.                 if(k3==0)
  452.                 {  //k3被按下
  453.                         uint i=6,j=10;
  454.                         while(i--)display(shi,fen,miao);//長按連續(xù)遞減
  455.                         if(k3==0)
  456.                         {
  457.                                 b_fen--;//鬧鈴時間分減一
  458.                                 if(b_fen<0)
  459.                                 b_fen=59;//鬧鈴時間分重新賦值
  460.                         }
  461.                         while(j--)display(shi,fen,miao);//長按連續(xù)遞減                        
  462.                 }               
  463.         }
  464.         if(n==5)//狀態(tài)5 :正計(jì)時
  465.         {
  466.                 b=10; //顯示小點(diǎn)
  467.                 shi=zjs_shi;
  468.                 fen=zjs_fen;
  469.                 if(k2==0)
  470.                 {  //k2被按下
  471.                         delay_50us(1);//消抖延時
  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);//消抖延時
  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ì)時
  493.         {        b=10; //顯示小點(diǎn)
  494.         shi=djs_shi;
  495.                 fen=djs_fen;
  496.                 if(k2==0)
  497.                 {  //k2被按下
  498.                         delay_50us(1);//消抖延時
  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);//長按連續(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);//長按連續(xù)遞減
  518.                 }
  519.                 if(k3==0&&djs_en==1)
  520.                 {  //k3被按下
  521.                         delay_50us(1);//消抖延時
  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);//長按連續(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);//長按連續(xù)遞減
  553.                 }
  554.                 if(k3==0)
  555.                 {  //k3被按下
  556.                         delay_50us(1);//消抖延時
  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選擇定時器0的工作方式1        選擇定時器1的工作方式1
  571.         TH0=(65536-50000)/256;//初值15536定時50mS
  572.         TL0=(65536-50000)%256;
  573.         TR0=1; //開啟定時器0
  574. }

  575. void timer0() interrupt        1  //定時器0中斷服務(wù)程序,用來設(shè)置冒號閃爍頻率
  576. {
  577.         TH0=(65536-50000)/256;//進(jìn)入中斷重新賦初值15536
  578.         TL0=(65536-50000)%256;//計(jì)數(shù)5萬次(50毫秒)
  579.         a++; //標(biāo)志位b,用來確定光標(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 時被清零        
  588.                 if(zjs_en==1)        //正計(jì)時
  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ì)時**********/
  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ì)時
  614.                                         baojing();
  615.                                 baojing();
  616.                                 baojing();
  617.                                 }
  618.                         }        
  619.                 }
  620.                 /*************************/
  621.         }
  622. }


  623. //函數(shù)名稱:void delay_50US(unsigned int t)
  624. //功能: 延時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微秒延時程序
  636. void delay_3us()
  637. {
  638.   ;
  639.   ;
  640. }


  641. //;##############################################################################
  642. //;子程序名:w_1byte_ds1302
  643. //;功能:    向DS1302寫一個字節(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讀一個字節(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初始時間,并啟動計(jì)時
  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);//寫控制命令字
  694.   delay_3us();
  695.   w_1byte_ds1302(0x00);//寫保護(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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼


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



評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

你要下載才能看見完整程序,如果你沒有下載就不能看見完整程序就無法編譯
回復(fù)

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 四虎午夜剧场 | 黄片毛片免费看 | 国产高清一二三区 | av先锋资源 | 久久亚洲视频网 | 国产视频一区在线 | 国产夜恋视频在线观看 | www.788.com色淫免费 | 99视频在线免费观看 | 亚洲自拍一区在线观看 | 91成人免费观看 | 一级做受毛片免费大片 | 99精品久久 | 国产一区二区高清在线 | 亚洲成人免费 | 福利影院在线看 | 欧美一区二区三区在线观看视频 | 超碰97人人人人人蜜桃 | 精品一级 | 免费在线精品视频 | 91精品久久久 | 国产精品中文 | www四虎com | 日韩在线免费看 | 国产一区二区三区网站 | 欧美日韩激情 | 午夜爽爽爽男女免费观看 | 日韩一区二区久久 | 狠狠婷婷综合久久久久久妖精 | 日韩av免费在线观看 | 91精品一区二区三区久久久久久 | 免费黄色成人 | 天天拍天天操 | 久久999| 99久久婷婷国产综合精品首页 | 麻豆一区 | 国产成人精品一区二区三区四区 | 91精品国产综合久久精品 | 国产精品久久久亚洲 | 真人一级毛片 | 99re在线视频免费观看 |