- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char //數據類型宏定義
- #define uint unsigned int
- #define out P0 //IO端口定義
- /*******共陽數碼管 0 , 1 ,2 ,3 , 4 ,5 ,6 , 7, 8 ,9 ******/
- uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x01};
- uint i = 0; //全局變量
- uint cnt=0;
- /***********主函數*******************************************************/
- void main(void)
- {
- int j;
- TMOD=0x15; // 定時器0工作于計數方式,工作方式1,16位計數
- // 定時器1工作于定時方式,工作方式1,16位定時
- TH0=0; // 清零計數器
- TL0=0;
- TH1=0x4C; // 12M晶振工作下,定時50ms
- TL1=0x00;
- TR0=1; // 啟動定時器0
- TR1=1; // 啟動定時器1
- IE=0x88; // 打開定時中斷1和總中斷
- while(1)
- {
- P2=0x00; // 輸出百位
- out = seg[cnt/100];
- P2 = 0x01;
- for(j=0;j<100;j++);
- P2=0x00;
- out = seg[cnt%100/10]; // 輸出十位
- P2 = 0x02;
- for(j=0;j<100;j++);
- P2=0x00;
- out = seg[cnt%10]; // 輸出個位
- P2 = 0x04;
- for(j=0;j<100;j++);
- }
- }
- /***********計數器T0中斷處理函數******************************************/
- void Timer1_ISR() interrupt 3
- {
- static char j = 0;
- i++;
- TH1=0x4C; // 重設定時器值,50ms @ 12MHz XTAL
- TL1=0x00;
- if(++j == 20) // 50ms * 20 = 1S
- {
- j = 0;
- i = (TH0 << 8) | TL0; // 1S內的計數值
- cnt=i;
- i=0;
- TH0 = 0; // 清零計數
- TL0 = 0;
- }
- }
復制代碼
|