打印

模拟串口求助

[复制链接]
1335|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pkrn|  楼主 | 2012-9-22 21:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "usatr.h"
void Hardwareini(void)
{
     nRBPU=1;  //关闭上拉
     ANSEL=0x00;
     ANSELH=0x00;  //关闭模拟端口(暂时用不到)
     INTE=1;//开外部中断
     INTF=0;//开外部中断标志位初始为零
     INTEDG=0;//下降沿触发
     GIE=1;//开全局中断
     PEIE=1;//开外设中断
     RB0=1;//RB0初始值为1
     TRISB0=1;//设置RB0为输入
     RB1=1;//RB0初始值为1
     TRISB1=0;//设置RB0为输出
     RA0=0;
     TRISA0=0;
     RA1=1;
     TRISA1=1;
     PORTC=0x00;
     TRISC=0x00;
     TMR2ON=0;//关模拟波特率
     a=0;//收完一帧后置零
}
void Timeini(void)
{
//*****T0定时器初始化
     T0CS=0;   //选择内部晶振频率/4为定时器0的时钟源
     PSA=0;    //预分频器分配给定时器0
     PS0=1;     
     PS1=0;
     PS2=1;    //以上三项是分频比设为1:64
     TMR0=0x70;//定时器0赋初值(系统基准时钟定为10mS)
     T0IF=0;   //定时器0中断标志位清初始为零
     T0IE=1;   //开定时器0中断
//*****T2定时器初始化
     
     //T2CON=0x02;//T2预分频为1:16,后分频为1:1
     T2CON=0x00;//
     TMR2=0;
     PR2=TRXT;
     TMR2ON=0;
     TMR2IF=0;
     TMR2IE=1;
     a=0;
     num=0;
}
void Time_on(uchar count)
{
     Flag.timE=1;
     Mscount=count;
}
void Time_off(void)
{
     //x++;
     Flag.timE=0;
     Mscount=0;
}
void interrupt server()
{
     if(T0IF && T0IE)
     {
          T0IF=0;
          TMR0=0x70;
          if(Flag.timE)
          {
               Mscount--;
               if(Mscount==0)
               {
                   Flag.timE=0;
                   if(Flag.RX)
                   {
                        Flag.RX=0;//关接收标志位
                        Flag.RXok=1;//接收完成标志位
                        TMR2ON=0;//关模拟波特率
                        a=0;//收完一帧后置零
                   }
               }
          }
     }
     if(TMR2IF && TMR2IE)
     {
          TMR2IF=0;
          if(Flag.RX)
          {
               //x++;
               if(PR2==RXT1)//更换成1倍时间来接收
               {
                    PR2=TRXT;         
               }
               if(RXD==1)
               {
                    RXdata=(RXdata>>1) | 0x80;
               }
               else
               {
              RXdata>>=1;
               }
               num++;
               if(num==8)//收完一个字节
               {
                    TMR2ON=0;
                    num=0;
                    INTF=0;
                    INTE=1;
                    RXBUF[a]=RXdata;
                    RXdata=0;
                    a++;
                    Time_on(2);
               }
               
          }
         
     }
     if(INTE && INTF)
     {
          Time_off();
          INTF=0;
          INTE=0;
          PR2=RXT1;//接收首位1.5倍时间
          TMR2ON=1;
          Flag.RX=1;
         
     }
     
     
}

void main(void)
{
     Hardwareini();
     Timeini();
     while(1)
     {
          if(Flag.RXok)//接收完后的处理
          {
               Flag.RXok=0;
               PORTC=RXBUF[1];
               if(RXBUF[0]==0x55)
               {
                    d1=1;
               }
          }
          if(RA1==0)
          {
               d1=0;
          }
         
          CLRWDT();
     }
}
模拟串口接收的程序,在第一次启动收一字节时似乎会收到结束位,以后就都正常。麻烦高手帮我看看
沙发
NE5532| | 2012-9-23 21:47 | 只看该作者
“在第一次启动收一字节时似乎会收到结束位”是啥意思?停止位本来就要收啊。

使用特权

评论回复
板凳
pkrn|  楼主 | 2012-9-25 12:49 | 只看该作者
问题已找到,是定时的时间上有问题。

使用特权

评论回复
地板
兰天白云| | 2012-9-25 14:43 | 只看该作者
2# NE5532
可停止位是有硬件处理的,不会也不应该到RAM里来

使用特权

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

本版积分规则

211

主题

273

帖子

1

粉丝