1.總中斷和定時器0中斷沒有打開。
2.阻滯型延時只適用于短暫延時,長時間延時要利用定時器加計數方式。用定時器作阻滯型延時更不可取。
3.T0中斷響應后TF0由硬件自動清0。
給你改為定時器中斷產生時基,在主函數中查詢變量值執行相關任務。任意時長的延時也不影響當前任務執行
- #include <STC8H.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit JR_JDQ = P1^7;
- sbit JS_JDQ = P1^5;
- sbit DCF_JDQ = P1^4;
- sbit FMQ = P1^6;
- sbit KEY1 = P1^1;
- sbit ID1 = P3^3;
- sbit ID2 = P3^4;
- sbit ID3 = P3^5;
- uchar count; //計數變量聲明
- uchar Cnt_250us; //250us 時間變量聲明
- uint Cnt_ms,Cnt_s;//ms、s 時間變量聲明
- bit sign_ms,sign_s;//ms、s 時間標志位變量聲明
- void IO_init()
- {
- P1M0 = 0x00;
- P1M1 = 0x00;
- P3M0 = 0x00;
- P3M1 = 0x00;
- }
- void TM0_init() //250微秒@11.0592MHz
- {
- AUXR &= 0x7F; //定時器時鐘12T模式
- TMOD &= 0xF0; //設置定時器模式
- TL0 = 0x1A; //設置定時初始值
- TH0 = 0xFF; //設置定時初始值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- EA = 1; //開總中斷
- ET0 = 1; //開T0中斷
- }
- void TM0_Isr() interrupt 1
- {
- Cnt_250us++;
- if(Cnt_250us>=4)
- {
- Cnt_250us=0;
- // sign_ms=1;
- Cnt_ms++;
- }
- if(Cnt_ms>=1000)
- {
- Cnt_ms=0;
- sign_s=1;
- Cnt_s++;
- }
- }
- void main()
- {
- IO_init();
- TM0_init();
- while (1)
- {
- if(Cnt_ms<500)//周期1秒,響0.5秒,停0.5秒
- {
- FMQ = 1;
- }
- else
- {
- FMQ = 0;
- }
- if(sign_s==1)
- {
- sign_s=0;//秒標志清0
- count++;
- if(count>=5)//周期5秒
- {
- count=0;
- }
- if(count<2)
- {
- DCF_JDQ = 1;//輸出2秒
- }
- else
- {
- DCF_JDQ = 0;//停止3秒
- }
- }
- }
- }
復制代碼 |