AVR簡單的串口通信程序
/***********************************************/
/************AVR USART串口調(diào)試****************/
/************ClimberWin 2008.6.29**************/
/*CPU:ATMEGA32L 4MHZ 外部晶振(熔斷位需要先配置好外部晶振)*/
/*說明:AVR串口是通過UDR發(fā)送出去的,類似于51單片機的SBUF*/
/*程序功能:能夠通過串行數(shù)據(jù)發(fā)送給PC機0x12數(shù)據(jù),接收上位機數(shù)據(jù)并且+1后發(fā)送回上位機*/
#include <avr/io.h> //AVR I/O口定義頭文件
#include // 延時頭文件調(diào)用
#include interrupt.h> // 中斷頭文件調(diào)用
#define uchar unsigned char
//引腳定義
#define AVR_RXD 0 //PD0 RXD
#define AVR_TXD 1 //PD1 TXD
//常量定義
#define BAUDRATE 9600 //波特率定義
uchar UART_MID; //定義一個緩存區(qū)數(shù)據(jù)臨時存儲地址
/*******************串口接收中斷服務(wù)程序*************************/
SIGNAL(SIG_USART_RECV) //串口中斷服務(wù)程序
{
UART_MID=UDR; // 從緩沖器中讀取數(shù)據(jù)到UART_MID,臨時存放
UDR=UART_MID+1; //+1后發(fā)送回去數(shù)據(jù)
}
/****************************************************************/
void init_USART(void)//USART 初始化
{
//USART 9600 8, n,1 PC上位機軟件(超級終端等)也要設(shè)成同樣的設(shè)置才能通訊
UCSRC = (1< //異步,8位數(shù)據(jù),無奇偶校驗,一個停止位,無倍速 // UBRR=(F_CPU/BAUDRATE/16-1) UBRRL= (F_CPU/BAUDRATE/16-1)%256; UBRRH= (F_CPU/BAUDRATE/16-1)/256; UCSRA = 0x00; //工作在異步正常模式下 U2X=0 UCSRB = (1< //使能接收中斷,使能接收,使能發(fā)送 } int main(void) { DDRD =(1< PORTD =0xFF; init_USART(); //初始化串口 UDR=0X12; //向串口發(fā)送數(shù)據(jù) sei(); //中斷使能(avr/interrupt.h 中調(diào)用) while (1) { //等待接收,接收后跳轉(zhuǎn)到中斷程序 } }
評論