AT89C51单片机按下矩阵键盘第一行时以1200bps 发送1, 2, 3, 4,第二行时以 2400bps发送5,6, 7, 8,第三 行时以4800bps发送9, A, B, C, 第四行时以9600bps发送D,E, F,0。 完成系统的电路设计,并编写c语言程
时间: 2023-09-12 22:12:13 浏览: 189
AT89C51单片机键盘设计
以下是一个基于AT89C51单片机的程序示例,用于读取矩阵键盘的输入,并以不同的波特率发送数据。注意,该程序仅用于演示目的,实际应用可能需要根据具体情况进行修改。
电路设计:
矩阵键盘的行引脚连接到P0口,列引脚连接到P2口。串口模块的TX引脚连接到P3.1引脚上。
程序代码:
```C
#include <reg51.h>
#define FREQ_OSC 11059200UL // 定义晶振频率为11.0592MHz
#define BAUD_RATE 9600 // 定义串口波特率为9600
sbit TX = P3^1; // 定义串口TX引脚
void initTimer() {
TMOD = 0x20; // 设置定时器1为8位定时器模式
TH1 = 256 - FREQ_OSC / 12 / 32 / BAUD_RATE; // 计算波特率重载值
TL1 = TH1; // 初始化定时器初值
TR1 = 1; // 启动定时器1
}
void initSerial() {
SCON = 0x50; // 设置串口工作在模式1(8位异步收发,可变波特率)
ES = 1; // 使能串口中断
EA = 1; // 使能总中断
}
void initKeypad() {
P0 = 0xFF; // 设置P0口为输入模式
P2 = 0xFF; // 设置P2口为上拉输入模式
}
char scanKeypad() {
unsigned char row, col;
char key = ' ';
for (col = 0; col < 4; col++) { // 逐列扫描
P2 = ~(0x01 << col); // 输出列扫描码
for (row = 0; row < 4; row++) { // 检测行状态
if ((P0 & (0x01 << row)) == 0) { // 如果检测到按键按下
key = (char)('1' + row * 4 + col); // 计算按键值
break;
}
}
if (key != ' ') { // 如果已经检测到按键按下
break;
}
}
return key;
}
void main() {
initTimer(); // 初始化定时器1
initSerial(); // 初始化串口
initKeypad(); // 初始化矩阵键盘
while (1) {
char key = scanKeypad(); // 扫描矩阵键盘
if (key != ' ') { // 如果检测到按键按下
SBUF = key; // 发送按键值
while (!TI); // 等待发送完成
TI = 0; // 清除发送完成标志
switch (key) { // 根据按键值设置波特率
case '1':
case '2':
case '3':
case '4':
TH1 = 256 - FREQ_OSC / 12 / 32 / 1200;
TL1 = TH1;
break;
case '5':
case '6':
case '7':
case '8':
TH1 = 256 - FREQ_OSC / 12 / 32 / 2400;
TL1 = TH1;
break;
case '9':
case 'A':
case 'B':
case 'C':
TH1 = 256 - FREQ_OSC / 12 / 32 / 4800;
TL1 = TH1;
break;
default:
TH1 = 256 - FREQ_OSC / 12 / 32 / 9600;
TL1 = TH1;
break;
}
}
}
}
void serialInterrupt() interrupt 4 {
if (RI) { // 如果收到数据
RI = 0; // 清除接收完成标志
}
}
```
需要注意的是,由于AT89C51单片机没有内置Keypad和SoftwareSerial库,因此需要自行编写扫描矩阵键盘和串口发送数据的代码。另外,程序中使用的引脚和波特率需要按照具体电路设计进行修改。
阅读全文