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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1436|回復: 0
收起左側

單片機定時器0+MXA7219數碼管顯示+AT24C02時鐘斷電累計工作計時 源程序

[復制鏈接]
ID:370682 發表于 2022-5-12 08:47 | 顯示全部樓層 |閱讀模式
  1. #include<STC15.h>                   // 引用標準庫的頭文件
  2. #include <intrins.h>      //包含_nop_()函數定義的頭文件
  3. sbit SCL=P4^3;
  4. sbit SDA=P4^4;


  5. typedef unsigned char BYTE;
  6. typedef unsigned int WORD;

  7. #define uchar unsigned char // 定義一下方便使用
  8. #define uint unsigned int


  9. unsigned char  cntb=0,n=0,m=0,k=0,ns=0,ks=0,n1=0,k1=0,k2=0;

  10. sbit EC16_KEY=P1^3;        //EC16編碼器按鍵信號輸入定義
  11. sbit DIN = P2^7;                    // 串行數據輸入
  12. sbit CLK = P2^5;                    // 串行時鐘
  13. sbit LOAD = P2^6;                   // 顯示數據鎖存控制
  14. sbit led=P2^4;

  15. /****************************
  16. MAX7219特殊功能寄存器定義
  17. ************************/        

  18. #define DECODE_MODE   0x09            // 譯碼模式寄存器
  19. #define INTENSITY     0x0a                 // 亮度寄存器
  20. #define SCAN_LIMIT    0x0b              // 掃描位數寄存器
  21. #define SHUT_DOWN     0x0c               // 低功耗模式寄存器
  22. #define DISPLAY_TEST  0x0f            // 顯示測試寄存器       

  23. void Write_Max7219_byte(unsigned char temp);
  24. void Write_Max7219(unsigned char address,unsigned char dat);
  25. void Init_Max7219(void);
  26. void delay_msIIC(unsigned int time);
  27. void Init_interrupt();
  28. void show();
  29. void SGM_showLJ()        ;


  30. void I2cStart();
  31. void I2cStop();
  32. unsigned char I2cSendByte(unsigned char dat);
  33. unsigned char I2cReadByte();
  34. void At24c02Write(unsigned char addr,unsigned char dat);
  35. unsigned char At24c02Read(unsigned char addr);


  36. /****************************
  37.    共陰二位十腳數碼管段碼數組
  38. ******************************/
  39. uchar code LEDcode[]=
  40. {0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b         /*0,1,2,3,4,5,6,7,8,9*/
  41.        
  42. /* 0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xff, */ };     /*A,B,C,D,E,F,P,U,全亮*/


  43. /*******************************************************************************
  44. * 函數名         : Delay10us()
  45. * 函數功能                   : 延時10us
  46. * 輸入           : 無
  47. * 輸出                  : 無
  48. *******************************************************************************/

  49. void Delay10us_IIC()
  50. {
  51.         unsigned char a,b;
  52.         for(b=1;b>0;b--)
  53.                 for(a=2;a>0;a--);

  54. }
  55. /*******************************************************************************
  56. * 函數名         : I2cStart()
  57. * 函數功能                 : 起始信號:在SCL時鐘信號在高電平期間SDA信號產生一個下降沿
  58. * 輸入           : 無
  59. * 輸出                  : 無
  60. * 備注           : 起始之后SDA和SCL都為0
  61. *******************************************************************************/

  62. void I2cStart()
  63. {
  64.         SDA=1;
  65.         Delay10us_IIC();
  66.         SCL=1;
  67.         Delay10us_IIC();//建立時間是SDA保持時間>4.7us
  68.         SDA=0;
  69.         Delay10us_IIC();//保持時間是>4us
  70.         SCL=0;                       
  71.         Delay10us_IIC();               
  72. }
  73. /*******************************************************************************
  74. * 函數名         : I2cStop()
  75. * 函數功能                 : 終止信號:在SCL時鐘信號高電平期間SDA信號產生一個上升沿
  76. * 輸入           : 無
  77. * 輸出                  : 無
  78. * 備注           : 結束之后保持SDA和SCL都為1;表示總線空閑
  79. *******************************************************************************/

  80. void I2cStop()
  81. {
  82.         SDA=0;
  83.         Delay10us_IIC();
  84.         SCL=1;
  85.         Delay10us_IIC();//建立時間大于4.7us
  86.         SDA=1;
  87.         Delay10us_IIC();               
  88. }
  89. /*******************************************************************************
  90. * 函數名         : I2cSendByte(unsigned char dat)
  91. * 函數功能                 : 通過I2C發送一個字節。在SCL時鐘信號高電平期間,保持發送信號SDA保持穩定
  92. * 輸入           : num
  93. * 輸出                  : 0或1。發送成功返回1,發送失敗返回0
  94. * 備注           : 發送完一個字節SCL=0,SDA=1
  95. *******************************************************************************/

  96. unsigned char I2cSendByte(unsigned char dat)
  97. {
  98.         unsigned char a=0,b=0;//最大255,一個機器周期為1us,最大延時255us。               
  99.         for(a=0;a<8;a++)//要發送8位,從最高位開始
  100.         {
  101.                 SDA=dat>>7;         //起始信號之后SCL=0,所以可以直接改變SDA信號
  102.                 dat=dat<<1;
  103.                 Delay10us_IIC();
  104.                 SCL=1;
  105.                 Delay10us_IIC();//建立時間>4.7us
  106.                 SCL=0;
  107.                 Delay10us_IIC();//時間大于4us               
  108.         }
  109.         SDA=1;
  110.         Delay10us_IIC();
  111.         SCL=1;
  112.         while(SDA)//等待應答,也就是等待從設備把SDA拉低
  113.         {
  114.                 b++;
  115.                 if(b>200)         //如果超過2000us沒有應答發送失敗,或者為非應答,表示接收結束
  116.                 {
  117.                         SCL=0;
  118.                         Delay10us_IIC();
  119.                         return 0;
  120.                 }
  121.         }
  122.         SCL=0;
  123.         Delay10us_IIC();
  124.         return 1;               
  125. }
  126. /*******************************************************************************
  127. * 函數名         : I2cReadByte()
  128. * 函數功能                   : 使用I2c讀取一個字節
  129. * 輸入           : 無
  130. * 輸出                  : dat
  131. * 備注           : 接收完一個字節SCL=0,SDA=1.
  132. *******************************************************************************/

  133. unsigned char I2cReadByte()
  134. {
  135.         unsigned char a=0,dat=0;
  136.         SDA=1;                        //起始和發送一個字節之后SCL都是0
  137.         Delay10us_IIC();
  138.         for(a=0;a<8;a++)//接收8個字節
  139.         {
  140.                 SCL=1;
  141.                 Delay10us_IIC();
  142.                 dat<<=1;
  143.                 dat|=SDA;
  144.                 Delay10us_IIC();
  145.                 SCL=0;
  146.                 Delay10us_IIC();
  147.         }
  148.         return dat;               
  149. }


  150. /*******************************************************************************
  151. * 函數名         : void At24c02Write(unsigned char addr,unsigned char dat)
  152. * 函數功能                   : 往24c02的一個地址寫入一個數據
  153. * 輸入           : 無
  154. * 輸出                  : 無
  155. *******************************************************************************/

  156. void At24c02Write(unsigned char addr,unsigned char dat)
  157. {
  158.         I2cStart();
  159.         I2cSendByte(0xa0);//發送寫器件地址
  160.         I2cSendByte(addr);//發送要寫入內存地址
  161.         I2cSendByte(dat);        //發送數據
  162.         I2cStop();
  163. }
  164. /*******************************************************************************
  165. * 函數名         : unsigned char At24c02Read(unsigned char addr)
  166. * 函數功能                   : 讀取24c02的一個地址的一個數據
  167. * 輸入           : 無
  168. * 輸出                  : 無
  169. *******************************************************************************/

  170. unsigned char At24c02Read(unsigned char addr)
  171. {
  172.         unsigned char num;
  173.         I2cStart();
  174.         I2cSendByte(0xa0); //發送寫器件地址
  175.         I2cSendByte(addr); //發送要讀取的地址
  176.         I2cStart();
  177.         I2cSendByte(0xa1); //發送讀器件地址
  178.         num=I2cReadByte(); //讀取數據
  179.         I2cStop();
  180.         return num;       
  181. }




  182. /******************
  183. MAX7219讀數據子程序
  184. *********************/

  185. void Write_Max7219_byte(unsigned char temp)
  186. {
  187.    unsigned char i;
  188.    for(i=0;i<8;i++)                        //移位循環8次
  189.         {
  190.         CLK=0;                                        //清零時鐘總線
  191.         DIN=(bit)(temp&0x80);        //每次取高字節亮
  192.         temp=temp<<1;                   //左移移位
  193.         CLK=1;                                   //時鐘上升沿,發送高字節位
  194.         }
  195. }

  196.   /*****************************
  197.   MAX7219寫數據子程序
  198.   *************************/
  199. void Write_Max7219(unsigned char address,unsigned char dat)
  200. {
  201. LOAD=0;                             //拉低片選線,選中器件
  202. Write_Max7219_byte(address);        //讀取高字節地址位
  203. Write_Max7219_byte(dat);                //讀取高字節數據位
  204. LOAD=1;                          //讀取結束,上升沿鎖存數據
  205. }

  206. /*****************************
  207.   MAX7219初始化子程序
  208.   *************************/
  209. void Init_Max7219(void)
  210. {
  211.     Write_Max7219(SHUT_DOWN,0x01);                   //開啟正常工作模式
  212.     Write_Max7219(DISPLAY_TEST,0x00);                //選中工作模式
  213.         Write_Max7219(DECODE_MODE,0x00);                //選用全譯碼模式
  214.         Write_Max7219(SCAN_LIMIT,0x07);                        //8只LED全用
  215.         Write_Max7219(INTENSITY,0x0a);                        //設置初始亮度

  216. }

  217. /*******************************
  218. MAX7219顯示子程序
  219. *******************************/

  220. /********************************
  221. ms級延時子程序
  222. ******************************/
  223. void delay_msIIC(unsigned int time)       
  224. {
  225. unsigned int i,j;
  226. for(i=time;i>0;i--)
  227. for(j=125;j>0;j--);
  228. }


  229. void show()                         
  230. {            
  231.                                 At24c02Write(1,n);   //在地址1內寫入分鐘數據n
  232.                                                                 delay_msIIC(30);  
  233.         Write_Max7219(4,LEDcode[n%10]);                //數碼管分鐘個位數值分離
  234.                            delay_msIIC(1);   
  235.                     Write_Max7219(3,LEDcode[n%100/10]);        //數碼管分鐘十位數值分離
  236.                                                                 delay_msIIC(1);  
  237.                                                         At24c02Write(3,k);   //在地址3內寫入小時數據k
  238.                                                                 delay_msIIC(30);  
  239.                                 Write_Max7219(2,LEDcode[k%10]);           //數碼管小時個位數值分離
  240.                                                                 delay_msIIC(1);                                            
  241.                                 Write_Max7219(1,LEDcode[k%100/10]);        //數碼管小時十位數值分離
  242.                                                                 delay_msIIC(1);   


  243. }


  244. /********************************************************
  245.   MAX7219數碼管開機累計計時顯示分,小時數值分離子程序
  246. ********************************************************/

  247. void SGM_showLJ()                         
  248. {
  249.              
  250.                                
  251.                                             led=0;              //中間小數點信號為低電平
  252.                                         Write_Max7219(4,LEDcode[ns%10]);                  //數碼管編碼器脈沖計數值個位數值分離
  253.                                                 delay_msIIC(1);
  254.                                         Write_Max7219(3,LEDcode[ns%100/10]);        //數碼管編碼器脈沖計數值十位數值分離
  255.                          delay_msIIC(1);
  256.                                         Write_Max7219(2,LEDcode[ks%10]);            //數碼管編碼器脈沖計數值百位數值分離
  257.                                delay_msIIC(1);                                            
  258.                                         Write_Max7219(1,LEDcode[ks%100/10]);        //數碼管編碼器脈沖計數值千位數值分離
  259.                                           delay_msIIC(1);   
  260. }


  261. /**************************
  262. 定時器0初始化子程序
  263. *****************************/
  264. void Init_interrupt()               
  265. {
  266. TMOD=0X01;
  267. TH0=(65536-46080)/256;         //定時器賦初值11.0592MHZ晶振,賦初值TH0=(65536- 1000*50*(11.0592/12)/256)      50ms
  268. TL0=(65536-46080)/256;

  269. ET0=1;
  270. IT0=1;
  271. IT1=1;
  272. EX0=1;
  273. EX1=1;
  274. EA=1;
  275. }

  276. void t0(void) interrupt 1 using 0
  277. {
  278. TH0=(65536-46080)/256;
  279. TL0=(65536-46080)/256;
  280.   cntb ++;       
  281.    m++;
  282.     if(m==30)         ////m執行30次,led燈1s交替閃爍
  283.     {
  284.          led=~led;
  285.          m=0;
  286.     }
  287.                                   
  288.     if(cntb==1200)         //cntb執行1200次,一分鐘時間到
  289.     {
  290.                        
  291.            n=n+1;                          //分鐘變量加1操作
  292.            cntb=0;                     //定時器計數變量清零
  293.     }

  294.             if(n>59)                        //分鐘 顯示大于59秒
  295.           {          
  296.           k=k+1;                           //小時變量加1操作
  297.             n=0;                         //分鐘變量清零       
  298.            }
  299.           
  300.               if(k>99)         //時間顯示大于99小時
  301.           {          
  302.           k=99;        
  303.            }
  304.    
  305. }

  306. /***************************************************
  307. 函數功能主函數
  308. ***************************************************/
  309. void main(void)
  310. { /**************************
  311.                                                         定義特殊端口功能寄存器
  312.                                                 **************************/
  313.                                                                         P0M0 = 0x00;
  314.                                                                                 P0M1 = 0x00;
  315.                                                                         P2M0 = 0x00;
  316.                                                                                 P2M1 = 0x00;
  317.                                                                         P3M0 = 0x00;
  318.                                                                                 P3M1 = 0x00;       
  319.                                                                         P4M0 = 0x00;
  320.                                                                                 P4M1 = 0x00;       
  321.                                                                         P5M0 = 0x00;
  322.                                                                                 P5M1 = 0x00;       
  323.                                                                         P6M0 = 0x00;
  324.                                                                                 P6M1 = 0x00;       
  325.                                                                
  326.                                                                 Init_interrupt();        //定時器初始化
  327.                        Init_Max7219();                //7219初始化
  328.         /*****************此段程序為開機讀取累計工作分鐘數據程序************/
  329.                        n1=At24c02Read(1);          //讀取EEPROM地址1內的數據保存在n1中
  330.                                                                 delay_msIIC(30);
  331.                       ns=At24c02Read(2);          //讀取EEPROM地址2內的數據保存在ns中
  332.                                                           delay_msIIC(30);
  333.                       ns=ns+n1;
  334.                                                                 if(ns>=60)
  335.                                                                 {
  336.                                                                         ns=ns-60;    //累計計時60分鐘,累計變量分鐘-60,
  337.                                                                         k2=k2+1;      //累計小時數加1
  338.                                                                 }

  339. /*****************此段程序為開機讀取累計工作小時數據程序************/
  340.                                                                
  341.                        k1=At24c02Read(3);          //讀取EEPROM地址3內的數據保存在k1中
  342.                                                                 delay_msIIC(30);
  343.                       ks=At24c02Read(4);          //讀取EEPROM地址4內的數據保存在ks中
  344.                                                           delay_msIIC(30);
  345.                       ks=ks+k1+k2;
  346.                                                                 if(ks>=99)
  347.                                                                         ks=99;    //累計計時99小時
  348.                                                                
  349.                                                                 SGM_showLJ();   //調用累計計時函數
  350.         /******************下列此程序為累計存儲分鐘變量程序**************/                                                       
  351.                                                                 At24c02Write(2,0);   //在地址2內寫入數據0,清除2地址
  352.                       delay_msIIC(30);
  353.                        At24c02Write(2,ns);   //在地址2內寫入數據ns
  354.                                                                 delay_msIIC(30);  
  355.                        At24c02Write(1,0);   //在地址1內寫入數據0,清除1地址
  356.                                                                 delay_msIIC(30);
  357.                                                                  n=0;             //清零分鐘
  358.                                                                
  359.   /******************下列此程序為累計存儲分鐘變量程序**************/                       
  360.                                                                 At24c02Write(4,0);   //在地址4內寫入數據0,清除4地址
  361.                       delay_msIIC(30);
  362.                        At24c02Write(4,ks);   //在地址4內寫入數據ks
  363.                                                                 delay_msIIC(30);  
  364.                        At24c02Write(3,0);   //在地址3內寫入數據0,清除3地址
  365.                                                                 delay_msIIC(30);         
  366.                                                                  k=0;               //清零小時
  367.                                                                
  368.    while(1)
  369. {
  370.          
  371.                                                 if(EC16_KEY==0)         //檢測開機信號
  372.                                          {
  373.                                                                  
  374.                                                 TR0=1;
  375.                   show();                        //調用數碼管顯示       
  376.                                                                         
  377.                                          }
  378.                                    TR0=0;
  379. }
  380. }

