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; }
电路图:
成果影片: