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

標題: 51單片機學習,簡易時鐘 [打印本頁]

作者: 51黑電子迷    時間: 2017-2-9 22:22
標題: 51單片機學習,簡易時鐘
使用芯片STC89C52RC, 2個鎖存器
6個帶小數點共陰極數碼管顯示一個24時制時鐘
沒有時鐘芯片,所以掉電后時間會復位
原理圖為TX-1C開發板

暫時顯示了半小時,一秒不差,
未驗證有無其他bug,代碼貼上來,歡迎高手指點


==============================
最終顯示的<時.分.秒>是 16.31.37  形式
  1.     #include <reg52.h>  
  2.     #include "MY51.H"  
  3.       
  4.     void show();  
  5.     uint8  shi=15;   //初始時間15:45:00  按復位按鈕對時  
  6.     uint8  fen=45;  
  7.     uint8  miao=0;  
  8.       
  9.     void main()      
  10.     {  
  11.         startT0(1000);  //開始定時器  
  12.         while(1)  
  13.         {         
  14.             show();  
  15.         }  
  16.     }  
  17.       
  18.     void show()  //顯示時鐘  
  19.     {  
  20.         uint8 oneWela,twoWela,threeWela,foreWela,fiveWela,sixWela; //oneWela是最左邊的數碼管  
  21.         sixWela =miao%10;  
  22.         fiveWela=miao/10;     
  23.         foreWela=fen%10;  
  24.         threeWela=fen/10;  
  25.         twoWela=shi%10;  
  26.         oneWela=shi/10;  
  27.         displaySMG(oneWela,twoWela,threeWela,foreWela,fiveWela,sixWela,0xf5); //0xf5小數點位置  
  28.     }  
  29.       
  30.     void T0_Work()  //T0定時器調用的工作函數  
  31.     {   
  32.        miao++;  
  33.         if(miao>59)  
  34.         {  
  35.             miao=0;  
  36.             fen++;  
  37.         }  
  38.       
  39.         if(fen>59)  
  40.         {  
  41.             fen=0;  
  42.             shi++;  
  43.         }   
  44.          
  45.         if(shi>23)  
  46.         {  
  47.             shi=0;  
  48.         }  
  49.     }  
