c语言,keil5环境,AT89C51单片机,使用定时器1中断,按方式1工作,得到1S的定时; 按方式2工作,得到8ms的定时——动态扫描用。 初始化程序 包括定时器初始化和中断系统初始化。主要对IP,IE,TCON,TMOD 的相应位进行正确的设置,并将时间常数送入定时器中。由于只有定时器中断,IP不必设置。 设计中断服务程序和主程序 中断服务程序除了要完成计时工作外,还要实现动态显示。扩展单个按键,使其具有“开启/暂停/清零”的功能,开启:可以实现0—99S的计时;暂停:停止计数,但能显示已记录的时间;清零:具有清除当前记录,并重新开始计时和显示。
时间: 2024-03-25 19:38:23 浏览: 125
好的,这是一个关于AT89C51单片机的定时器和中断处理的问题,需要进行程序设计。下面是我的回答,仅供参考。
首先,需要设置定时器1的工作模式和时间常数。按照题目要求,方式1工作时需要得到1秒的定时,方式2工作时需要得到8ms的定时。设置方式1时,TMOD寄存器中需要将T1M1和T1M0位清零,表示选择模式1。设置方式2时,同样需要将T1M1和T1M0位清零,表示选择模式2,并将TH1和TL1寄存器的数值设置为0xF8和0x30,即65536-8000的高8位和低8位,以得到8ms的定时。
接着,需要设置中断系统的相关位。由于只有定时器中断,IP寄存器不需要设置。IE寄存器中,需要将EA位设置为1,表示打开总中断使能;ET1位设置为1,表示打开定时器1中断。TCON寄存器中,需要将TR1位设置为1,表示启动定时器1。此时,定时器1开始计数,并在定时结束时触发中断服务程序。
中断服务程序需要完成两个任务:计时和动态显示。计时的方法是在定时器1的中断服务程序中,每次触发中断时将一个计数器加1,表示已经过去的定时周期数。动态显示的方法是在主程序中使用循环扫描的方式,将计数器的值转换为数码管的显示码,并输出到数码管上。另外,需要扩展一个按键,实现“开启/暂停/清零”的功能。具体实现方法可以使用外部中断或定时器中断,在按键按下时检测按键状态,并根据不同状态执行相应的操作。
下面是伪代码示例:
```
// 定义全局变量
unsigned int counter = 0; // 计时器
unsigned char display[2] = {0x00, 0x00}; // 数码管显示码
// 定时器1中断服务程序
void timer1_isr() interrupt 3 {
counter++; // 计数器加1
}
// 初始化程序
void init() {
TMOD &= 0x0F; // 清零T1M1和T1M0位,选择方式1
TH1 = 0xFC; // 设置定时器1时间常数,得到1秒的定时
TL1 = 0x66;
EA = 1; // 打开总中断使能
ET1 = 1; // 打开定时器1中断
TR1 = 1; // 启动定时器1
}
// 主程序
void main() {
init(); // 初始化程序
while (1) {
// 动态显示计数器的值
display[0] = counter / 10; // 转换高位数码
display[1] = counter % 10; // 转换低位数码
// 输出显示码到数码管
// ...
// 检测按键状态,执行相应操作
// ...
}
}
```
以上是一个简单的示例程序,具体实现需要根据硬件平台和实际需求进行调整。希望能对您有所帮助。
阅读全文