復制代碼


回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线免费观看日本视频 | 国产精品theporn | 农村真人裸体丰满少妇毛片 | 成人蜜桃av | 亚洲一区视频在线 | 黄色香蕉视频在线观看 | 国产做a爱片久久毛片 | 日韩免费视频 | 成人在线| 超级黄色一级片 | 找个黄色片 | 午夜精品一区二区三区在线播放 | 久久伊人一区 | 成人午夜免费在线视频 | av在线免费观看网站 | 日韩欧美在线观看视频 | 在线一级片 | 在线播放一区二区三区 | 亚洲午夜视频在线观看 | 日韩三级一区 | 久草成人 | 一区二区三区国产视频 | 欧美一区精品 | 日韩av在线中文字幕 | 一区视频在线免费观看 | 亚洲一二视频 | 国产精品久久久久久久久免费软件 | 久草视频网站 | 国外成人免费视频 | 日韩不卡视频在线观看 | 成人精品鲁一区一区二区 | 国产剧情一区 | 性高湖久久久久久久久 | 青青操av| 国产精品一区在线观看 | 亚洲综合色视频在线观看 | 久久久久久九九九九九九 | 日本一二三区电影 | 国产成人在线一区二区 | 国产一区二区三区视频 | 成人av一区二区在线观看 |