|
1、串口以查詢方式接收數據,并分別將數據顯示的PB口和返回。
2、內部1 M晶振,程序采用單任務方式,軟件延時。
3、進行此實驗請插上JP1的所有8個短路塊,JP7(LED_EN)短路塊。
4、通過此實驗,可以對串口通信有個初步認識。
5、從JATG上拔下線,連載COM1口上,也就是AVRISP 的COM2口邊上那個,具體可看說明書
AVR mega16學習板
*/
#include "iom16v.h"
#include "macros.h"
/*串口初始化函數*/
void Uart_Init(void) {
UCSRA = 0x02; /*倍速*/
UCSRB = 0x18; /*允許接收和發送*/
UCSRC = 0x06; /*8位數據*/
UBRRH = 0x00;
UBRRL = 12; /*9600*/
}
/*數據發送,查詢方式*/
void Uart_Transmit(unsigned char i) {
while (!(UCSRA & (1<<UDRE))); /* 等待發送緩沖器為空*/
UDR = i; /* 發送數據*/
//while(!(USR&0x20));
/* start transmittion many datas */
while(!(UCSRA&0x40));/*判斷TXC是否發完*/
UCSRA|=0x40;//關TXC
}
/*數據接收,查詢方式*/
unsigned char Uart_Receive( void ) {
while (!(UCSRA & (1<<RXC))); /* 等待接收數據*/
return UDR; /* 獲取并返回數據*/
}
/*延時函數*/
void delay_ms(unsigned char i) {
unsigned char a, b;
for (a = 1; a < i; a++) {
for (b = 1; b; b++) {
;
}
}
}
/*主函數*/
void main(void) {
unsigned char temp;
DDRA = 0x00; /*方向輸入*/
PORTA = 0xFF; /*打開上拉*/
DDRB = 0xFF; /*方向輸出*/
PORTB = 0xFF; /*電平設置*/
DDRC = 0x00;
PORTC = 0xFF;
DDRD = 0x02;
PORTD = 0xFF;
Uart_Init();
SEI(); //允許全局中斷
while(1) {
temp = Uart_Receive(); /*等待接收數據*/
if (temp== 0x6E ) // n
{PORTB = 0xfe; } /*顯示低電平有效*/
if (temp== 0x66) //f 利用scomv21串口助手 發送f 后得到十六進制數0x66
{PORTB = 0xff;}
if (temp== 0x65 ) // e
{PORTB = 0xfd; } /*顯示低電平有效*/
Uart_Transmit(temp); /*發送收到的數據*/
}
}
|
|