?? usart_m8.c
字號:
/*****************************************************************
//ICC-AVR application builder : 2005-8-19 14:40:53
// Target : M8
// Crystal: 7.3728Mhz
// Crystal: 4.6080Mhz
實驗:做usart串行通訊實驗
目的:了解及會使用usart串口
CPU:atmega8L
相關的5個寄存器:UCSRA,UCSRB,UCSRC,UDR,UBRR(UBRRH,UBRRL)
其中:UBRRH和UCSRC共用一個地址
******************************************************************/
/*配置:CKOPT=0,CKSEL3..0=1111,SUT1..0=11(65ms慢速上升電源)*/
#include "usart_m8.h"
unsigned char UART_RX_buff[UART_RX_BUFFER_SIZE];
unsigned char UART_TX_buff[UART_TX_BUFFER_SIZE];
unsigned char Rx_Flag;
unsigned char Rx_Temp,Rx_Count;
unsigned char Rx_Start_Pack_Flag,Rx_Over_Pack_Flag;
unsigned char Write_Error[6] = {'x','w','4','0','x',0};//后面這個零是一定要加的,表示字符串結束
unsigned char Read_Error[6] = {'x','w','8','0','x',0};//或者"\0"
unsigned char aa[5] = {'o','p'};
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
//uart has received a character in UDR
UART_RX_buff[Rx_Count] = UDR;
Rx_Count = Rx_Count+1;
if(Rx_Count == 9)
{
Rx_Flag = true;
//USART_TransmitByte((Rx_Count+0x30));
Rx_Count = 0;
//上位機在這時候要停一會兒,才能發(fā)第二串數(shù)據(jù)
}
//USART_TransmitByte((Rx_Count+0x30));
}
//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
Rx_Count = 0;
Rx_Flag = false;
Rx_Start_Pack_Flag = false;
Rx_Over_Pack_Flag = false;
//本身的uart的初始化
UCSRB = 0x00; //disable while setting baud rate
//UCSRB[RXCIE,TXCIE,UDRIE,RXEN,TXEN,UCSZ2,RXB8,TXB8]
//Bit 7 – RXCIE: RX Complete Interrupt Enable
UCSRA = 0x00;
//UCSRA[RXC,TXC,UDRE,FE,DOR,PE,U2X,MPCM]
UCSRC = (BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0));//設置成8位
//UCSRC[URSEL,UMSEL,UPM1,UPM0,USBS,UCSZ1,UCSZ0,UCPOL]
//位URSEL:寄存器選擇("1"為UCSRC或"0"為UBRRH)
//位UMSEL:工作模式選擇(0為異步,1為同步)
//位UPM1..0:為校驗方式,硬件支持校驗
//位USBS:停止位選擇(0為一位,1為兩位)
//位UCSZ0..2:發(fā)送位數(shù)選擇(如果是8位:011)
//位UCPOL:時鐘極性(只在同步模式使用,異步應置為"0")
UBRRL = 0x77;//baudrate; //set baud rate lo
UBRRH = 0x00; //set baud rate hi(設置波特率只用低四位,加起來一共12位)
//UBRR = baudrate; /* set the baud rate */
UCSRB = ((1<<RXCIE)|(1<<RXEN)|(1<<TXEN));
}
/************************************************************************
接收時采用中斷方式,,,以"包"為單位接收(9個字符)
*************************************************************************/
void UART_Receive(void)
{
if(Rx_Flag == true)
{
Rx_Flag = false;
if((UART_RX_buff[0] == 0x58)&&(UART_RX_buff[8] == 0x58))//0x58 = 'w'
{
Rx_Over_Pack_Flag = true; //這個標志,可以讓主函數(shù)去查
//Rx_Count = 0;//接收計數(shù)器清零
}
//USART_TransmitByte('p');//接收一包完,就發(fā)一個信號叫上機暫停發(fā)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -