搜索
bottom↓
回复: 5

51单片机串口通讯问题

[复制链接]

出0入0汤圆

发表于 2011-6-19 09:47:18 | 显示全部楼层 |阅读模式
最近项目中要编写一个单片机串口通讯程序,采用的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){}
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2011-6-20 07:19:28 | 显示全部楼层
串口接受中断里边写发送不好吧,发送玩ti置一回再进中断的

出0入0汤圆

发表于 2011-6-20 09:00:10 | 显示全部楼层
回复【楼主位】xiaoqing13
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-6-20 09:27:25 | 显示全部楼层
接收用中断方式,发送用查询方式,这样好一点
发送也可以用中断,但是你的做法不妥,在TI=1时再发送,不能接受到就在接受中断中发送,这样会出现问题的

出0入0汤圆

发表于 2014-11-6 16:40:15 | 显示全部楼层
有时候出现串口中断接收有问题,FE或PE被置1,请问有什么解决办法

出0入0汤圆

发表于 2014-11-6 16:42:50 | 显示全部楼层
mark!         
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 03:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表