⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart1.c

📁 本实例实现GSM模块的发送短消息
💻 C
字号:
/*    usart寄存器
 usart数据寄存器——UDR
 8位的数据寄存器只有当UDRE置1时才能写入数据
 usart控制和状态寄存器A——UCSRA
 位 7    6     5     4      3      2       1      0
   RXC  TXC   UDRE  FE     DOR    PE      U2X    MPCM
   位7:接收数据完成时置1;
   位6:当发送移位寄存器的全部数据移出后,且在数据寄存器中没有待发送的数据置1;
   位5:数据寄存器为空时置1,可以写入新的发送数据;
   位4:接收帧出错置1;
   位3:接收数据溢出错误;
   位2:校验错误时置1;
   位1:传速速率倍速,异步模式有效;
   位0:多机通讯模式容许;
 usart控制和状态寄存器B——USCRB
 位  7      6      5       4       3       2      1       0
    RXCIE  TXCIE  UDRIE   RXEN    TXEN    UCSZ2  RXB8    TXB8
	位7和位6:RX接收和Tx发送完成中断允许位,当RXC置1或TXC置1时发中断;
	位5:数据寄存器空中断允许;
	位4和位3:数据接收允许和数据发送允许;
	位2:数据字位数大小
	位1和位0:接收数据和发送数据的第8位;
 usart控制和状态寄存器C——USCRC
 位  7      6      5       4       3       2       1       0
    URSEL  UMSEL  UPM1    UPM0    USBS    UCSZ1   UCSZ0   UCPOL
	位7:用于寄存器UCSRC和UBRRH的选择;
	位6:工作模式选择,0为异步模式
	位5和4:校验方式
	位3:停止位选择
	位2和1:传送或接收字符长度,和USCRB中的UCSZ2共同决定位数
	位0:时钟极性选择,异步模式应该写0
 波特率寄存器UBRRL和UBRRH    */
 //典型的USART底层驱动和中间层软件结构示例
 
 #ifndef  _UART1_H__
 #define  _UART1_H__
 #include "iom32v.h"
 //#define   RXB8    1	
 //#define   TXB8    0	
 #define   UPE      2	
 #define   OVR     3
 #define   FE      4	
 //#define   UDRE    5	
 //#define   RXC     7	
 #define   FRAMEING_ERROR    (1<<FE)	
 #define   PARITY_ERROR      (1<<UPE)
 #define   DATA_OVERRUN      (1<<OVR)
 //#define   DATA_REGISTER_EMPTY        (1<<UDRE)
 //#define   RX_COMPLETE       (1<<RXC)
  //USART发送缓冲区大小
 #define   TX_BUFFER_SIZE      200     
 unsigned  char   tx_buffer[TX_BUFFER_SIZE];
 unsigned  char  tx_wr_index,tx_rd_index,tx_counter;
 //tx_wr_index为写缓冲区指针,tx_rd_index为读缓冲区指针,tx_counter为在缓冲区
 //中准备发送的数据个数
 #pragma interrupt_handler uart0_tx_isr:12
void uart0_tx_isr(void)
{
 //character has been transmitted
 if(tx_counter)
    {
	 --tx_counter;
	 UDR=tx_buffer[tx_rd_index];
	 if(++tx_rd_index==TX_BUFFER_SIZE)    tx_rd_index=0;
	}
}
//USART接收缓冲区大小
 #define   RX_BUFFER_SIZE    200
 unsigned  char  rx_buffer[RX_BUFFER_SIZE] 
 unsigned  char  rx_counter,Uart_RecvFlag;   
 //tx_counter为接收到的字符个数,Uart_RecvFlag为接收完成标志位
 #pragma interrupt_handler uart0_rx_isr:10
 void uart0_rx_isr(void)
 {
 //uart has received a character in UDR
  unsigned   char  status,data;
  status=UCSRA;
  data=UDR;
  if(!Uart_RecvFlag)
  {
     if((status & (FRAMING | PARITY_ERROR | DATA_OVERRUN))==0)
	    {
		 rx_buffer[rx_counter] =data;
		 rx_counter++;
		 if(rx_buffer[rx_counter-1] == 13) //判断数据接收是否完成
           {
             nRX0_Len = rx_counter;   //若完成,则返回接收的数据长度
             rx_counter = 0;          //清零接收计数值
			 Uart_RecvFlag=1;         //置位接收完成标志
           }  
		}
  }
       
 }
		
//向USART发送缓冲区
#pragma  used+
void    putchar(unsigned  char  transmit)
{
 while(tx_counter==TX_BUFFER_SIZE);
 #asm("cli");    
 if(tx_counter||((UCSRA & DATA_REGISTER_EMPTY)==0))
    {
	 tx_buffer[tx_wr_index]=transmit;
	 if(++tx_wr_index==TX_BUFFFER_SIZE)  tx_wr_index=0;
	 ++counter;
	}
 else    UDR=transmit;
 #asm("sei");	
}	

#endif   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -