微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 一个单片机串口通信问题

一个单片机串口通信问题

时间:10-02 整理:3721RD 点击:
大家好,我是新手,有个问题想请教大家。两个单片机,都要有收发功能,一个单片机U1根据自己的按键,给另一个单片机U2发送控制数据,让另一个单片机的LED点亮,第二个单片机也会根据自身的按键,发送出数据给单片机U1,控制与U1相连数码管的字符显示。下面是代码和原理图,仿真不通过,不知道错在哪里,求高手指导一下。


下面是两个单片机中的代码:
//U1
#include<reg52.h>
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
unsigned char tb;//所发送的字节
unsigned char rb;//所接收的字节
void main()
{               
        EA=1;//全局中断开
        ES=1;//串口中断开
        ET1=1;//计时器1中断开
        TMOD=0x20;//计时器1工作方式1
        TH1=0xfd;//波特率9600
        TL1=0xfd;
        SCON=0x50;//串口初始化方式1,REN=1,允许接收
        PCON=0x00;//SMOD=0,波特率不倍增
        TR1=1;//打开计时器1
        while(1)
        {
                //发送
                if(K1==0)
                        tb=0xfe;
                if(K2==0)
                        tb=0x7f;
                if(K3==0)
                        tb=0xff;                       
                SBUF=tb;
                while(TI==0);
                TI=0; //发送完毕
                //接收
                rb=SBUF;
                while(RI==0);
                RI=0;                       
                P2=rb;                       
        }                               
}

//U2
#include<reg52.h>
//定义共阴极七段码管的数字0~F,以及小数点、空白、全显示
#define SEG0 0x3f
#define SEG1 0x06
#define SEG2 0x5b
#define SEG3 0x4f
#define SEG4 0x66
#define SEG5 0x6d
#define SEG6 0x7d
#define SEG7 0x07
#define SEG8 0x7f
#define SEG9 0x6f
unsigned char digits[]={SEG0,SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8,SEG9};
sbit K4=P1^0;

unsigned char tb;
unsigned char rb;
void delay(unsigned int i)
{
        unsigned int m,n;
        for(m=i;m>0;m--)
        for(n=125;n>0;n--);
}
void main()
{       
        EA=1;//全局中断开
        ES=1;//串口中断开
        ET1=1;//计时器1中断开
        TMOD=0x20;//计时器1工作方式1
        TH1=0xfd;//波特率9600
        TL1=0xfd;
        SCON=0x50;//串口初始化方式1,接收REN=1
        PCON=0x00;//SMOD=0,波特率不倍增
        TR1=1;//打开计时器1
        P2=0xff;
        RI=1;
        while(1)
        {               
                //发送               
                if(K4==0)
                {       
                        delay(50);
                        if(K4==0)
                        {
                                tb=(tb+1)%10;
                                tb=digits[tb];                       
                                SBUF=tb;
                                while(TI==0);
                                TI=0;
                        }
                }
                                               
                //接收
                rb=SBUF;               
                while(RI==0);
                RI=0;
                P2=rb;
        }       
}

请大家帮我看看,十分感谢

把接受放到串口中断子程序里

行,我试试,多谢您的指点~

工作方式改为方式2,还有接收和发送没有明确分开,在发送时不要开接收...数据易出错

方式1下,我在发送的时候把REN设置为0,发送完毕之后再设置为REN=1,这样似乎还是不行,我试试方式2吧,不过感觉方式2和方式1差别不大,就是发送的字节长度和结构有差别

TMOD =0x20就是方式2,它有8位自动重装的功能..我在发送的时候把REN设置为0,发送完毕之后再设置为REN=1,....if(TI)
        {
                TI = 0;
                REN = 1;
        }
        if(RI)
        {
                RI = 0;
                //num = SBUF;SBUF = num;
                REN  = 0;
        }

您看这样行吗?测试还是不行啊。
//U1
#include<reg52.h>
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
unsigned char tb;//transmitted byte,所发送的字节
unsigned char rb;//received byte,所接收的字节
void delay(unsigned int i)
{
        unsigned int m,n;
        for(m=i;m>0;m--)
        for(n=125;n>0;n--);
}
void main()
{               
        EA=1;//全局中断开
        ES=1;//串口中断开
        ET1=1;//计时器1中断开
        TMOD=0x20;//计时器1工作方式2
        TH1=0xfd;//波特率9600
        TL1=0xfd;
        SCON=0x50;//串口初始化方式1,REN=1,允许接收
        PCON=0x00;//SMOD=0,波特率不倍增
        TR1=1;//打开计时器1
        tb=0x00;
        while(1)
        {
                REN=0;
                //发送
                if(K1==0)
                {
                        delay(50);
                        if(K1==0)
                                tb=0xfe;
                }
                if(K2==0)
                {
                        delay(50);
                        if(K2==0)
                                tb=0x7f;
                }
                if(K3==0)
                {
                        delay(50);
                        if(K3==0)
                                tb=0xff;
                }
                                       
                SBUF=tb;
                while(TI==0);
                TI=0;       
               
                //接收
                REN=1;
                rb=SBUF;
                while(RI==0);
                RI=0;
                P2=rb;
                REN=0;
        }                               
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top