搜索
bottom↓
回复: 3

求助,模拟串口的接收跟发送程序

[复制链接]

出0入0汤圆

发表于 2012-8-9 16:51:19 | 显示全部楼层 |阅读模式
本帖最后由 AM_BBS 于 2012-8-9 16:52 编辑

小弟设计了一个模拟串口的发送接收程序,调试的时候第一个数据是错误的
利用的单片机资源:P1_0用来接收PC机下发的数据(一个起始位,八个数据位,一个结束位),P1_1用来发送数据,外部中断0,定时器1(用来接收数据),定时器中断0(用来发送数据)。波特率4800bps
实现的功能:单片机能正确返回PC机下发的数据。
现在的问题:通过串口调试助手调试,单片机复位后,总是第一个返回的数据是错误的,后面的数据就正确了。(数据的发送函数部分通过测试调试,没有问题)。
目前发现存在的问题:通过修改程序,示波器观察,第一次的数据采样点位置不对,后发数据的采样点就对了。应该是PC机下发数据后,单片机检测到下降沿后,立马触发外部中断,单片机接着就执行数据采集的动作。。可是通过示波器观察后,发现采样点在下降沿后面延迟了300us。延迟了一个位还多才进行的数据采集动作。。
*****************************************************************************************
感觉逻辑上没有出现问题,现在把程序贴上来,希望大神帮我看看,哪里出的问题,小弟感激不尽,先表示感谢啦!!
*****************************************************************************************
# include <reg52.h>
//# include <stdio.h>
sbit P1_3 = P1^3;  //数据输出使能控制管脚
sbit P1_0 = P1^0;  //数据输出管脚                                                                          
sbit P1_1 = P1^1;  //数据出入管脚                                                                          
//unsigned char temp[8];                                                                                          
unsigned char Flag = 0;
unsigned char TxdCnt=0;
unsigned char TxdData;
unsigned char RxdData;
unsigned char RxdFlag;

unsigned char JudgeBit(void);
void SimTxd(unsigned char TData);
//此函数是用来发送数据的
void SimTxd(unsigned char TData)
{       
        TH0 = 0xA0;
        TR0 = 1;
        ET0 = 1;
        EX0 = 0;
        TxdData = TData;
        while(TxdCnt<=9)
        {
                
        }
        TxdCnt = 0;
        TR0 = 0;
        ET0 = 0;
        EX0 = 1;
       

}
//此函数是用来判断串口发出的每一位是0还是1
//判断规则:每一位中四次取值(把每一位平均分成四段),
//最后一次值舍去,只取前三次的值
unsigned char JudgeBit(void)
{
        unsigned char i = 0;
        unsigned char Cnt = 0;
        TH1 = 0xE8;
        TR1 = 1;
        TF1 = 0;
        for(i=0;i<=3;i++)
        {
                while(!TF1)
                {}
                if(P1_1&&(i<=2))
                        Cnt++;
                TF1 = 0;
        }
        if(Cnt>=2)
                return 1;
        else
                return 0;
}  

//初始化
void MCU_Init(void)
{
        IT0 = 1;
        TMOD = 0x22;
        EA = 1;
        ET1 = 0;
        EX0 = 1;
        ET0 = 0;

}

void main()
{
        MCU_Init();
        RxdFlag = 0;
        while(1)
        {
                if(RxdFlag)
                {
                        SimTxd(RxdData);
                        RxdFlag = 0;
                }
//                delay(1000);       
        }       
}
//PC机下发的数据接到P1_1,并一块接到INT0,利用起始位下降沿信号触发外部中断0,
//进入到数据接收处理
void INT0_Rxd(void) interrupt 0
{
        EX0 = 0;
        Flag = JudgeBit();
        if(!Flag)
        {
                unsigned char j;
                unsigned char b[8];
                for(j=0;j<=7;j++)
                        b[j] = JudgeBit();
                for(j=0;j<=7;j++)
                {
                        RxdData>>=1;
                        if(b[j])
                                RxdData|=0x80;
                        else
                                RxdData|=0x00;
//                        Rdata>>=1;
                }
                   RxdFlag = 1;
        }
        EX0 = 1;       
}
//通过定时器0中断,用来发送数据,波特率9600bps
void time0(void) interrupt 1
{
//        TxdCnt ++;
        switch(TxdCnt)
    {
        case    0:
            P1_0 = 0;break;
        case    9:
            P1_0 = 1;break;
        default:
                        if(TxdData&0x01)
                    P1_0 = 1;
                        else
                                P1_0 = 0;
            TxdData>>=1;
                        break;
                       
     }
         TxdCnt++;
               
}

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-8-13 10:07:18 | 显示全部楼层
没人关注??求助啊。。继续求助!!!

出0入0汤圆

发表于 2012-8-13 15:26:10 | 显示全部楼层
把MCU_Init中EA=1放到最后试试

出0入0汤圆

 楼主| 发表于 2012-8-13 16:28:15 | 显示全部楼层
mored 发表于 2012-8-13 15:26
把MCU_Init中EA=1放到最后试试

谢谢帮助。。可是我试了试,还是不行。貌似不是这边的问题。我用示波器看来一下外部中断0触发后 Flag = JudgeBit();的执行时间。。没有在外部中断0下降沿立即执行,而是过了好久(比一位的时候还长)才执行。。不知道为何。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 22:15

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

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