打印
[51单片机]

求助51单片机串口

[复制链接]
1605|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
soar5233|  楼主 | 2014-2-16 23:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 soar5233 于 2014-2-16 23:19 编辑

帮别人写的一个小程序,他用的AT89C51IC2的芯片.我写程序时候用的STC的开发板.在处理串口接收中断时候出现问题.程序用STC开发板完成运行,但用AT89C51IC2时候串口接收出现问题,只能接受到数组的第二位,后面的接收不到(我用标志位查出来的),两个平台都用的11.0592,9600pbs.
AT89C51IC2在把程序改成1200pbs后可以用.
是不是AT的片子处理速度太慢?串口速率过快,导致无**确接收?请高手帮忙看看应该如何改!!!万分感谢!!

uint8 flag = 0;
uint8 flag1 = 0;
uint8 BUFFER[8];
uint8 Uart_Len;
void uart_init() interrupt 4
{
flag = 0;
Uart_Len = 0;
while(flag<10&&Uart_Len<8)        
       {          if(RI == 1)           
                   {             RI = 0;            
                                 BUFFER[Uart_Len++] = SBUF;            
                                 flag = 0;             flag1 = 1;            }         
                 else { TI=0;flag++;}        }}
main()
{....while(1)
     {if(flag1 ==1)
      { flag1 = 0;
         if(BUFFER[0]==0x0a)   
          {    if(BUFFER[1] == 0x01)      
                {       if(BUFFER[2] == 0x02)         
                          {这里是要做处理的,我给这里放过标志位,但是程序根本到不了这里} (用STC的单片机就不会出现这个问题,想问高手,是时序出的问题吗?谢谢)      }   }
         else if(....).......}}}

相关帖子

沙发
wh6ic| | 2014-2-16 23:48 | 只看该作者
我比较好奇,谁教你这样写中断服务函数的?

使用特权

评论回复
板凳
soar5233|  楼主 | 2014-2-16 23:52 | 只看该作者
wh6ic 发表于 2014-2-16 23:48
我比较好奇,谁教你这样写中断服务函数的?

自己想着想着写的,新手想法总是太多!这个程序在1200时候能用,9600就不行了,高手能帮忙解决下么?

使用特权

评论回复
地板
wh6ic| | 2014-2-17 00:00 | 只看该作者
可能AT多收到一个数据位的上电干扰,你没有容错措施。
试试main()函数进来时加个延时看看,比如延时10毫秒左右。

使用特权

评论回复
5
soar5233|  楼主 | 2014-2-17 00:09 | 只看该作者
wh6ic 发表于 2014-2-17 00:00
可能AT多收到一个数据位的上电干扰,你没有容错措施。
试试main()函数进来时加个延时看看,比如延时10毫秒 ...

在120pbs时候就是好的,关于串口中断也改了很多,写上来的是最早写的一个.
问问高手,会不会是我中断整个周期比9600串口发送字节的时间长,所引起的?1200时候没一点问题.

使用特权

评论回复
6
soso| | 2014-2-23 05:50 | 只看该作者
吃饱闲闲 没啥鸟事儿可干的状况下 问 是这个意思吗 ?

uint8_t UART_Buf[8];
bit SendOK;
bit EnUartHandler;
void UART_Config(void){ //9600 @ 11.0592
    TMOD &amp;= 0x0f;
    TMOD |= 0x20;
    SCON = 0x50;
    TL1 = 0xfd;
    TH1 = 0xfd;
    TR1 = 1;
}
void UART_SendByte(uint8_t byte){
    SBUF = byte;
    while(!SendOK);
    SendOK = 0;
}
void UART_Handler(void){
    if(UART_Buf[0] == 0x0a &amp;&amp; UART_Buf[0] == 0x02 &amp;&amp; UART_Buf[0] == 0x01){
        //处理
    }
}
void main(void){
    UART_Config();
    EA = 1;
    while(1){
        if(EnUartHandler){
            UART_Handler();
            EnUartHandler = 0;
        }
    }
}
void UART_IRQHandler(void)interrupt 4{
    static uint8_t Len
    if(RI){
        RI = 0;
        if(!EnUartHandler){
            UART_Buf[Len] = SBUF
            Len++;
            if(Len == 8){
                Len = 0;
                EnUartHandler = 1;
            }
        }
    }else if(TI){
        TI = 0;
        SendOK = 1;
    }
}

使用特权

评论回复
7
ningling_21| | 2014-2-23 08:35 | 只看该作者
参考6楼的程序...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