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

📄 usart.c

📁 avr单片机
💻 C
字号:

/****************************    包含库函数     *******************************/
#include <iom16v.h>
#include <stdio.h>
#include <macros.h>

#include "usart.h"
/******************************************************************************/



unsigned char temprecv[60];              //接收串口数据
unsigned char tempread[6];               //数组串
unsigned char recvnum=0;                 //
unsigned char readnum=0;                 //
unsigned char overflow=0;                //串口缓冲溢出标志位
unsigned char read_available=0;          //
unsigned char ask=0;                     //服务器查询标志

/*****************************    延时函数     ********************************
void delay_us(int time)
{
  while (time)
  time--;
  asm("nop");
}
//////////////////////////////////////////////////////////////////////////////*/


/***************************   串口接收中断程序   *****************************/
#pragma interrupt_handler uart0_rx_isr:16
void uart0_rx_isr (void)
{
 temprecv[recvnum]=UDR;
 recvnum++;
 if (recvnum == 60 ) 
   {
    recvnum=0;
    overflow=1;
   }
}
/******************************************************************************/


/*************************     串口数据发送程序     ***************************/
void send_char (unsigned char data)
{
  //DE_set;
  UCSRB = 0x98;                //开发送中断
  UDR=data;
  while (!(UCSRA & 0x40));
 {
  asm("nop");
 }
 UCSRA |= 0x40; 
 UCSRB = 0x90;                 //关发送中断
 //DE_clr;
}
////////////////////////////////////////////////////////////////////////////////



/***************************     串口读取程序     *****************************/
void uart_read (unsigned char *rdnum)
{
 unsigned char i,k;
 rdnum=tempread;
 if ((overflow == 0) && (recvnum >= (readnum+5)))
   {
    for (i=0;i<6;i++)
	   {
	    tempread[i] = temprecv[(readnum+i)];
	   }
	read_available=1; 
   }
   
 else if ((overflow==1) && ((59+recvnum)>=(readnum+5)))
   {
    for (i=0;i<6;i++)
	    {
		 if ((readnum+i)>59)
		 tempread[i] = temprecv[(readnum+i-59)];
		 else 
		 tempread[i] = temprecv[(readnum+i)];
		}
    read_available=1;
   }
  else 
   {
    read_available=0;
   }       
}
/******************************************************************************/


/***********************     串口接收数据处理程序     *************************/
void urat_act (void)
{
 unsigned char i=0,k=0,p=0;
 
 for (i=0;i<5;i++)
     {
	  if (tempread[i] == 0xAA)
	      {
		   p=i;
		  } 
	 }
 if ((tempread[0]!= 0xAA) && (p == 0)) readnum+=5;
 else if (p != 0) readnum+=p;
 else if ((tempread[0]== 0xAA) && (p == 0))
    {
	 readnum+=5;
	 if ((tempread[1] == device_type) && (tempread[2] == device_number)) //设备类型、设备号正确
	    {
		 k = 0xff ^ tempread[1] ^ tempread[2] ^ tempread[3];
		 if (tempread[4] == k)
		   {
             if (tempread[3] == 0x51)                 //服务器发送查询命令
		         {
                  ask = 1;
				 }
		     else if (tempread[3] == 0x52)            //服务器发送ID验证成功
			     {
                  ;
				 }
		     else if (tempread[3] == 0x53)            //服务器发送ID验证错误
			     {
                  ;
				 }
		     else if (tempread[3] == 0x54)            //服务器发送发票号验证成功
			     {
                  ;
				 }
		     else if (tempread[3] == 0x55)            //服务器发送发票号验证错误
			     {
                  ;
				 }
		     else if (tempread[3] == 0x56)            //服务器接受成功
			     {
                  step = ;
				 }
		     else if (tempread[3] == 0x57)            //服务器接收错误
			     {
                  ask = 1;
				 }
		   }
		 else                                         //要求服务器重发命令
		  {
           DE_set;
  	       delay(200);
	       send_char(0xbb);
		   send_char(device_type);
		   send_char(device_number);
		   send_char(0x46);
		   send_char(0x0);
		   send_char(0xff ^ device_type ^ device_number ^ 0x46 ^ 0x0);
	       DE_clr;
		  }
		}
    }
 if (readnum >59) 
    {
	 readnum-=60;
	 overflow=0; 
	}
}
/******************************************************************************/



/******************************************************************************
 void port_init(void)
{
 PORTA = 0xF0;
 DDRA  = 0xff;
 PORTB = 0xFF;
 DDRB  = 0xE0;
 PORTC = 0xFF;  
 DDRC  = 0x00;
 PORTD = 0x94;
 DDRD  = 0x64;
}
******************************************************************************/

////////////////////////////////////////////////////////////////////////////////
void uart0_init(void)
{
 UCSRA=0x00;
 UCSRB=0x00;
 UCSRB=0x98;
 UCSRC=0x86;                //采用8位模式
 UBRRL=0x19;                //设置波特率
 UBRRH=0x00;               
}
/******************************************************************************/

⌨️ 快捷键说明

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