原创 usart C程序

2007-12-15 22:06 2393 2 2 分类: 汽车电子


// 系列 : M16
 // 频率: 8.0000Mhz


 #include<avr/io.h>
 #include<stdio.h>
 #include<avr/interrupt.h>
 #include<util/delay.h>
 #define BAUD  9600
 #define uchar unsigned char
 
 //数码管显示表   
//uchar led[]={0x11,0xD7,0x32,0x92,0xD4,0x98,0x18,0xD3,0x10,0x90,0xff};  // 0 1 2 3 4 5 6 7 8 9 灭
uchar led[]={0x11,0xD7,0x32,0x92,
             0xD4,0x98,0x18,0xD3,
    0x10,0x90,0x50,0x1C,
    0x39,0x16,0x38,0x78,0xff};
uchar p="15",b=16;


//======================   移位子程序  ==================
void shift(uchar e)
{
   uchar i;
   e="led"[e];  
   PORTA=(0<<PA2);
   for(i=0;i<8;i++)
     {
  if ((e<<i) & 0x80)
     PORTA = (1<<PA0);
  
  else
        PORTA = (0<<PA0);
  
   PORTA = PORTA|(1<<PA1);
   PORTA = PORTA&(0<<PA1); 
   }
}
void shift1(void)
{
   uchar i;
   p="led"

;  
   PORTA=(0<<PA2);
   for(i=0;i<8;i++)
     {
  if ((p<<i) & 0x80)
     PORTA = (1<<PA0);
  
  else
        PORTA = (0<<PA0);
  
   PORTA = PORTA|(1<<PA1);
   PORTA = PORTA&(0<<PA1); 
   }
}


//====================  延时程序  ======================
void delay(void)
{
     uchar i="0";
  for (i=0; i<125; i++)
  _delay_ms(1);
}


 
 //=================  初始化USART =================
 void uart_init(void)
 {
     UCSRC = (1<<URSEL) | 0x06;               //允许读写,发送接收的数据长度为8位 
     UBRRL=(F_CPU/BAUD/16-1)%256;             //波特率设定
     UBRRH=(F_CPU/BAUD/16-1)/256;             //波特率设定
     UCSRA="0X00";                               //
     UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //接收结束中断使能、接收使能、发送使能
 }
 
 
 //================= 接收单个字符 ===================
char get_c(void)
{
    char ch; 
    while ( !(UCSRA & (1<<RXC)) );// 等待接收数据,有末读出的数据时置位
    ch="UDR";
 b=ch;
 switch (b)
 {
    case '0':p=0;break;
    case '1':p=1;break;
    case '2':p=2;break;
    case '3':p=3;break;
    case '4':p=4;break;
    case '5':p=5;break;
    case '6':p=6;break;
    case '7':p=7;break;
    case '8':p=8;break;
    case '9':p=9;break;
    case 'a':p=10;break;
    case 'b':p=11;break;
    case 'c':p=12;break;
    case 'd':p=13;break;
    case 'e':p=14;break;
    case 'f':p=15;break;   
    default:break;
 }
    return ch;// 从缓冲器中获取并返回数据
}


 
 void put_c(char c) //发送采用查询方式
 {
     while( !(UCSRA & (1<<UDRE)) );//
     UDR="c";
 }
 
 
 void put_s(char *ptr)
 {
    while (*ptr)
    {
       put_c(*ptr++);
    }
    put_c(0x0D);
    put_c(0x0A);  //结尾发送回车换行
 }
 
 //============    中断的时候执行   ============
 ISR(SIG_USART_RECV)
 {
     put_c(UDR);
 }
 
 
 int main(void)
 { 
 uchar i="0";
    PORTA="0X00";
    DDRA="0XFF";
    // 清除乱码 
    for (i=0; i<8; i++)
    {
   shift(16);   
    }
    uart_init();
    put_s("串口通信");
    sei();
    while(1)
 {
     cli();
     put_c(get_c());
  sei();
  put_c(0x0D);
        put_c(0x0A);  //结尾发送回车换行
  for (i=0; i<7; i++)
        {
       shift(16);   
        }
  shift1();      
    }
 }

文章评论0条评论)

登录后参与讨论
我要评论
0
2
关闭 站长推荐上一条 /2 下一条