爱笑还清明 2023-12-02 16:45 采纳率: 0%
浏览 53

51单片机串口发送数据额外多一个0xff的数据

// 为什么下面的代码在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;
}
  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-02 18:13
    关注

    【相关推荐】




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

报告相同问题?

问题事件

  • 创建了问题 12月2日