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

標題: 單片機多功能時鐘程序 溫度計+鬧鐘+整點報時+正計時器+倒計時器+計數器 [打印本頁]

作者: 1130555300    時間: 2017-5-18 14:13
標題: 單片機多功能時鐘程序 溫度計+鬧鐘+整點報時+正計時器+倒計時器+計數器
功能:實時時鐘+溫度計+鬧鐘+整點報時+正計時器+倒計時器+計數器

電路原理圖如下:


多功能時鐘 元件清單


1·一寸數碼管                       4
2·單片機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



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

  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的串行數據
  19. sbit rest_ds1302=P2^2;

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

  42. void baojing()//報警函數
  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];                //定義顯示溫度的緩沖區
  53. float tt;                        //定義浮點型變量tt存放溫度值
  54. uchar temp_en=0;
  55. uchar wendu=0;
  56. uint t=0;

  57. /**********18b20延時子函數 *************/
  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);   //讀出的數據最低位在最前面,這樣剛好//一個字節在DAT里
  103.   }
  104.   return(dat);             //將一個字節數據返回
  105. }

  106. /**********18b20寫一個字節**********/
  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發送溫度轉換命令*************/
  135. void tmpchange(void)
  136. {
  137.   dsreset();             //初始化DS18B20
  138.   delayb(1);             //延時
  139.   tmpwritebyte(0xcc);  // 跳過序列號命令
  140.   tmpwritebyte(0x44);  //發送溫度轉換命令
  141. }

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

  149.   tmpwritebyte(0xcc);  
  150.   tmpwritebyte(0xbe);   //發送讀取數據命令

  151.   a=tmpread();          //連續讀兩個字節數據
  152.   b=tmpread();
  153.   temp=b;
  154.   temp<<=8;
  155.   temp=temp|a;                 //兩字節合成一個整型變量。
  156.   return temp;     //返回溫度值
  157. }
  158. void dis_temp()
  159. {        
  160.         tmpchange();              //溫度轉換
  161.         tt=tmp()*0.0625;          //得到真實十進制溫度值,因為DS18B20
  162.         wendu=tt;                                                                //可以精確到0.0625度,所以讀回數據的最低位代表的是0.0625度。
  163.         if(tt<0)        //判斷第一位顯示整數還是負號
  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();              //溫度轉換,為了消除首次顯示的85,每次提前轉換一次即可解決
  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)//光敏控制亮度開關
  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)//整點報時開關
  212.                 baojing();                                                                 
  213.     }
  214. }

  215. //數碼管顯示程序
  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;//鎖存數據
  224.            else smg1=0;
  225.            delay_50us(gm_time);
  226.            smg1=1;        
  227.    }

  228.    if((n==1||n==3)&&a<5)        smg_data=0x7f; //字符閃爍,小點不閃
  229.    else if(b>=10)                        smg_data=tab1[s%10]-0x80;//小點閃爍,字符不閃
  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是控制小數點閃爍的,需要閃爍的時候他等于a
  235.    else if(b>=10)                        smg_data=tab2[f/10]&0xbf; //顯示小點//送顯示斷碼
  236.    else                                                smg_data=tab2[f/10];//送顯示斷碼         分
  237.    smg3=0;//鎖存數據
  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;//鎖存數據
  244.    else smg4=0;
  245.    delay_50us(gm_time);
  246.    smg4=1;
  247. /**************秒,不需要顯示********************/   
  248.    smg_data=tab2[m/10];//送顯示斷碼   秒
  249.    smg5=0;//鎖存數據
  250.    delay_50us(40);
  251.    smg5=1;

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

  257. }
  258. void key() //按鍵控制函數
  259. {
  260.         if(k2==0&&k3==0) //k2k3同時按下,切換鬧鈴開關 并且在按下之后查看鬧鐘時間松手后恢復時間顯示
  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同時按下,切換鬧鈴開關 并且在按下之后查看鬧鐘時間松手后恢復時間顯示
  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同時按下,切換整點報時開關
  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;   //如果處于響零狀態,就任意鍵關閉響鈴
  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;   //如果處于響零狀態,就任意鍵關閉響鈴
  322.                         else if(i<=(2*(70-gm_time)))
  323.                         {
  324.                                 n++;//n記錄功能鍵狀態
  325.                                 if(n>7)  n=0; //n清零
  326.                                 baojing();        
  327.                         }
  328.                         i=0;                        
  329.                 }
  330.         }

  331.         if(n==0)//狀態0,正常顯示時間
  332.         {
  333.                 b=a; //b是控制小數點閃爍的
  334.                 shi=hour;
  335.                 fen=minute;
  336.                 miao=second;
  337.         }        
  338.         if(n==1)//狀態1:調節時間的“時”
  339.         {
  340.                 b=10;
  341.                 if(k2==0)
  342.                 { //k2被按下
  343.                         uint i=6,j=10;
  344.                         while(i--)display(shi,fen,miao);//長按連續遞減                        
  345.                         if(k2==0)
  346.                         {
  347.                                 shi++;//小時加一
  348.                                 if(shi==24)
  349.                                 shi=0;//達到24清零        
  350.                         }
  351.                          while(j--)display(shi,fen,miao);//長按連續遞減
  352.                 }
  353.                
  354.                 if(k3==0)
  355.                 {  //k3被按下
  356.                         uint i=6,j=10;
  357.                         while(i--)display(shi,fen,miao);//長按連續遞減        
  358.                         if(k3==0)
  359.                         {
  360.                                 shi--; //小時減一
  361.                                 if(shi<0)
  362.                                 shi=23;//小于0,重新復制
  363.                         }
  364.                         while(j--)display(shi,fen,miao);//長按連續遞減
  365.                 }               
  366.         }
  367.         if(n==2)//狀態2:調節時間的“分”
  368.         {        b=10;
  369.                  if(k2==0)
  370.                 { //k2被按下
  371.                         uint i=6,j=10;
  372.                         while(i--)display(shi,fen,miao);//長按連續遞減
  373.                         if(k2==0)
  374.                         {
  375.                                 fen++;//分加一
  376.                                 if(fen==60)
  377.                                 fen=0;//分到達60 分清零        
  378.                         }        
  379.                         while(j--)display(shi,fen,miao);//長按連續遞減
  380.                 }
  381.                
  382.                 if(k3==0)
  383.                 {  //k3被按下
  384.                         uint i=6,j=10;
  385.                         while(i--)display(shi,fen,miao);//長按連續遞減
  386.                         if(k3==0)
  387.                         {
  388.                                 fen--;//分減一
  389.                                 if(fen<0)
  390.                                 fen=59;//分小于0,分重新賦值59                                          
  391.                         }
  392.                         while(j--)display(shi,fen,miao);//長按連續遞減
  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();//設置DS1302的初始時間               
  401.         }
  402.         
  403.         if(n==3)//狀態三:調節鬧鈴“時”
  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);//長按連續遞減
  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);//長按連續遞減
  419.                 }
  420.                
  421.                 if(k3==0)
  422.                 {  //k3被按下
  423.                         uint i=6,j=10;
  424.                         while(i--)display(shi,fen,miao);//長按連續遞減
  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);//長按連續遞減
  432.                 }               
  433.         }

  434.         if(n==4)//狀態四 :調節鬧鈴的”分“
  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);//長按連續遞減
  442.                         if(k2==0)
  443.                         {
  444.                                 b_fen++;//鬧鈴時間分加一
  445.                                 if(b_fen==60)
  446.                                 b_fen=0;//鬧鈴分到達60 清零        
  447.                         }        
  448.                         while(j--)display(shi,fen,miao);//長按連續遞減
  449.                 }
  450.                
  451.                 if(k3==0)
  452.                 {  //k3被按下
  453.                         uint i=6,j=10;
  454.                         while(i--)display(shi,fen,miao);//長按連續遞減
  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);//長按連續遞減                        
  462.                 }               
  463.         }
  464.         if(n==5)//狀態5 :正計時
  465.         {
  466.                 b=10; //顯示小點
  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)//狀態5 :倒計時
  493.         {        b=10; //顯示小點
  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);//長按連續遞減
  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);//長按連續遞減
  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)//狀態5 :計數器
  532.         {        
  533.                 b=1; //不顯示小點
  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);//長按連續遞減
  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);//長按連續遞減
  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()        //初始化函數
  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中斷服務程序,用來設置冒號閃爍頻率
  576. {
  577.         TH0=(65536-50000)/256;//進入中斷重新賦初值15536
  578.         TL0=(65536-50000)%256;//計數5萬次(50毫秒)
  579.         a++; //標志位b,用來確定光標閃爍頻率
  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)        //正計時
  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.                 /**********倒計時**********/
  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;//關閉倒計時
  614.                                         baojing();
  615.                                 baojing();
  616.                                 baojing();
  617.                                 }
  618.                         }        
  619.                 }
  620.                 /*************************/
  621.         }
  622. }


  623. //函數名稱: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寫一個字節的數據
  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讀一個字節的數據
  665. uchar r_1byte_ds1302()
  666. {
  667.   uchar i,temp11=0;
  668.   io_ds1302=1;//置IO為1,準備讀入數據
  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. //;功能:   設置DS1302初始時間,并啟動計時
  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);//寫保護關閉
  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黑下載附件…………
復制代碼


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




作者: vody    時間: 2018-1-3 13:15
黑幣沒有啊
作者: tbjgdtcn    時間: 2018-1-5 21:52
無法編譯?咋搞的
作者: 1130555300    時間: 2018-3-6 23:14
tbjgdtcn 發表于 2018-1-5 21:52
無法編譯?咋搞的

你要下載才能看見完整程序,如果你沒有下載就不能看見完整程序就無法編譯
作者: jhczy    時間: 2018-3-7 08:47
下來參考學習,謝謝分享
作者: csy-2015-06    時間: 2018-4-14 23:36
最近正在搞這方面的設計,樓主強無敵!!!
作者: opop1988    時間: 2018-4-15 12:13
無敵了 謝謝
作者: vody    時間: 2018-10-15 10:09

樓主你好。編譯不了,有問題
作者: gaochenguang    時間: 2018-12-6 23:45
下載不下來
作者: changhai    時間: 2019-2-10 14:07
好東西,收藏備用。
作者: renzhifei    時間: 2019-2-11 19:18
硬件電路可以,軟件部分挖了不少坑,不管是仿真還是真硬件都顯示亂!
作者: 位于骨肉皮    時間: 2019-3-18 18:45
沒有DSN文件 給了元件清單和原理圖是要自己畫嗎
作者: 853762295    時間: 2019-3-20 12:38
謝謝分享!參考學習
作者: swz253768    時間: 2019-6-24 21:15
無法編譯
作者: 陳璟    時間: 2019-7-14 19:28
試一下
作者: ft2316377    時間: 2020-4-3 16:57
樓上各位,請問資料能用嗎
作者: usaboy    時間: 2021-5-3 06:37
great job, thank you Sir!




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产极品车模吞精高潮呻吟 | 欧美aa在线 | 午夜视频在线播放 | av一二三区 | 国产在线精品一区二区三区 | 亚洲成人免费观看 | 亚洲欧美日韩精品久久亚洲区 | 伊人伊人 | 亚洲 欧美 在线 一区 | 色呦呦网站 | 亚洲v日韩v综合v精品v | 亚洲不卡在线观看 | 精品国产乱码久久久久久88av | 国产成人高清在线观看 | 久久久精彩视频 | 国产一级免费视频 | 日日噜噜噜夜夜爽爽狠狠视频, | 国产日韩久久 | 青青激情网| 视频在线h | 超碰成人免费 | 免费在线观看av的网站 | 91精品在线播放 | 久久国产精品视频免费看 | 久久国产精品视频 | 亚洲第一区国产精品 | 国产专区免费 | 一级一片在线观看 | 最大av在线 | 亚洲精品久久久久久首妖 | 国产伦精品一区二区三区视频金莲 | 日韩欧美国产一区二区三区 | 福利网址 | 日韩av一区二区在线观看 | 日韩成人影院 | 亚洲激情视频在线 | 欧美日韩综合一区 | 农村黄性色生活片 | 亚洲成年在线 | 日韩精品专区在线影院重磅 | 亚洲成人a v |