復制代碼
  1. #ifndef _MY51_H_  
  2. #define _MY51_H_  
  3. #include <math.h>  
  4. #include <intrins.h>  
  5.   
  6. typedef int                 int16  ;  
  7. typedef int                 INT16  ;  
  8. typedef unsigned int    uint16 ;  
  9. typedef unsigned int    UINT16 ;  
  10. typedef unsigned short  uint ;  
  11. typedef unsigned short  UINT ;  
  12. typedef unsigned short  word ;  
  13. typedef unsigned short  WORD ;  
  14. typedef unsigned long   uint32 ;  
  15. typedef unsigned long   UINT32 ;  
  16. typedef unsigned long   DWORD ;  
  17. typedef unsigned long   dword ;  
  18. typedef signed long    int32     ;  
  19. typedef signed long    INT32  ;  
  20. typedef float                   float32  ;  
  21. typedef double              double64  ;  
  22. typedef signed char     int8 ;  
  23. typedef signed char         INT8 ;  
  24. typedef unsigned char   byte ;  
  25. typedef unsigned char    BYTE    ;      //WINDOWS的windef.h里面是這么定義的  
  26. typedef unsigned char   uchar ;  
  27. typedef unsigned char   UCHAR ;  
  28. typedef unsigned char   UINT8 ;  
  29. typedef unsigned char   uint8 ;  
  30. typedef unsigned char   BOOL     ;      //windows中定義BOOL為int  
  31. typedef unsigned char   bool     ;          //bool是c++的內置類型  
  32.   
  33. #define TRUE     1  
  34. #define true     1  
  35. #define FALSE    0  
  36. #define false    0  
  37.   
  38. #define open     1    //open和close用于 標志打開和關閉狀態  
  39. #define OPEN     1  
  40. #define close    0  
  41. #define CLOSE    0  
  42. #define lock     0  
  43. #define start    1  
  44. #define START    1  
  45. #define stop     0  
  46. #define STOP     0  
  47.   
  48. uint8    dulaIndex=0;       //數碼管0~F段編碼索引號  
  49. uint8    welaIndex=0;       //0~5位的數碼管位索引號  
  50.   
  51. sbit dula =P2^6;  //段選鎖存器控制  控制筆段  
  52. sbit wela =P2^7;  //位選鎖存器控制  控制位置  
  53.   
  54. #define led P1    //燈總線控制  
  55. sbit led0=P1^0;   //8個led燈  
  56. sbit led1=P1^1;  
  57. sbit led2=P1^2;  
  58. sbit led3=P1^3;  
  59. sbit led4=P1^4;  
  60. sbit led5=P1^5;  
  61. sbit led6=P1^6;  
  62. sbit led7=P1^7;  
  63. sbit keyS2=P3^4; //4個獨立按鍵  
  64. sbit keyS3=P3^5;  
  65. sbit keyS4=P3^6;  
  66. sbit keyS5=P3^7;  
  67.   
  68. void displaySMG(uint8 one,uint8 two,uint8 three,uint8 four,uint8 five,uint8 six,uint8 dot);   
  69. void delayms(uint16 ms);  
  70. void T0_Work();  
  71. //////////////////////////////////////////////////////////////////////////  
  72. void delayms(uint16 ms)  //軟延時函數  
  73. {  
  74.     uint16 i,j;  
  75.     for(i=83;i>0;i--)  
  76.     {  
  77.         for(j=ms;j>0;j--)  
  78.         {}  
  79.     }  
  80. }  
  81.   
  82. ///////////////////////////////////////////////////////////////////////////  
  83. #define dark    0x11  //也就是索引第17號元素0x00,共陰極數碼管正極全部輸入低電平  
  84. uint8 code table[]= {           //0~F外加小數點和空輸出的數碼管編碼  
  85. 0x3f , 0x06 , 0x5b , 0x4f , // 0 1 2 3  
  86. 0x66 , 0x6d , 0x7d , 0x07 , // 4 5 6 7  
  87. 0x7f , 0x6f , 0x77 , 0x7c , // 8 9 A B  
  88. 0x39 , 0x5e , 0x79 , 0x71 , // C D E F  
  89. 0x80 , 0x00                 // . 空     空時是第0x11號也就是第17號元素  
  90. };  
  91.   
  92. /////////////////////////////////////////////////////////////////////////////  
  93. uint8   TH0Cout=0 ;     //初值      
  94. uint8   TL0Cout=0 ;      
  95. uint16  T0IntCout=0;     //中斷計數  
  96. uint16  T0IntCountAll=0; //(N-1)/65536+1;  //總中斷次數  
  97. bool    bT0Delay=false;  //使用延時函數標志,初始未用  
  98. bool    bT0Over=false;   //中斷處理函數執行結果之一  
  99.   
  100. void startT0(uint32 ms)  //開啟定時器  
  101. {     
  102.     float32   t=ms/1000.0;               //定時時間  
  103.     double64    fox =11.0592*(pow(10,6));  //晶振頻率  
  104.     uint32    N=(t*fox)/12 ;                 //定時器總計數值  
  105.   
  106.     TH0Cout =(65536-N%65536)/256;        //裝入計時值零頭計數初值  
  107.     TL0Cout =(65536-N%65536)%256;  
  108.     T0IntCountAll=(N-1)/65536+1;             //總中斷次數  
  109.     TMOD=TMOD | 0x01;                        //設置定時器0的工作方式為1  
  110.       
  111.     EA =open;   //打開總中斷  
  112.     ET0=open;   //打開定時器中斷  
  113.   
  114.     TH0=TH0Cout;  //定時器裝入初值  
  115.     TL0=TL0Cout;  
  116.     TR0=start;   //啟動定時器  
  117. }  
  118.   
  119. void delayT0(uint32 ms)     //硬延時函數,自己亂寫的不好用,求指點  
  120. {  
  121.     startT0(ms);                //啟動定時器  
  122.     bT0Delay=true;          //告訴T0定時器,起用延時模式  
  123.     while(bT0Over==false);  //時間沒到的話繼續檢測  
  124.     bT0Over=false;              //時間到了,讓標志復位  
  125. }  
  126.   
  127. void T0_times() interrupt 1 //T0定時器中斷函數  
  128. {  
  129.     T0IntCout++;  
  130.     if(T0IntCout==T0IntCountAll)  //達到總中斷次數值  
  131.     {     
  132.         T0IntCout=0;         //中斷次數清零,重新計時  
  133.         bT0Over=true;     //時間真的到了  
  134.         if(bT0Delay)             //本次中斷是用來延時的嗎  
  135.         {  
  136.             TR0=stop;        //如果是由延時函數開啟T0的話,關閉T0  
  137.             return;  
  138.         }  
  139.   
  140.         TH0=TH0Cout;        //循環定時的話要重裝初值,每次定時1秒,重裝一次  
  141.         TL0=TL0Cout;  
  142.         T0_Work();             //工作函數  
  143.     }  
  144. }  
  145.   
  146. ////////////////////////////////////////////////////////////////////////////////  
  147. void displaySMG(uint8 oneWela,uint8 twoWela,uint8 threeWela,uint8 fourWela,uint8 fiveWela,uint8 sixWela,uint8 dot)  
  148. {       //控制6位數碼管顯示函數,不顯示的位用參數 dark  
  149.         dula=1;         //小數點  
  150.         P0=table[16];  
  151.         dula=0;  
  152.         P0=0xff;  
  153.         wela=1;  
  154.         P0=dot;         
  155.         wela=0;  
  156.         delayms(1);  
  157.   
  158.          dula=1;  
  159.         P0=table[oneWela];   //送段數據  
  160.         dula=0;  
  161.         P0=0xff;    //送位數據前關閉所有顯示,防止打開位選鎖存后段選數據通過位選鎖存器  
  162.         wela=1;  
  163.         P0=0xfe;  
  164.         wela=0;  
  165.         delayms(1);  
  166.   
  167.         dula=1;  
  168.         P0=table[twoWela];  
  169.         dula=0;  
  170.         P0=0xff;  
  171.         wela=1;  
  172.         P0=0xfd;  
  173.         wela=0;  
  174.         delayms(1);  
  175.   
  176.         dula=1;  
  177.         P0=table[threeWela];  
  178.         dula=0;  
  179.         P0=0xff;  
  180.         wela=1;  
  181.         P0=0xfb;  
  182.         wela=0;  
  183.         delayms(1);  
  184.   
  185.         dula=1;  
  186.         P0=table[fourWela];  
  187.         dula=0;  
  188.         P0=0xff;  
  189.         wela=1;  
  190.         P0=0xf7;  
  191.         wela=0;  
  192.         delayms(1);  
  193.   
  194.         dula=1;  
  195.         P0=table[fiveWela];  
  196.         dula=0;  
  197.         P0=0xff;  
  198.         wela=1;  
  199.         P0=0xef;  
  200.         wela=0;  
  201.         delayms(1);  
  202.   
  203.         dula=1;  
  204.         P0=table[sixWela];  
  205.         dula=0;  
  206.         P0=0xff;  
  207.         wela=1;  
  208.         P0=0xdf;  
  209.         wela=0;  
  210.         delayms(1);  
  211. }  
  212.   
  213. #endif
