本帖最后由 晓飛飛 于 2024-11-5 20:34 编辑
下面的例子用的是1ms周期的中断,实际中,考虑到上述延迟最大公约数是50ms,可以配置定时器中断周期为50ms,状态机里面的延迟变量值就可以由变350ms改为7,150ms改为3等等,还可以大幅度降低进入定时中断的周期,提高效率。
- //1ms中断程序,写字板里面写的代码,未经验证,如有错误请自行排查,
- //大概思路就是如下
- void Timer0_Isr(void) interrupt 1
- {
- static unsigned char sta; //状态变量
- static unsigned int delay; //定时变量
- switch(sta)
- {
- case 0: //状态机初始状态
- P0=~0x011; //第一拍动作,只执行一次
- delay = 300; //设置定时值,倒计时方法,
- sta = 1; //转下个状态
- break;
- case 1: //第二拍动作
- if(delay) delay--; //定时变量倒计时,延迟没到就减一
- else //延迟到了转下个动作,配置下个延迟
- {
- P0=~0x55;
- delay = 200;
- sta++; //转下个状态
- }
- break;
- case 2: //第三拍动作
- if(delay) delay--;
- else
- {
- P0=~0xAA;
- delay = 350;
- sta++; //转下个状态
- }
- break;
- case 3: //第四拍动作
- if(delay) delay--;
- else
- {
- P0=~0x0f;
- delay = 150;
- sta++; //转下个状态
- }
- break;
- case 4: //第一拍动作
- if(delay) delay--;
- else
- {
- P0=~0x011;
- delay = 300;
- sta = 1; //转第二拍动作
- }
- break;
- default:
- sta = 0;
- break;
- }
-
- }
-
-
- void Timer0_Init(void) //1毫秒@11.0592MHz
- {
- AUXR |= 0x80; //定时器时钟1T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0xCD; //设置定时初始值
- TH0 = 0xD4; //设置定时初始值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0 = 1; //使能定时器0中断
- }
复制代码
|