這是用來練習如何在AVR單晶片上利用RS232傳輸,電腦端輸入數值傳送到開發板,透過七段顯示器顯示數值,程式碼如下:

#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/delay.h>
#include <string.h>
#include <stdio.h>
#define F_CPU 7372800
#define BAURDRATE 9600
#define UBRR_VALUE (unsigned char)((unsigned long)F_CPU/(16*(unsigned long)BAURDRATE)-1)
#define UBRR_VALUE_H (unsigned char)UBRR_VALUE>>8
#define UBRR_VALUE_L (unsigned char)UBRR_VALUE
#define D_LE0            PORTD &= ~(1 << PD4) 
#define D_LE1           PORTD |= (1 << PD4)  
#define W_LE0            PORTD &= ~(1 << PD5) 
#define W_LE1           PORTD |= (1 << PD5) 
#define DATA PORTA
#define SIZE 8
unsigned char str[SIZE];
unsigned char getstr[SIZE];
short int counter = -1;
void initialize(void);
void show_one(unsigned char,unsigned char);
void show(unsigned char[]);

void uart0Init(void)
{
    UBRR0H = UBRR_VALUE_H;
    UBRR0L = UBRR_VALUE_L;
    UCSR0B = _BV(RXEN1) | _BV(RXCIE1) | _BV(TXEN1);
    UCSR0C = _BV(UCSZ11) | _BV(UCSZ10);
}

SIGNAL(SIG_USART0_RECV)
{
    
    //str[++counter] = UDR0;
    //if (counter== 7)counter = -1;
    getstr[++counter] = UDR0;
    while(!(UCSR0A&_BV(UDRE1)));
    UDR0=getstr[counter];
    if (!getstr[counter] | getstr[counter] == (unsigned char)13) {
        getstr[counter] = 0;
        strcpy(str,getstr);
        counter = -1;
    }
    
}
int main(void)
{
    initialize();
    uart0Init();
    sei();
    while(1)
    {
        show(str);
    }
    return 0;
}
void show_one(unsigned char number,unsigned char place)
{
    unsigned char pattern[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f,0x40,0x79};
    D_LE1;                    
    W_LE1;                   
    DATA=~(0x01<<place);               
    W_LE0;                    
    DATA=pattern[number];        
    D_LE0;       
    return;                
}

void show(unsigned char seg7[])
{
    unsigned char i;
    for(i=0;seg7[i];i++)
    {
        show_one(seg7[i]-'0',SIZE-(strlen(seg7)-1-i)-1);
        _delay_ms(1);
    }
    for(;i<SIZE;i++)
    {
        show_one(0,SIZE-i-1);
        _delay_ms(1);
    }
    _delay_ms(1);
    return;                    
}
void initialize(void)
{    
    DDRA=0XFF;
    PORTA=0xFF;
    
    DDRC=0XF0;
    PORTC=0xF0;
    
    DDRD=0XFF;
    PORTD=0xFF;
    
    
}

電路圖:

 

成果影片:

  

相关文章