微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > 电子工程师杂谈 > 求救 avr串口通信啊啊

求救 avr串口通信啊啊

时间:10-02 整理:3721RD 点击:
谁能给我个能用的串口通信程序给我啊 顺便帮看一下我这个能用不 我是想返回一个八位的数据  但不管我发啥他都全部返回了  
#include <iom16v.h>
#include <macros.h>
#define  uchar unsigned char
#define  uint  unsigned int
#define  mclk   8000000
#pragma interrupt_handler uart_rx:12
int a=1;
uchar rdata,flag=0;
void delay(uint ms)
{
        uint i,j;
        for(i=0;i<ms;i++)
           {
           for(j=0;j<1141;j++);
       }
}
void uart_init(uint baud)
{
    UCSRB=0x00;
   UCSRA=0x00;                     //控制寄存器清零
   UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);   
                                                        //选择UCSRC,异步模式,禁止                        
                                                     //   校验,1位停止位,8位数据位
   baud=mclk/16/baud-1        ;   //波特率最大为65K
   UBRRL=baud;                                                        
   UBRRH=baud>>8;                    //设置波特率
   UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
                                                       //接收、发送使能,接收中断使能
   SREG=BIT(7);                        //全局中断开放
   DDRD|=0X02;                        //配置TX为输出(很重要)
}
void uart_sendB(uchar data)
{
   while(!(UCSRA&(BIT(UDRE)))) ;
   UDR=data;
   while(!(UCSRA&(BIT(TXC))));
   UCSRA|=BIT(TXC);
}
void uart_rx()
{
    flag=1;
    UCSRB&=~BIT(RXCIE);
        rdata=UDR;
        UCSRB|=BIT(RXCIE);
        //a=0;
}
void main()
{
   
    uart_init(19200);
        while(1)
        {
        
        {
           if(flag)
           {
             // uart_sendB(0x55);
                uart_sendB(rdata);
                while(1);
                 flag=0;
           }
        }
        
        }
     
}

还有 我怎么编一个中断处理程序 将接受到的 一组数据 放到一个数组里 然后校验数据是否符合 要是符合就赋给相应的 变量 这样对么
void uart_rx()
{
    short leng;
        uint i,sum=0;
    UCSRB&=~BIT(RXCIE);
        temp[count++]=UDR;
        leng=temp[3];
        if((temp[1]==0xff)&&(temp[2]==0xff))
          {
             for(i=0;i<leng-2;i++)
                  {
                    sum=temp[i+3]+sum;
                  }
             if(temp[leng]==~(sum%256))
              {
                     switch(temp[4])
                       {
                          case 1:
                                             
                                               Red=temp[5];
                                                   Green=temp[6];
                                                   Blue=temp[7];
                                                   Brightnessnew=temp[8];
                                                   scene=COLOR;
                                                   break;
                                             
                                       
                          case 2 :  
                                               Brightnessnew=temp[5];
                                                   scene=BRIGHTNESS;
                                                   break;
                                             
                                          
                                       
                          case 3 :
                                             
                                                   MENU=temp[5];
                                                   if(MENU==0x01)
                                                     scene=HAPPY;
                                                   if(MENU==0x02)
                                                     scene=EXCITE;
                                              if(MENU==0x03)
                                                     scene=UPSET;
                                                         
                                                        break;
                                                
                          case 4 :
                                             
                                                  MENU=temp[5];
                                                   if(MENU==0x01)
                                                     scene=READ;
                                                   if(MENU==0x02)
                                                     scene=SLEEP;
                                              if(MENU==0x03)
                                                     scene=PARTY;
                                                  if(MENU==0X04)
                                                     scene=RAMANTIC;
                                                  break;
                                                  
                         case 5 :
                                                   
                                             Red=temp[5];
                                                 Green=temp[6];
                                                 Blue=temp[7];
                                                 TIME=temp[8];
                                                 scene=CLOCK;
                                                 break;
                                            
                                
                                        }        
                                temp[leng]=0;
                       }
                    temp[1]=0;
                        temp[2]=0;
                    flag=1;
           }
                 else
                     {
                           flag=0;
                           count=0;
                           UCSRB|=BIT(RXCIE);
                           }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top