// 为什么下面的代码在proteus仿真里面发出的串口数据会额外包含一个0xff
#include <reg51.h>
sbit KEY = P1^7; // 定义按键输入引脚
sbit LED1 = P1^0; // 定义LED1输出引脚
sbit LED2 = P1^3; // 定义LED2输出引脚
// 定义8个按键的引脚
sbit KEY0 = P0 ^ 0;
sbit KEY1 = P0 ^ 1;
sbit KEY2 = P0 ^ 2;
sbit KEY3 = P0 ^ 3;
sbit KEY4 = P0 ^ 4;
sbit KEY5 = P0 ^ 5;
sbit KEY6 = P0 ^ 6;
sbit KEY7 = P0 ^ 7;
// 定义按键枚举类型
typedef enum{
key_7 = 7, key_8 = 8, key_9 = 9, key_Divide = 19,
key_4 = 4, key_5 = 5, key_6 = 6, key_Multiply = 18,
key_1 = 1, key_2 = 2, key_3 = 3, key_Subtract = 17,
key_ON = 21, key_0 = 0, key_Equals = 20, key_Add = 16,
key_NULL = -1,
}emKeyStatus;
void serial_init(void); // 串口初始化
char serial_char_input(void); // 串口字节输入
void serial_char_output(char chr); // 串口单字符输出
emKeyStatus key_4x4(void); // 读取4x4矩阵键盘的按键值
void main(){
char data_output = 0; // 串口要输出的数据
char data_input = 0; // 串口要输出的数据
char key_new = 0; // 按键新值
char key_old = 0; // 按键旧值
P1 = 0xff;
P0 = 0x00;
serial_init(); // 初始化串口
while(1){
// if(RI)
// data_input = serial_char_input();
// // 根据串口数据控制LED状态
// switch(data_input){
// case 0: LED1 = 1; LED2 = 1; break;
// case 1: LED1 = 0; LED2 = 1; break;
// case 2: LED1 = 1; LED2 = 0; break;
// case 3: LED1 = 0; LED2 = 0; break;
// }
key_new = key_4x4(); // 获取矩阵键盘的值
if(key_new != key_old){
serial_char_output(key_new); // 串口发送键盘的值
}
key_old = key_new;
// 检测按键状态
// if(!KEY){
// while(!KEY); // 等待按键松开
// data_output = data_output >= 99 ? 0 : data_output + 1; // 循环递增LED状态索引
// serial_char_output(data_output); // 串口数据输出
// }
}
}
// 串口中断用于清除串口接收位
void serial_interrupt() interrupt 4{
TI = 0;
}
// 初始化串口
void serial_init(void){
SCON = 0x50; // 使用串口模式1且允许接收串口数据
PCON |= 0x00; // 波特率不加倍
TMOD = 0x20; // 设置定时器1为模式3
// TH1 = TL1 = 256-fosc*2^SMOD/(12*BaudRate*32)
TH1 = TL1 = 232; // 定时器赋初值,这里设置的波特率为1200 0xe8
TR1 = 1; // 定时器1开始计数
EA = 1; // 开启总中断
ES = 1; // 开启串口中断
TI = 0; // 清除串口发送位
RI = 0; // 清除串口接收位
}
// 串口查询输入
char serial_char_input(void){
while(!RI);
RI = 0;
return SBUF;
}
// 串口中断输出
void serial_char_output(char chr){
SBUF = chr;
}
// 4x4矩阵键盘实现函数,采用的是逐键扫描
// 函数返回值:按键按下的值,对应按键枚举类型中的键值
emKeyStatus key_4x4(void){
emKeyStatus key_val = key_NULL;
P0 = ~(0x01 << 0);
if (KEY4 == 0) key_val = key_7;
if (KEY5 == 0) key_val = key_8;
if (KEY6 == 0) key_val = key_9;
if (KEY7 == 0) key_val = key_Divide;
P0 = ~(0x01 << 1);
if (KEY4 == 0) key_val = key_4;
if (KEY5 == 0) key_val = key_5;
if (KEY6 == 0) key_val = key_6;
if (KEY7 == 0) key_val = key_Multiply;
P0 = ~(0x01 << 2);
if (KEY4 == 0) key_val = key_1;
if (KEY5 == 0) key_val = key_2;
if (KEY6 == 0) key_val = key_3;
if (KEY7 == 0) key_val = key_Subtract;
P0 = ~(0x01 << 3);
if (KEY4 == 0) key_val = key_ON;
if (KEY5 == 0) key_val = key_0;
if (KEY6 == 0) key_val = key_Equals;
if (KEY7 == 0) key_val = key_Add;
return key_val;
}
51单片机串口发送数据额外多一个0xff的数据
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
关注【相关推荐】
- 这篇博客也许可以解决你的问题👉 :51单片机串口多机通信的原理与编程实现
- 您还可以看一下 熊健老师的51单片机在物联网中的应用实战课程中的 课程介绍小节, 巩固相关知识点
- 除此之外, 这篇博客: 51单片机 串口通信 单个数码管 显示单个数字 闪烁中的 使用的元器件 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^解决 无用评论 打赏 举报