標(biāo)題: 這個單片機(jī)程序有些看不懂 [打印本頁]

作者: 小可愛i    時間: 2018-1-6 22:55
標(biāo)題: 這個單片機(jī)程序有些看不懂
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char          //數(shù)據(jù)類型宏定義
  4. #define uint unsigned int
  5. #define out  P0                                  //IO端口定義
  6. /*******共陽數(shù)碼管 0 ,  1  ,2  ,3 , 4  ,5  ,6 , 7,  8  ,9 ******/
  7. uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x01};

  8. uint i = 0;         //全局變量
  9. uint cnt=0;
  10. /***********主函數(shù)*******************************************************/
  11. void main(void)
  12. {
  13.         int j;

  14.         TMOD=0x15;                          // 定時器0工作于計(jì)數(shù)方式,工作方式1,16位計(jì)數(shù)
  15.                                             // 定時器1工作于定時方式,工作方式1,16位定時
  16.         TH0=0;                                                                // 清零計(jì)數(shù)器
  17.         TL0=0;
  18.         TH1=0x4C;                                                        // 12M晶振工作下,定時50ms
  19.         TL1=0x00;
  20.         TR0=1;                                                                // 啟動定時器0
  21.         TR1=1;                                                                // 啟動定時器1
  22.         IE=0x88;                                                        // 打開定時中斷1和總中斷
  23.         while(1)
  24.         {                        
  25.                 P2=0x00;                                                  // 輸出百位
  26.                 out = seg[cnt/100];        
  27.                 P2 = 0x01;
  28.                 for(j=0;j<100;j++);

  29.                 P2=0x00;
  30.                 out = seg[cnt%100/10];                        // 輸出十位
  31.                 P2 = 0x02;         
  32.                 for(j=0;j<100;j++);         

  33.                 P2=0x00;                                                
  34.                 out = seg[cnt%10];                                 // 輸出個位
  35.                 P2 = 0x04;
  36.                 for(j=0;j<100;j++);
  37.         }                  
  38. }

  39. /***********計(jì)數(shù)器T0中斷處理函數(shù)******************************************/
  40. void Timer1_ISR() interrupt 3
  41. {
  42.         static char j = 0;
  43.          i++;
  44.         TH1=0x4C;                                                   // 重設(shè)定時器值,50ms @ 12MHz XTAL
  45.         TL1=0x00;
  46.         if(++j == 20)                                           // 50ms * 20 = 1S
  47.         {                          
  48.                 j = 0;
  49.                 i = (TH0 << 8) | TL0;                   // 1S內(nèi)的計(jì)數(shù)值
  50.                 cnt=i;
  51.                 i=0;
  52.                 TH0 = 0;                                           // 清零計(jì)數(shù)
  53.                 TL0 = 0;         
  54.         }
  55. }
復(fù)制代碼



作者: zl2168    時間: 2018-1-7 20:44
先學(xué)理論,打基礎(chǔ),否則,問題多多,事倍功半。
作者: candura    時間: 2018-1-9 08:39
具體是哪些地方看不懂呢?簡單瀏覽了一下代碼,這就是個在數(shù)碼管上顯示計(jì)數(shù)器的計(jì)數(shù)次數(shù)的程序啊。
開始配置計(jì)時器為50ms產(chǎn)生一次中斷,然后在中斷中判斷是否已經(jīng)到了1s(即進(jìn)入中斷20次),如果已經(jīng)到了1s就把定時器0的數(shù)值賦給cnt變量, 從而在主程序中通過數(shù)碼管將定時器0的計(jì)數(shù)顯示出來。
作者: ahshmj    時間: 2018-1-9 10:26
你的程序里面,就沒有TL0增加的語句,所以TH0、TL0會一直不變。

你需要在你認(rèn)為合適的地方增加一句“TL0++;” (不知道你程序的意圖,所以也不知道這一句加在哪兒合適)。







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1