在P0、P1、P2口采用静态连接的方式分别接一个八段数码管,三个数码管都是每隔1s轮流显示0至9共十个数字,在外部中断0和外部中断1处接有两个按键,分别为高优先级和低优先级,试编程实现如下:设置两级中断,高优先级和低优先级,P0口的数码管在主程序中显示,P1口为高优先级数码管显示,P2口为低优先级数码管显示,画出Proteus图,在其上仿真出上述现象
时间: 2024-03-04 09:50:26 浏览: 18
好的,我可以给你提供一些思路和代码。首先,你需要按照题目要求进行硬件连接,在Proteus中模拟运行。下面是大致的代码框架:
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 数码管0~9的显示码表
uchar cnt0 = 0, cnt1 = 0, cnt2 = 0; // 计数器
uchar flag0 = 0, flag1 = 0; // 中断标志位
void delay(uint xms); // 延时函数
void display(uchar num, uchar port); // 在指定端口上显示数字
void main()
{
EA = 1; // 允许中断
EX0 = 1; // 外部中断0
IT0 = 1; // 下降沿触发
EX1 = 1; // 外部中断1
IT1 = 1; // 下降沿触发
while (1) // 主循环
{
display(cnt0, P0); // 在P0口上显示
}
}
void timer0() interrupt 1 // 定时器0中断,每1ms进入一次
{
static uchar i = 0;
TH0 = (65536 - 1000) / 256; // 重新设置计数初值,定时1ms
TL0 = (65536 - 1000) % 256;
i++;
if (i == 100) // 100ms进入一次
{
i = 0;
cnt0++; // 计数器加1
if (cnt0 == 10) // 轮流显示数字0~9
cnt0 = 0;
if (flag1) // 如果有高优先级中断
{
flag1 = 0; // 清除标志位
cnt1++; // 计数器加1
if (cnt1 == 10) // 轮流显示数字0~9
cnt1 = 0;
}
else if (flag2) // 如果有低优先级中断
{
flag2 = 0; // 清除标志位
cnt2++; // 计数器加1
if (cnt2 == 10) // 轮流显示数字0~9
cnt2 = 0;
}
}
}
void ex0() interrupt 0 // 外部中断0,高优先级
{
flag1 = 1; // 设置标志位
}
void ex1() interrupt 2 // 外部中断1,低优先级
{
flag2 = 1; // 设置标志位
}
void delay(uint xms) // 延时函数
{
uint i, j;
for (i = xms; i > 0; i--)
for (j = 110; j > 0; j--)
;
}
void display(uchar num, uchar port) // 在指定端口上显示数字
{
uchar shiwei, gewei;
shiwei = num / 10; // 十位数
gewei = num % 10; // 个位数
P2 = 0xff; // 关闭数码管P2的显示
P1 = 0xff; // 关闭数码管P1的显示
port = 0; // 打开数码管port的显示
P0 = table[shiwei]; // 显示十位数
delay(5); // 延时5ms
P0 = table[gewei] | 0x80; // 显示个位数,并开启小数点
delay(5); // 延时5ms
}
```
在Proteus中,你需要将三个数码管分别连接到P0、P1和P2口,按照题目要求进行硬件连接。然后,你可以在主程序中轮流调用display()函数,在P0口上显示计数器cnt0的值。在定时器0中断中,你需要判断是否有高优先级或低优先级中断发生,并分别更新计数器cnt1和cnt2的值,以便在display()函数中显示在P1和P2口的数码管上。在高优先级中断服务程序ex0()和低优先级中断服务程序ex1()中,你只需要设置标志位,以便在定时器0中断中进行判断。在Proteus仿真中,你可以使用按键模拟高优先级和低优先级中断的触发。
希望这些信息能对你有所帮助!