此程序經89C51仿真驗證沒有問題
無標題.jpg (409.66 KB, 下載次數: 47)
下載附件
2021-1-7 15:50 上傳
- //此示例僅限于10~65535us范圍使用,外部中斷下降沿有效。
- #include <STC8.H>
- #define uint unsigned int
- #define uchar unsigned char
- #define Ulimit 21277 //21.3ms(周期=1s/47.000Hz=0.02127659574468085106382978723404)
- #define Llimit 24548 //24.5ms(周期=1s/40.736Hz=0.02454831107619795758051846032993)
- sbit out=P1^4;
- uchar code table[]={//共陰數碼管段碼"0~f-."
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71,0x40,0x80};
- uint time = 0; //脈沖周期
- uint time1 = 0;
- uchar buf[6];//顯示緩存
- bit flag = 0;
- void t0_init() //65536微秒@12.000MHz
- {
- // AUXR &= 0x7F; //定時器時鐘12T模式
- TMOD &= 0xF0; //設置定時器模式
- TMOD |= 0x01; //設置定時器模式
- TL0 = 0x00; //設置定時初值
- TH0 = 0x00; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- }
- void main()
- {
- uchar i,j;
- t0_init();
- IT0=1; //為 1 是下降沿; 為 0 是低電平
- EX0=1; //為 1 允許中斷; 為 0 是禁止中斷
- EA =1; //開總中斷
- out=0;
- while(1)
- {
- if(flag==1)
- {
- flag=0;
- if(time>Llimit)
- out=0;
- if(time<Ulimit)
- out=1;
- time1=time;
- for(i=0;i<5;i++)
- {
- buf[4-i]=table[time1%10];
- time1/=10;
- }
- }
- P0=0x00;
- P2=~(0x01<<j);
- P0=buf[j];
- j++;
- j%=5;
- }
- }
- void int0() interrupt 0
- {
- TR0=0;//關定時器
- time=TH0<<8|TL0;//讀取定時器數據
- TL0 = 0x00; //清0
- TH0 = 0x00;
- TR0=1;//開定時器
- flag=1;
- }
復制代碼
|