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秒
- }
- }
- }
- }
复制代码 |