RS232傳輸(使用DMAR-128開發板,開發環境為AVR Studio)
這是用來練習如何在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; }
電路圖:
成果影片: