这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 求助,关于模拟串口的C程序问题

共4条 1/1 1 跳转至

求助,关于模拟串口的C程序问题

院士
2006-09-17 18:14:16     打赏
求助,关于模拟串口的C程序问题



关键词: 求助     关于     模拟     串口     程序     问题    

院士
2006-12-22 22:43:00     打赏
2楼
问 /******************************************************************
器件:Atmega8
编译器:ICCAVR6.26A
文件:模拟串口接收
******************************************************************/
/*说明:串行信号发送到(INT1)PD3,利用INT1外部中断和一个定时器timer1来达到接收信号的目的.有下降沿信号在INT1触发中断后,启动T1定时器,同时关闭此INT1外部中断,根据模拟串口的波特率,不断扫描INT1的电平,每位扫描3次,取2次相同的电平,得到该位的值,识别启动位数据位,奇偶校验位.取出八位数据位整合为一个字节,存入模拟串口接收寄存器,并启动模拟接收标志位Rx_m_flag,在其它定时器里处理*/
void int1_isr(void)       
{    
          if((MCSR&(1<<WFST))!=0&&((PIND&0x08)==0)) //(1)
     {
             CLTBIT(GICR,INT1);
        SETBIT(TIMSK,TOIE1);
        SETBIT(TIFR,TOV1);
     }

}
//注(1):MCSR 为一个uchar, 用作在通讯时的状态指示,WFST是Wait_for_Start指示
void rx_isr(void)
{
     if((PIND&0x08)==0)
        CTL++;
     else

        CTH++;
     if(CTH+CTL>MAXDETECT-1) //MAXDETECT 为三次
     {   
         Bit[CTB]=CTH>CTL?1:0;
         CTH=0;
         CTL=0;
         if(CTB==0&&Bit[0]!=0)//启始位错误
         {
               CTB=9;
         }
          else if(CTB==9)                                    //偶校验
         {
              if(!((XOFF%2==0&&Bit[CTB]==0)||
                   (XOFF%2!=0&&Bit[CTB]!=0)))
              {                                                     //错误
                //错误处理
              }
               else
               {
                    Rx_m_data=Bit[1]+Bit[2]<<1+Bit[3]<<2+Bit[4]<<3
                            +Bit[5]<<4+Bit[6]<<5+Bit[7]<<6+Bit[8]<<7;
                   RX_M_BUFF[RX_M_HEAD]=Rx_m_data
                   RX_M_HEAD++;
                    Rx_m_flag=1;

              }
              XOFF=0;
          }
           else if(Bit[CTB]>0)
               XOFF++; //偶校验记数
          if(++CTB>9)
           {
               CTB=0;
               CLTBIT(TIMSK,TOIE1);
               SETBIT(GICR,INT1);
               CLTBIT(MCSR,WFST);
          }
      }
          
}
void timer1_init(void)      
{
    TCCR1A=0x00;
    TCCR1B=0x01;
    TCNT1=336;   //波特率 为 7182(非标)
}
void timer1_ovf_isr(void)
{
     TCNT1=336;
     CLI();
     rx_isr();
     SEI();
}
请各位高手看一下到底是什么问题,我头都痛了,谢谢大家 1: 另外,喂狗在另一个定时器里

专家
2023-03-18 12:25:28     打赏
3楼

学习


专家
2023-03-18 23:17:33     打赏
4楼

学习


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]