復制代碼





作者: 毛士新    時間: 2022-2-5 00:11
:lol:loveliness::Q




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 精品欧美乱码久久久久久1区2区 | 国产在线网站 | 7777奇米影视 | 在线欧美小视频 | 亚洲永久| 精品国产一区二区三区性色av | 亚洲国产成人精品久久 | 精品久久久久久亚洲精品 | 香蕉二区 | 国产精品一区久久久久 | 福利社午夜影院 | 欧美日韩网站 | 国产精品视频在 | 欧美影院 | 久久久久国产一区二区三区四区 | 亚洲一区欧美 | 久草视频在线播放 | 午夜激情影院 | 久久一区二区三区四区五区 | 亚洲国产成人精品一区二区 | 亚洲精品一 | 国产精品久久久久一区二区三区 | 一区二区三区精品在线视频 | 日韩精品 电影一区 亚洲 | 欧洲成人免费视频 | 欧美日韩视频一区二区 | 精品一区二区三区在线视频 | 日韩欧美在 | 欧美理论 | 91久久国产综合久久 | 99热在线观看精品 | 久久久日韩精品一区二区三区 | 国产91黄色| 性在线 | 亚洲一区久久 | 日韩毛片免费看 | 成人二区| 欧美性另类| 国产一区二区在线视频 | 亚洲国产精品99久久久久久久久 | 亚洲综合在线视频 |