Proteus 51单片机与PC的串口通信调试

2019-07-18 08:34发布

电路图 <p>PC发送到单片机 举例 后显示在数码管并将数据返回PC,以下为源程序,在ST89C52上烧录后没有问题,但是proteus运行出现的如上图输入5对应ASCII码35,但是单片机上为000,返回给电脑的值也是00(16进制)。


#include<reg51.h>
#include<intrins.h>
#define led P0
/*******************************************************************************
实验:单片机与PC串口通信
发送十六进制的数据也就是HEX发送,单片机得到的就是原值;
若文本形式发送,单片机接收到相应的ASCII码;
这里采用十六进制发送,无需转换。
*******************************************************************************/
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
typedef unsigned int u16;          //重定义
typedef unsigned char u8;

/*******************************************************************************
* 函 数 名         :chuanchushi
* 函数功能         :串口初始化
*******************************************************************************/

void chuanchushi()
{
        SCON=0X50;                        //设置为工作方式1
        TMOD=0X20;                        //设置计数器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XF3;                    //计数器初始值设置波特率为4800,
        TL1=0XF3;
        TR1=1;                                            //打开计数器
}


u8 code smgduan[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
//0-9
u8 DisplayData[8];
//用来存放要显示的8位数的值

/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数
*******************************************************************************/
void delay(u16 i)
{
        while(i--);
}

/*******************************************************************************
* 函 数 名         : Display
* 函数功能         : 使用数码管显示
*******************************************************************************/
void Display()
{
        u8 i;
        for(i=0;i<8;i++)
        {
                switch(i)         //位选,选择点亮的数码管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;//显示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//显示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;//显示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0; break;//显示第3位
                        case(4):
                                LSA=0;LSB=0;LSC=1; break;//显示第4位
                        case(5):
                                LSA=1;LSB=0;LSC=1; break;//显示第5位
                        case(6):
                                LSA=0;LSB=1;LSC=1; break;//显示第6位
                        case(7):
                                LSA=1;LSB=1;LSC=1; break;//显示第7位        
                }
                led=DisplayData;//发送段码
                delay(10);                                                 //扫描间隔时间设定      
                led=0x00;//消隐
        }
}


void main()
{
        u8 receiveData;//定义接收数据类型
        chuanchushi();//初始化
        while(1)
        {
                if(RI == 1)                                //判断是否接收到数据
                {
                        receiveData = SBUF;        //读取数据
                        RI = 0;                                //清除标志位
                                                SBUF=receiveData; //发送接收到的数据
                                                while(!ti);       
                  TI=0;                 //清楚接受中断标志位
                        //最大为255,所以只需要前三个数码管//
                        DisplayData[0] = 0x00;// 个位
                        DisplayData[1] = 0x00; //十位
                        DisplayData[2] = 0x00;//百位
                        DisplayData[3] = 0x00;           
                        DisplayData[4] = 0x00;
                        DisplayData[5] = smgduan[receiveData / 100];
                        DisplayData[6] = smgduan[receiveData % 100 / 10];
                        DisplayData[7] = smgduan[receiveData % 10];
                }
                Display();
        }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。