1、单片机的矩阵键盘有按键按下抬起后,发送 4 个字 节给计算机,包括1个字节0x55,一字节帧类型吗0x01, 一个字节按键的键号,一个字节真结束码 0x55 2、计算机通过串口助手接收和发送数据帧。 3、计算机发送 6 字节指令帧,包括 1 个字节 0x55,一 字节帧类型吗 0x02,2 个字节二进制数据,一个字节帧 结束码 0x55。 4、单片机收到计算机的指令帧后,将中间的 2 个字节 数据的前两个字节以16进制形式显示在4个数码管上。
时间: 2024-03-08 12:46:44 浏览: 55
根据你的问题描述,我可以给出如下的单片机程序:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LSA=P2^2; // 4位数码管控制引脚
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit beep=P2^5; // 蜂鸣器控制引脚
uchar code table[]={ // 数码管显示0-F的编码表
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
};
uchar flag; // 按键按下标志
uchar keycode; // 按键码
void delay(uint i) { // 延时函数
while(i--);
}
void keyscan() { // 矩阵键盘扫描函数
uchar keybuf[4][4]={ // 矩阵键盘的键位
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
uchar i,j;
P1=0xf0; // 将行列全部置为高电平
if(P1!=0xf0) { // 如果有按键按下
delay(1000); // 延时去抖动
if(P1!=0xf0) { // 再次判断是否有按键按下
switch(P1) { // 判断是哪一行有按键按下
case 0xe0: i=0; break;
case 0xd0: i=1; break;
case 0xb0: i=2; break;
case 0x70: i=3; break;
}
switch(P1) { // 判断是哪一列有按键按下
case 0x7: j=0; break;
case 0xb: j=1; break;
case 0xd: j=2; break;
case 0xe: j=3; break;
}
flag=1; // 设置按键按下标志
keycode=keybuf[i][j]; // 获取按键码
}
}
}
void sendframe() { // 发送数据帧函数
SBUF=0x55; // 发送帧头
while(!TI); TI=0;
SBUF=0x01; // 发送帧类型码
while(!TI); TI=0;
SBUF=keycode; // 发送按键码
while(!TI); TI=0;
SBUF=0x55; // 发送帧尾
while(!TI); TI=0;
}
void receiveframe() { // 接收指令帧函数
uchar i,command[6];
for(i=0;i<6;i++) { // 逐个接收6个字节
while(!RI);
command[i]=SBUF;
RI=0;
}
if(command[1]==0x02) { // 如果是数据帧
uchar data1=command[2]; // 获取数据的前两个字节
uchar data2=command[3];
LSA=0; // 全部数码管关闭
LSB=0;
LSC=0;
P0=table[data1/16]; // 在数码管上显示数据的前两个字节
LSA=1;
delay(1000);
LSA=0;
P0=table[data1%16];
LSB=1;
delay(1000);
LSB=0;
P0=table[data2/16];
LSC=1;
delay(1000);
LSC=0;
P0=table[data2%16];
}
}
void main() {
TMOD=0x20; // 设置定时器1为模式2(8位自动重载)
TH1=0xfd; // 波特率9600,定时器1初值为0xfd
TL1=0xfd;
TR1=1; // 启动定时器1
SCON=0x50; // 设置串口为模式1(8位数据,无校验,1位停止)
ES=1; // 允许串口中断
EA=1; // 允许总中断
while(1) {
keyscan(); // 扫描矩阵键盘
if(flag) { // 如果有按键按下
flag=0; // 清除按键按下标志
sendframe(); // 发送数据帧
beep=1; // 发出蜂鸣器声音
delay(10000);
beep=0;
}
}
}
void ser() interrupt 4 { // 串口中断服务函数
if(RI) { // 如果接收到数据
receiveframe(); // 接收指令帧
}
RI=0;
TI=0;
}
```
以上是基本的单片机程序,其中主要实现了矩阵键盘的扫描、按键按下后发送数据帧、接收计算机发送的指令帧并在数码管上显示数据的前两个字节等功能。需要注意的是,在使用时需要根据具体的硬件电路和程序要求进行适当的修改。
阅读全文