只用c++语言编程,在AT89C51中,要求数码管显示中断次数,即进入一次中断,数码管显示加1,记到99,再次进入中断开始计数。
时间: 2023-09-30 07:08:37 浏览: 84
单片机 中断 数码管 at89s51 按键加1
4星 · 用户满意度95%
实现该功能,你需要首先了解AT89C51的中断和数码管显示的原理。
1. AT89C51中断
AT89C51的中断有5个来源:外部中断0、外部中断1、定时器0中断、定时器1中断和串口中断。其中,外部中断0和1是由外部信号触发,定时器中断是由定时器计数器溢出触发,串口中断是由串口接收到数据时触发。
在AT89C51中,中断是通过两个寄存器来控制的:IE(Interrupt Enable)和IP(Interrupt Priority)。IE寄存器的每一位对应一个中断源,用于允许或禁止该中断源的中断。IP寄存器的每一位对应一个中断源,用于设置该中断源的中断优先级。
2. 数码管显示
数码管的显示原理是利用多路复用的方式,在一段时间内依次点亮多个数码管的LED,从而显示出数字。通常情况下,数码管的共阳/共阴极通过一个电平转换芯片来驱动。
在AT89C51中,可以通过P0口来控制数码管的显示,具体可以参考数码管的接口电路图进行连接。
下面是实现代码示例:
```
#include <reg52.h>
// 定义中断计数
unsigned int count = 0;
// 数码管显示表
unsigned char code disp_table[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90
};
// 数码管位选
unsigned char code digit_table[] = {
0x7F, 0xBF, 0xDF, 0xEF
};
// 数码管显示函数
void display(unsigned int num)
{
unsigned char i, j;
for (i = 0; i < 4; i++) {
// 设置位选
P0 = digit_table[i];
// 显示数字
j = num % 10;
P0 = disp_table[j];
// 持续一段时间
for (j = 0; j < 200; j++);
// 下一个数位
num /= 10;
}
}
// 中断服务函数
void isr() interrupt 0
{
count++;
if (count > 99) {
count = 0;
}
}
// 主函数
void main()
{
// 设置外部中断0
IT0 = 1;
EX0 = 1;
EA = 1;
// 循环显示
while (1) {
display(count);
}
}
```
在该示例代码中,我们使用了外部中断0来触发中断计数,每进入一次中断,计数器加1;当计数器达到99时,重新开始计数。同时,在主函数中循环调用`display()`函数来将计数器的值显示在数码管上。
阅读全文