資源簡介
馬潮老師 AVR串口例程代碼 Atmega16
代碼片段和文件信息
/*****************************************************
File?name???????????:?demo_14_1.c
Chip?type???????????:?ATmega16L
Program?type????????:?Application
Clock?frequency?????:?4.000000?MHz
Memory?model????????:?Small
External?SRAM?size??:?0
Data?Stack?size?????:?256
*****************************************************/
#include?
#define?UART_BEGIN_STX??0xBB
#define?UART_END_STX????0xEE
#define?FRAMING_ERROR?(1< #define?PARITY_ERROR?(1< #define?DATA_OVERRUN?(1< #define?DATA_REGISTER_EMPTY?(1< #define?RX_COMPLETE?(1<
#define?TX_BUFFER_SIZE?5
unsigned?char?tx_buffer[TX_BUFFER_SIZE];?????????//?USART?Transmitter?buffer
unsigned?char?tx_wr_indextx_rd_indextx_counter;
//?USART?Transmitter?interrupt?service?routine
interrupt?[USART_TXC]?void?usart_tx_isr(void)
{
????if?(tx_counter)
????{
????????--tx_counter;
????????UDR=tx_buffer[tx_rd_index];
????????if?(++tx_rd_index?==?TX_BUFFER_SIZE)?tx_rd_index=0;
????}
}
void?putchar(unsigned?char?c)
{
????while?(tx_counter?==?TX_BUFFER_SIZE);
????#asm(“cli“)
????if?(tx_counter?||?((UCSRA?&?DATA_REGISTER_EMPTY)==0))
????{
????????tx_buffer[tx_wr_index]=c;
????????if?(++tx_wr_index?==?TX_BUFFER_SIZE)?tx_wr_index=0;
????????++tx_counter;
????}
????else
????????UDR=c;
????#asm(“sei“)
}
#define?RX_BUFFER_SIZE?5
unsigned?char?rx_buffer[RX_BUFFER_SIZE];?????//?USART?Receiver?buffer
unsigned?char?rx_counter;
bit?Uart_RecvFlag;
//?USART?Receiver?interrupt?service?routine
interrupt?[USART_RXC]?void?usart_rx_isr(void)
{
????unsigned?char?statusdata;
????status?=?UCSRA;
????data?=?UDR;
????if?(!Uart_RecvFlag)?????//?判斷是否允許接收一個新的數據包
????{
????????if?((status?&?(FRAMING_ERROR?|?PARITY_ERROR?|?DATA_OVERRUN))==0)
????????{
????????????rx_buffer[rx_counter]?=?data;
????????????rx_counter++;
????????????switch?(rx_counter)
????????????{
????????????????case?1:?????//?檢驗起始字符
???????
- 上一篇:ztree模糊搜索demo
- 下一篇:GLAS數據提取高程,IDL
評論
共有 條評論