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

📄 uart1.h

📁 本实例实现GSM模块的发送短消息
💻 H
字号:
/*    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"
 #include "globle_temp.h"
 #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];
	 delay_nus(5);
	 if(++tx_rd_index==TX_BUFFER_SIZE)    tx_rd_index=0;
	}
}

 #pragma interrupt_handler uart0_rx_isr:10
 void uart0_rx_isr(void)
 {
 //uart has received a character in UDR
  char  status,data;
  status=UCSRA;
  data=UDR;
     if((status & (FRAMEING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
	    {
		 rx_buffer[rx_wr_index] =data;
		 if(++rx_wr_index==RX_BUFFER_SIZE)
		    rx_wr_index=0;
		 if(++rx_counter==RX_BUFFER_SIZE)	
		   {
		     rx_counter=0;
			 rx_buffer_overflow=1;
		   }
		 
		}   
 }
 ///*
 #pragma	used+
 char  getchar(void)
 {
  char data;
  while(rx_counter==0);
  data=rx_buffer[rx_rd_index];
  if(++rx_rd_index==RX_BUFFER_SIZE)  rx_rd_index=0;
  #asm("cli");
  --rx_counter;
  #asm("sei");
  return data;
 }
 void  getstring(char *in)
 {
  int i=0;
  while(rx_counter)
    {
     in[i]=getchar( );
	 i++;
	}
 }//*/
//向USART发送缓冲区
 #pragma  used+
void    putchar(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_BUFFER_SIZE)  tx_wr_index=0;
	 ++tx_counter;
	}
 else    UDR=transmit;
 #asm("sei");	
}	
void putstring(char *in,int len) 
{
	int i ;
	if(len == 0)	return ;
	for(i=0;i<len;i++)
	{
		putchar(in[i]) ;
	}
}
#endif   

⌨️ 快捷键说明

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