xiaoqing13 发表于 2011-6-19 09:47:18

51单片机串口通讯问题

最近项目中要编写一个单片机串口通讯程序,采用的AT89S52型单片机,利用C51编写的程序如下所示。想实现的功能是:PC机发送数据给单片机,单片机接受后存储到一个全局数组里面。通过定义char型全局数组,将PC机发送过来的数据作为数组地址,选择数组中的元素,并赋值给端口。由于采用串口接受数据后立马返还给PC的方式,PC端接受数据正常。但测试时发现端口的值都没有更改,程序工作异常。希望大家能给看看这个程序,指出毛病在什么地方,不甚感谢。还有一个问题就是:C51中数组a,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;                //接受数据存储数组
uchar code Tw_Data={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={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==1)                               
                Mode_Con=1;                       
                else
                              Mode_Con=0;
                j=Rx_Data;                       
                Reg_Data=Tw_Data;                                                
                     LE=1;
                     P0=Reg_Data;                               
                j=Rx_Data;
                Reg_Data=Tw_Data;
                LE=1;
                               P1=Reg_Data;                               
                j=(Rx_Data);                               
                P2=Ip_Data;
                EA=1;                                               
                }       
        }
}
/*主函数*/
void main()
{
        P2=0x00;
        Mode_Con=0;
        Init_Com();                                                       
while(1){}
}

xiaodongenter 发表于 2011-6-20 07:19:28

串口接受中断里边写发送不好吧,发送玩ti置一回再进中断的

xinghuaidong 发表于 2011-6-20 09:00:10

回复【楼主位】xiaoqing13
-----------------------------------------------------------------------

最好不要用中断发送数据。

keen9327 发表于 2011-6-20 09:27:25

接收用中断方式,发送用查询方式,这样好一点
发送也可以用中断,但是你的做法不妥,在TI=1时再发送,不能接受到就在接受中断中发送,这样会出现问题的

siquche 发表于 2014-11-6 16:40:15

有时候出现串口中断接收有问题,FE或PE被置1,请问有什么解决办法

771494781 发表于 2014-11-6 16:42:50

mark!         
页: [1]
查看完整版本: 51单片机串口通讯问题