单片机外中断0接一个按键Key,Key的次数最大次数为50。当按键按下时,串口输出当前次数“Current Value is XX”,同时用两个动态数码管显示当前次数。当次数等于学号后两位(若学号小于10,则学号后两位加10)时,串口输出当前次数“The Last Value is XX”,此后按键再按下则次数不变,串口无任何信息输出。
时间: 2023-07-16 17:17:33 浏览: 61
好的,这是一个较为简单的单片机外中断应用题。需要用到单片机的外部中断、串口通信、动态数码管显示等模块。下面是基本的程序框架:
```c
#include <reg51.h>
#include <intrins.h> // __delay函数需要的头文件
#define uchar unsigned char
#define uint unsigned int
sbit Key = P3^2; // 按键连接的IO口
uchar cnt = 0; // 计数器,初始值为0
void InitInterrupt(); // 初始化外部中断
void KeyInterrupt() interrupt 0; // 外部中断0的中断服务程序
void InitSerial(); // 初始化串口通信
void SendByte(uchar dat); // 向串口发送一个字节数据
void DisplayNum(uchar num); // 在两个动态数码管上显示一个数字
void main()
{
InitInterrupt();
InitSerial();
while (1) {
DisplayNum(cnt);
if (cnt == 50) {
break;
}
}
}
void InitInterrupt()
{
IT0 = 1; // 设置外部中断0为下降沿触发
EX0 = 1; // 使能外部中断0
EA = 1; // 使能总中断
}
void KeyInterrupt() interrupt 0
{
__delay(2000); // 延时去抖
if (!Key) { // 判断按键是否按下
cnt++; // 计数器加1
SendByte(cnt); // 向串口发送当前次数
while (!Key); // 等待按键松开
if (cnt == (学号 % 100 + 10)) {
SendByte(cnt); // 向串口发送最后一次计数
while (1); // 让程序停在这里,不再响应按键中断
}
}
}
void InitSerial()
{
TMOD = 0x20; // 定时器1工作在方式2,产生波特率
TH1 = 0xfd; // 波特率9600,TH1计算公式为(256-晶振频率/波特率/12)
TL1 = 0xfd;
TR1 = 1; // 启动定时器1
SM0 = 0;
SM1 = 1; // 串口工作在模式1,8位数据位
REN = 1; // 使能串口接收
ES = 1; // 使能串口中断
}
void SendByte(uchar dat)
{
SBUF = dat; // 将要发送的数据放入发送缓冲区
while (!TI); // 等待数据发送完毕
TI = 0; // 清除发送完成标志
}
void DisplayNum(uchar num)
{
uchar a, b;
a = num / 10; // 十位数
b = num % 10; // 个位数
// TODO: 在两个动态数码管上显示数字a和b
}
```
其中需要注意的几点:
1. 在中断服务程序中,需要使用延时函数去抖动按键,避免因按键震动导致计数器不准确。
2. 在串口通信中,需要配置波特率、使能接收和发送中断等参数。
3. 在动态数码管显示中,需要根据具体的硬件连接方式和显示方式来编写相应的代码。
由于具体硬件平台和显示方式的不同,上面的程序仅供参考,需要根据实际情况进行修改。
阅读全文