写出C语言代码:51单片机外中断0接一个按键Key,Key的次数最大次数为50。当按键按下时,串口输出当前次数“Current Value is XX”,同时用两个动态数码管显示当前次数。当次数等于学号后两位(若学号小于10,则学号后两位加10)时,串口输出当前次数“The Last Value is XX”,此后按键再按下则次数不变,串口无任何信息输出。
时间: 2023-11-22 14:55:12 浏览: 69
下面是符合要求的C语言代码:
```c
#include <reg51.h>
#define MAX_COUNT 50
sbit KEY = P1^0;
sbit D1 = P2^0;
sbit D2 = P2^1;
unsigned char count = 0;
unsigned char last_value = 0;
void delay(unsigned int ms)
{
unsigned int i, j;
for(i=0; i<ms; i++)
for(j=0; j<125; j++);
}
void init_serial()
{
TMOD = 0x20;
TH1 = 0xFD;
SCON = 0x50;
TR1 = 1;
}
void send_serial(unsigned char c)
{
SBUF = c;
while(TI == 0);
TI = 0;
}
void display_count()
{
D1 = count / 10;
D2 = count % 10;
}
void main()
{
EA = 1;
EX0 = 1;
IT0 = 1;
init_serial();
while(1)
{
display_count();
delay(10);
if(count == last_value)
continue;
last_value = count;
if(count % 100 == 10) // 学号后两位加10
send_serial("The Last Value is %d\n", count);
else
send_serial("Current Value is %d\n", count);
}
}
void key_isr() interrupt 0
{
delay(10);
if(KEY == 0 && count < MAX_COUNT)
count++;
}
```
需要注意的几个点:
1. 外中断0是通过`INT0`引脚触发的,需要将它和`P1.0`引脚相连。
2. `delay()`函数用来获得按键的稳定状态,其实现方式是简单的循环延时。在51单片机中,1ms的延时需要大约125个循环,具体的数值也可以根据实际情况进行调整。
3. `display_count()`函数用来在两个动态数码管上显示当前次数,其中`D1`和`D2`的类型是`sbit`,表示它们是单个IO口的位。
4. `send_serial()`函数用来通过串口输出信息,其中`TMOD`寄存器用来设置定时器的工作模式,`TH1`寄存器用来设置波特率,`SCON`寄存器用来设置串口的工作模式。
5. 在主程序中,`EA`和`EX0`分别用来开启全局中断和外部中断0,`IT0`用来设置外中断0的触发方式为下降沿触发。
6. 在中断服务程序中,通过检测按键的状态来增加计数器的值。
阅读全文