STC89C52RC波特率9600由矩阵键盘为0~9及发送键,实现由矩阵按键按下一个数在0`255内,将其显示在8位共阳极数码管上,在按下发送键后并通过串口通信发送给计算机,C语言带注释
时间: 2024-02-28 19:53:26 浏览: 72
好的,我来为您解答。
首先,需要说明的是,STC89C52RC是一款单片机,本身并不支持波特率设置。波特率的设置需要通过它的UART模块实现。
以下是实现您要求的程序(带注释):
```c
#include <reg52.h> // 引入STC89C52RC的头文件
#define uchar unsigned char // 定义uchar为无符号字符类型
// 定义数码管显示数字的函数
void display(uchar num) {
uchar code table[] = { // 数码管显示0~9的编码
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f // 9
};
P0 = table[num]; // 将对应的数字编码输出到P0口,控制数码管显示数字
}
// 矩阵键盘扫描函数,返回按下的键值
uchar keyScan() {
uchar i, temp; // 定义循环变量和临时变量
for (i = 0; i < 4; i++) { // 4行
P1 = 0xff ^ (1 << i); // 将第i行置0,其他行置1
temp = P1; // 保存P1口的状态
temp |= 0xf0; // 将高4位置1,低4位保持不变
if (temp != 0xf0) { // 判断是否有按键按下
delay(5); // 延时去抖动
temp = P1; // 再次保存P1口的状态
temp |= 0xf0; // 将高4位置1,低4位保持不变
while (temp != 0xf0) { // 等待按键释放
temp = P1; // 持续扫描P1口的状态
temp |= 0xf0; // 将高4位置1,低4位保持不变
}
return (temp & 0x0f) + i * 4; // 返回按下的键值
}
}
return 0xff; // 如果没有按键按下,返回0xff
}
// 串口初始化函数,设置波特率为9600
void uartInit() {
TMOD = 0x20; // 定时器1工作在方式2,用于串口通信
TH1 = 0xfd; // 定时器1计数初值,用于波特率设置为9600
TL1 = 0xfd; // 定时器1计数初值,用于波特率设置为9600
SCON = 0x50; // 串口工作在方式1,允许接收和发送
TR1 = 1; // 启动定时器1
}
// 串口发送函数,将数据发送到计算机
void uartSend(uchar dat) {
SBUF = dat; // 将数据写入串口缓冲区
while (!TI); // 等待数据发送完成
TI = 0; // 发送完成,清除标志位
}
// 主函数
void main() {
uchar key, num = 0; // 定义键值和数字
P0 = 0xff; // 共阳极数码管初始值为全灭
uartInit(); // 串口初始化
while (1) { // 循环执行
key = keyScan(); // 扫描矩阵键盘,获取按下的键值
if (key != 0xff) { // 如果有键按下
if (key < 10) { // 如果是数字键
num = num * 10 + key; // 将按下的数字加入到num中
if (num > 255) { // 如果num大于255
num = 0; // 重置num为0
}
display(num / 100); // 显示num的百位数
delay(5); // 延时
display(num / 10 % 10); // 显示num的十位数
delay(5); // 延时
display(num % 10); // 显示num的个位数
delay(5); // 延时
} else if (key == 10) { // 如果是发送键
uartSend(num); // 将num发送到计算机
num = 0; // 重置num为0
P0 = 0xff; // 关闭数码管显示
}
}
}
}
```
以上代码是基于STC89C52RC的单片机实现的,通过矩阵键盘输入0~9的数字和发送键,将输入的数值显示在8位共阳极数码管上,并通过串口通信将输入的数值发送给计算机。
需要注意的是,由于STC89C52RC的UART模块支持波特率设置的范围有限,因此上述代码中设置的波特率为9600,如果需要修改波特率,请根据STC89C52RC的手册进行设置。
阅读全文