51单片机串口通讯问题

2020-01-21 21:44发布

最近项目中要编写一个单片机串口通讯程序,采用的AT89S52型单片机,利用C51编写的程序如下所示。想实现的功能是:PC机发送数据给单片机,单片机接受后存储到一个全局数组里面。通过定义char型全局数组,将PC机发送过来的数据作为数组地址,选择数组中的元素,并赋值给端口。由于采用串口接受数据后立马返还给PC的方式,PC端接受数据正常。但测试时发现端口的值都没有更改,程序工作异常。希望大家能给看看这个程序,指出毛病在什么地方,不甚感谢。还有一个问题就是:C51中数组a[j],j可以为uchar型变量来选择数组中的元素吗?以前试过好像可以选择,但这个程序貌似又不可以,糊涂了。

程序:
/*        包含头文件        */
#include<reg52.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
sbit Mode_Con= P3^2;                       
sbit clk_lock= P3^3;                       
sbit oe1= P3^4;                               
sbit oe2=P3^5;       
sbit LE= P3^6;
/*全局变量*/
uint        i=0;//接受数据位置控制字
uchar Reg_Data;//待发送数据寄存变量
uchar Rx_Data[4];                //接受数据存储数组
uchar code Tw_Data[21]  ={0xfd,0xf7,0xf0,0xe8,0xe0,0xd9,0xd1,0xc9,0xc1,0xba,0xb2,0xaa,0xa3,0x9b,0x93,0x8c,0x84,0x7c,0x75,0x6d,0x65};
uchar code Toff_Data[21]={0xfe,0xf7,0xf0,0xe8,0xe0,0xd9,0xd1,0xc9,0xc2,0xba,0xb2,0xab,0xa3,0x9b,0x93,0x8c,0x84,0x7c,0x75,0x6d,0x65};
uchar code Ip_Data[]=  { 0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
/*串口初始化*/
void Init_Com(void)
{       
    P1=0x00;
    SCON=0X50;                //设置串口工作方式为1
    PCON=0x00;                //波特率不加倍
  TMOD=0x20;                //定时器T1工作方式2
    TH1=0XFD;                //定时器初值:9600波特率
  TL1=0XFD;
    TR1=1;                        //启动定时器1
    EA=1;                        //开中断
  ES=1;                        //允许串口中断
}

/*串口中断处理函数*/
void serial_r() interrupt 4 using 1
{       
        uchar j,k;
        if(RI)
        {
                RI=0;
                Rx_Data=SBUF;
                SBUF=Rx_Data;
                i++;
                if(TI)
                        TI=0;  
                if(i==4)
                {
                 i=0;
                                 k=0;
                EA=0;        //关中断
                if(Rx_Data[k++]==1)                               
                Mode_Con=1;                       
                else
                                Mode_Con=0;
                j=Rx_Data[k++];                       
                Reg_Data=Tw_Data[j];                                                
                     LE=1;
                     P0=Reg_Data;                                 
                j=Rx_Data[k++];
                Reg_Data=Tw_Data[j];
                LE=1;
                               P1=Reg_Data;                                 
                j=(Rx_Data[k++]);                               
                P2=Ip_Data[j];
                EA=1;                                               
                }       
        }
}
/*  主函数  */
void main()
{
        P2=0x00;
        Mode_Con=0;
        Init_Com();                                                       
while(1){}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。