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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2880|回復: 1
打印 上一主題 下一主題
收起左側(cè)

51單片機學習,簡易時鐘

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:161768 發(fā)表于 2017-2-9 22:22 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
使用芯片STC89C52RC, 2個鎖存器
6個帶小數(shù)點共陰極數(shù)碼管顯示一個24時制時鐘
沒有時鐘芯片,所以掉電后時間會復位
原理圖為TX-1C開發(fā)板

暫時顯示了半小時,一秒不差,
未驗證有無其他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是最左邊的數(shù)碼管  
  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小數(shù)點位置  
  28.     }  
  29.       
  30.     void T0_Work()  //T0定時器調(diào)用的工作函數(shù)  
  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++的內(nèi)置類型  
  32.   
  33. #define TRUE     1  
  34. #define true     1  
  35. #define FALSE    0  
  36. #define false    0  
  37.   
  38. #define open     1    //open和close用于 標志打開和關(guān)閉狀態(tài)  
  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;       //數(shù)碼管0~F段編碼索引號  
  49. uint8    welaIndex=0;       //0~5位的數(shù)碼管位索引號  
  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)  //軟延時函數(shù)  
  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,共陰極數(shù)碼管正極全部輸入低電平  
  84. uint8 code table[]= {           //0~F外加小數(shù)點和空輸出的數(shù)碼管編碼  
  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;     //中斷計數(shù)  
  96. uint16  T0IntCountAll=0; //(N-1)/65536+1;  //總中斷次數(shù)  
  97. bool    bT0Delay=false;  //使用延時函數(shù)標志,初始未用  
  98. bool    bT0Over=false;   //中斷處理函數(shù)執(zhí)行結(jié)果之一  
  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 ;                 //定時器總計數(shù)值  
  105.   
  106.     TH0Cout =(65536-N%65536)/256;        //裝入計時值零頭計數(shù)初值  
  107.     TL0Cout =(65536-N%65536)%256;  
  108.     T0IntCountAll=(N-1)/65536+1;             //總中斷次數(shù)  
  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)     //硬延時函數(shù),自己亂寫的不好用,求指點  
  120. {  
  121.     startT0(ms);                //啟動定時器  
  122.     bT0Delay=true;          //告訴T0定時器,起用延時模式  
  123.     while(bT0Over==false);  //時間沒到的話繼續(xù)檢測  
  124.     bT0Over=false;              //時間到了,讓標志復位  
  125. }  
  126.   
  127. void T0_times() interrupt 1 //T0定時器中斷函數(shù)  
  128. {  
  129.     T0IntCout++;  
  130.     if(T0IntCout==T0IntCountAll)  //達到總中斷次數(shù)值  
  131.     {     
  132.         T0IntCout=0;         //中斷次數(shù)清零,重新計時  
  133.         bT0Over=true;     //時間真的到了  
  134.         if(bT0Delay)             //本次中斷是用來延時的嗎  
  135.         {  
  136.             TR0=stop;        //如果是由延時函數(shù)開啟T0的話,關(guān)閉T0  
  137.             return;  
  138.         }  
  139.   
  140.         TH0=TH0Cout;        //循環(huán)定時的話要重裝初值,每次定時1秒,重裝一次  
  141.         TL0=TL0Cout;  
  142.         T0_Work();             //工作函數(shù)  
  143.     }  
  144. }  
  145.   
  146. ////////////////////////////////////////////////////////////////////////////////  
  147. void displaySMG(uint8 oneWela,uint8 twoWela,uint8 threeWela,uint8 fourWela,uint8 fiveWela,uint8 sixWela,uint8 dot)  
  148. {       //控制6位數(shù)碼管顯示函數(shù),不顯示的位用參數(shù) dark  
  149.         dula=1;         //小數(shù)點  
  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];   //送段數(shù)據(jù)  
  160.         dula=0;  
  161.         P0=0xff;    //送位數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存后段選數(shù)據(jù)通過位選鎖存器  
  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
復制代碼




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩

相關(guān)帖子

回復

使用道具 舉報

沙發(fā)
ID:829862 發(fā)表于 2022-2-5 00:11 | 只看該作者
:lol:loveliness::Q
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美 日韩 国产 在线 | 久久久久久高潮国产精品视 | 精品久久久久久亚洲精品 | 中文字幕在线免费视频 | 久久久久久国产精品免费免费狐狸 | 久久中文字幕av | 91精品久久久久久久 | 亚洲毛片在线观看 | 91视频进入| 欧美性网站| 黄色在线观看网址 | 国产一区二区中文字幕 | 一道本在线 | 成人深夜小视频 | 日韩高清国产一区在线 | 狠狠做六月爱婷婷综合aⅴ 国产精品视频网 | www.色五月.com| 国产一区二区精品在线观看 | 欧美成人免费 | 久久久妇女国产精品影视 | 精品综合网 | 99久久精品国产一区二区三区 | 99re在线视频 | 日韩一区二区三区在线 | 国产精品欧美精品日韩精品 | 97久久精品午夜一区二区 | 欧美一区2区三区4区公司 | 国产精品视频播放 | 一区在线视频 | 亚洲欧美自拍偷拍视频 | av网站免费观看 | 国产精品小视频在线观看 | av网站免费观看 | 91精品在线播放 | 精品一二区 | 九热在线 | 欧美激情综合色综合啪啪五月 | 久久久久久综合 | 亚洲精品一区二区三区在线观看 | 中文字幕视频三区 | 国产精品视频yy9299一区 |