TIMER0、TIMER1及INT0控制报警器与旋转灯电路如图3-21所示,程序中同样使用了TIMER0、TIMER1及INT0中断,控制实现了报警器声音输出及8只LED的旋转显示。
图3-21 TIMER0、TIMER1及INT0控制报警器与旋转灯电路
与上个案例类似,本案例主程序启用了3个中断:TIMER0中断、TIMER1中断及INT0中断。这3个中断分别负责报警器声音控制、LED控制及按键启/停控制。在这3个中断中,INT0中断被设为高优先级。
以下重点讨论一下T0控制的报警器声音输出程序设计。
主程序中的while循环语句控制频率变量FRQ由0x00持续递增。由于FRQ为u8类型,每当FRQ递增至超过0xFF时将自动归为0x00,因此FRQ变量将在0x00~0xFF范围内反复循环取值。
控制报警器声音输出的T0被配置于模式0(注意是STC15的T0模式0,具有16位自动重装功能,而非8051单片机的13位模式0),T0的16位定时/计数寄存器取值范围为0x0000~0xFFFF。主程序及中断子程序对TH0的赋值固定为0xFE,而TL0则总是在中断时重新取得FRQ变量的值,故TL0将在0x00~0xFF范围循环取值。根据TH0的固定值0xFE及TL0的动态值0x00~0xFF,由T0中断控制可输出的信号频率范围计算如下:
① 已知定时/计数寄存器取值范围为0xFE00~0xFEFF(65 024~65 279);
② 计数溢出范围为512~257,其中65 536-65 024=512,65 536-65 279=257;
③ 输出的信号频率为1 000 000/(512/2)~1 000 000/(257/2)Hz,即976~1 945Hz。
对于TIMER0中断函数内的TL0寄存器,它随FRQ的递增而递增,从而使得TIMER0中断的触发频率也随之递增(直至FRQ递增值超过0xFF时归为0x00),于是形成了频率在976~1 945Hz之间平滑递增循环输出的声音效果,所模拟输出的报警器声音很逼真,实现了报警声音信号频率被均匀拉高、还原、再拉高的过程。
对于旋转灯及按键对T0、T1的启/停控制程序设计,可参考此前相关案例进行分析。
① 修改主程序while循环内延时函数参数值及TH0初值,观察运行效果有何不同。
② 设计程序实现对其他某种声音的模拟输出。