标题: 关于51单片机串口通信问题 [打印本页]

作者: 嘻嘻哈哈东    时间: 2023-6-9 22:25
标题: 关于51单片机串口通信问题
主要实验功能:1.按下P3^0,串口发送1,2,3,4,5,6,7,8共8个数据到串口助手 2.串口助手传来的数据再LCD1602显示
问题1:发送到串口助手的数据错乱
问题2:LCD1602显示1的话,需要在串口助手传回11

#include <reg52.h>
#include <LCD1602.h>

typedef unsigned char u8;

void delayms(u8 ms){
    u8 i;
    while(ms--)
        for(i=0;i<113;i++);
}

u8 scan(void){
    static bit kp=0;
    if((P3&0x0f)!=0x0f)
    {
        kp=1;
        if((P3&0x0f)==0x0e) return 1;

    }
    else kp=0;
    return 0;
}

void Init()
{
    SCON=0X50;          //设置为工作方式1
    TMOD=0X20;          //设置计数器工作方式2
    PCON=0;          //波特率不加倍
    TH1=0XFD;                 //计数器初始值设置,注意波特率是9600的
    TL1=0XFD;
    ES=1;                    //打开接收中断
    EA=1;                    //打开总中断
    TR1=1;                    //打开计数器
}

void main() {
    Init();         //串口初始化
    LCD_Init();     //LCD1602初始化
    while(1) {

    }
}

void Usart() interrupt 4
{
    u8 i = 0;
                u8 receiveData;

    if(scan() == 1)
    {
        SBUF = 0x01;
        while(TI == 0);
        TI = 0;
        delayms(100);

        SBUF = 0x02;
        while(TI == 0);
        TI = 0;
        delayms(100);

        SBUF = 3;
        while(TI == 0);
        TI = 0;
        delayms(100);

        SBUF = 4;
        while(TI == 0);
        TI = 0;
        delayms(100);


        SBUF = 5;
        while(TI == 0);
        TI = 0;

        delayms(100);


        SBUF = 6;
        while(TI == 0);
        TI = 0;
        delayms(100);


        SBUF = 7;
        while(TI == 0);
        TI = 0;
        delayms(100);


        SBUF = 8;
        while(TI == 0);
        TI = 0;
}

    if(RI)
                {      
        receiveData = SBUF;         //接收到的数据
        RI = 0;                     //清除接收中断标志位

        LCD_ShowChar(1,1,receiveData);
    }
}


51hei.png (194.39 KB, 下载次数: 21)

51hei.png

作者: xuyaqi    时间: 2023-6-10 05:59
通过串口发送的是8位二进制数,不能直接发10进制数,应该 SBUF ='6';,十进制数转为ASCII码再发送。
作者: wys91203    时间: 2023-6-10 10:23
大致看了一下你的程序,感觉按键是定义到P3.0口, 而51的P3.0是串口 RXD接收端,两个硬件冲突了,另外按键判断和显示最好不要做到中断里,串口中断只是清除RI和TI的标志位




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1