OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4493|回复: 2

关于AVR单片机的问题5

[复制链接]

34

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2014-5-27
在线时间
7 小时
发表于 2014-12-3 10:12:44 | 显示全部楼层 |阅读模式
5金钱

各位高手,小弟正在基于AVR开发一款智能小车,遇到“串口接收字符串错误”,调试了一下,发现当屏蔽了端口B后,可以正常显示,对端口B赋值后,无法正常显示。请教其中的原因。谢谢。部分代码如下:

void main(void)
{
    int counter = 0;
   int i;
   int stop_count = 0;
     
   MCUCSR |= BIT(7);
   MCUCSR |= BIT(7);
  
   vInitEeprom();
   uart0_init();
    init_devices();
    EECR |= BIT(EERIE);
   DUTY1=50;
    DUTY2=50;
    LCD_write_string(0,0,dis1);
    LCD_write_string(0,1,"SPACE:");
   memcpy (ControlMsg , "stop" , 4);
   addr = 1;
  
   while(1)
    {
     
//str_send (Xunji);
      if (Xunji == 1)
      {
         
//rcv_new = 0;
         
//str_send ('x');
          stop_count = 0;
          forward();
        
//delay_nms(10);
          if(L_XJ == 0 || R_XJ == 0)
           {
              break;
          }
      }     
      else if (Xunji == 0)
      {
         
//rcv_new = 0;
        
//str_send ('c');
          if (stop_count == 0)
         {
            
//str_send ('c');
             stop();
            stop_count++;
         }
      }           
   }
  
   while(1)
    {     
       if (Xunji == 1)
      {  
         
//rcv_new = 0;
          stop_count = 0;
          switch (PINB&0x03)
           {
               case 0x03:         
                 DUTY1 = 35;
                 DUTY2 = 35;
                
//str_send ('a');
                
forward();
                 break;
              case 0x00:         
                 DUTY1 = 35;
                 DUTY2 = 35;
                
//str_send ('b');
                
forward();
                 break;
              case 0x02:
           
                 for (i = 0 ; i < 5 ; i++)
                 {
                    if ((PINB&0x03) == 0x02)
                    {
                        counter++;
                    }
                    else if ((counter >= 0)&&(counter < 5)&&((PINB&0x03) == 0x03))
                    {
                        break;
                    }

                 }
           
                 if (counter == 5)
                 { 
                    counter = 0;
                     DUTY1 = 40;
                   
//str_send ('c');
                   
left_slow();
                 } 
                 else if (counter != 5)
                 {
                     counter = 0;
              
                    DUTY1 = 40;
                    DUTY2 = 40;
                   
//str_send ('d');
                   
left();
                 }
           
                 break;
              case 0x01:
               
                 for (i = 0 ; i < 5 ; i++)
                 {
                     if ((PINB&0x03) == 0x01)
                    {
                        counter++;
                    }
                    else if ((counter >= 0)&&(counter < 5)&&((PINB&0x03) == 0x03))
                    {
                        break;
                    }
                 }
           
                 if (counter == 5)
                 {
                    counter = 0;
              
                     DUTY2 = 40;
                   
//str_send ('e');
                   
right_slow();

                 } 
                 else if (counter != 5)
                 {
                    counter = 0;
              

                     DUTY2 = 40;
                    DUTY1 = 40;
                   
//str_send ('f');
                   
right();
                 }
                break;
             default:
                 break;
           }
      }
      else if (Xunji == 0)
      {
         
//rcv_new = 0;
          if (stop_count == 0)
          {
            
stop();
            stop_count++;
          }
      }  
     
      start_SB();
   }
}

 

#pragma interrupt_handler usart0_isr:12
void usart0_isr(void)
{
    static unsigned char i;
   
    UCSRB &= ~BIT(7);
   ControlMsg = UDR;
   i++;
   if (i == 4)
   {
       i = 0;
      LCD_write_char(7,1,ControlMsg[0]);
       LCD_write_char(8,1,ControlMsg[1]);
       LCD_write_char(9,1,ControlMsg[2]);
       LCD_write_char(10,1,ControlMsg[3]);

      if (memcmp (ControlMsg , "star" , 4) == 0)
       {
           Xunji = 1;
       }
       else if (memcmp (ControlMsg , "stop" , 4) == 0)
       {
           Xunji = 0;
       }
       else
       {
           ;
       }    
   }
   UCSRB |= BIT(7);
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-4 00:25:35 | 显示全部楼层
好久不用avr了。。。  帮顶...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

17

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2014-4-12
在线时间
0 小时
发表于 2014-12-6 11:44:18 | 显示全部楼层
没看懂。。。
规格严格,功夫到家
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-28 04:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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