?? usart.c
字號:
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include "usart.h"
//常量定義
#define BAUDRATE 9600 //波特率
#define F_CPU 16000000 //這個已經在makefile里面定義了
void init_USART(void)//USART 初始化
{
//USART 9600 8, n,1 PC上位機軟件(超級終端等)也要設成同樣的設置才能通訊
UCSRC = (1<<URSEL) | 0x06;
//異步,8位數據,無奇偶校驗,一個停止位,無倍速
/*
UBRRH與UCSRC共用I/O 地址。因此訪問該地址時需注意以下問題。
寫訪問
當在該地址執行寫訪問時, USART 寄存器選擇位(URSEL)控制被寫入的寄存器。
若URSEL為0,對UBRRH值更新;若URSEL為1,對UCSRC設置更新
讀訪問
對UBRRH 或UCSRC 寄存器的讀訪問則較為復雜。但在大多數應用中,基本不需要讀這些寄存器
沒有UBRR這個16位寄存器,因為UBRRL(0x09)/UBRRH(0x20)的地址不連續,而且UBRRH跟UCSRC共用地址
*/
//U2X=0時的公式計算
UBRRL= (F_CPU/BAUDRATE/16-1)%256;
UBRRH= (F_CPU/BAUDRATE/16-1)/256;
//U2X=1時的公式計算
//UBRRL= (F_CPU/BAUDRATE/8-1)%256;
//UBRRH= (F_CPU/BAUDRATE/8-1)/256;
//也可根據數據手冊的[波特率設置的例子]查得
//UBRRL = 0x2F; //set baud rate lo
//UBRRH = 0x00; //set baud rate hi
UCSRA = 0x00;
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
//使能接收中斷,使能接收,使能發送
}
void put_c(unsigned char c) //發送采用查詢方式
{
while( !(UCSRA & (1<<UDRE)) );
UDR=c;
}
void put_s(unsigned char *ptr)
{
while (*ptr)
{
put_c(*ptr++);
}
put_c(0x0D);
put_c(0x0A); //結尾發送回車換行
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -