将代码上传到atmega
# define F_CPU 1000000UL
//#include <stddef.h>
#include <avr\io.h>
#include <stdio.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//zmienne dot. odbioru danych
volatile unsigned char odb_x; //odebrana liczba X
volatile unsigned char odb_flaga =0;//flaga informująca main o odebraniu liczby
//bufor znaków ze wzorem funkcji, który wysyłamy po starcie programu
volatile unsigned int usart_bufor_ind; //indeks bufora nadawania
char usart_bufor[30] = "y = 0.3187x^2 + 2x - 7"; //bufor nadawania
void usart_inicjuj(void)
{
//definiowanie parametrów transmisji za pomocą makr zawartych w pliku
//nagłówkowym setbaud.h. Jeżeli wybierzesz prędkość, która nie będzie
//możliwa do realizacji otrzymasz ostrzeżenie:
//#warning "Baud rate achieved is higher than allowed"
#define BAUD 57600 //tutaj podaj żądaną prędkość transmisji
#include <util/setbaud.h> //linkowanie tego pliku musi być
//po zdefiniowaniu BAUD
//ustaw obliczone przez makro wartości
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
#if USE_2X
UCSRA |= (1<<U2X);
#else
UCSRA &= ~(1<<U2X);
#endif
//Ustawiamy pozostałe parametry moduł USART
//U W A G A !!!
//W ATmega8, aby zapisać do rejestru UCSRC należy ustawiać bit URSEL
//zobacz także: http://mikrokontrolery.blogspot.com/2011/04/avr-czyhajace-pulapki.html#avr_pulapka_2
UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); //bitów danych: 8
//bity stopu: 1
//parzystość: brak
//włącz nadajnik i odbiornik oraz ich przerwania odbiornika
//przerwania nadajnika włączamy w funkcji wyslij_wynik()
UCSRB = (1<<TXEN) | (1<<RXEN) | (1<<RXCIE);
}
//--------------------------------------------------------------
ISR(USART_RXC_vect)
{
//przerwanie generowane po odebraniu bajtu
odb_x = UDR; //zapamiętaj odebraną liczbę
odb_flaga = 1; //ustaw flagę odbioru liczby dla main()
}
//--------------------------------------------------------------
ISR(USART_UDRE_vect){
//przerwanie generowane, gdy bufor nadawania jest już pusty,
//odpowiedzialne za wysłanie wszystkich znaków z tablicy usart_bufor[]
//sprawdzamy, czy bajt do wysłania jest znakiem końca tekstu, czyli zerem
if(usart_bufor[usart_bufor_ind]!= 0){
//załaduj znak do rejestru wysyłki i ustaw indeks na następny znak
UDR = usart_bufor[usart_bufor_ind++];
}else{
//osiągnięto koniec napisu w tablicy usart_bufor[]
UCSRB &= ~(1<<UDRIE); //wyłącz przerwania pustego bufora nadawania
}
}
//--------------------------------------------------------------
void wyslij_wynik(void){
//funkcja rozpoczyna wysyłanie, wysyłając pierwszy znak znajdujący się
//w tablicy usart_bufor[]. Pozostałe wyśle funkcja przerwania,
//która zostanie wywołana automatycznie po wysłaniu każdego znaku.
//dodaj do tekstu wyniku znaki końca linii (CR+LF), by na
//ekranie terminala wyniki pojawiały się w nowych liniach
unsigned char z;
for(z=0; z<30; z++){
if(usart_bufor[z]==0){ //czy to koniec takstu w tablicy
//tak znaleziono koniec tekstu, dodajemy znak CR
usart_bufor[z] = 13; //znak powrotu karetki CR (Carrige Return)
usart_bufor[z+1] = 10; //znak nowej linii LF (Line Feed)
usart_bufor[z+2] = 0; //znak końca ciągu tekstu w tablicy
break;
}
}
//Zaczekaj, aż bufor nadawania będzie pusty
while (!(UCSRA & (1<<UDRE)));
//bufor jest pusty można wysłać
//następny znak do wysyłki to znak nr 1
usart_bufor_ind = 0;
//włącz przerwania pustego bufora UDR, co rozpocznie transmisję
//aktualnej zawartości bufora
UCSRB |= (1<<UDRIE);
}
//--------------------------------------------------------------
int main(void)
{
usart_inicjuj(); //inicjuj moduł USART (RS-232)
sei(); //włącz przerwania globalne
wyslij_wynik(); //na początku wysyłamy text wzoru, który po
//resecie jest w tablicy usart_bufor[]
while(1){
//tutaj Twój program ....
//czekamy na informację o odebraniu danej nie blokując mikrokontrolera
if(odb_flaga){
odb_flaga = 0; //zgaś flagę
//wykonaj obliczenia i wynik przekształć na znaki ładując do
//bufora usart_bufor[]
sprintf(usart_bufor, "%f", 0.3187 * odb_x * odb_x + 2 * odb_x - 7);
wyslij_wynik(); //rozpocznij wysyłanie wyniku przez RS-232
}
//w tym czasie można wykonywać dowolny program
//umieść go tutaj lub przed if() powyżej
}
}
他在实际期限中得到的是,除其他外,“•eâ‚ âŤń•Ăeâ™ âŤń”
我想要普通角色。我有微芯片。他希望从终端发送一个数字后求解方程并将结果发回。
代码来自网站:https://mikrokontrolery.blogspot.com/2011/03/rs-232-atmega8-komputer-terminal.html。它使用转换器 CH340G USB RS232 TTL UART USART Arduino
进行连接