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

📄 testuart.c

📁 基于电总协议的串口测试程序,MCU为AVR单片机,GCC编译
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<avr/io.h>
#include<avr/interrupt.h>
#include<util/delay.h>
#define fosc 12000000 //晶振4MHZ
#define baud 9600	 //波特率
#define   TIME_10MS    0x88
#define   SOI          0x7E
#define   EOI          0x0D
#define   DEVICEID        0x60    //设备类型定义,分散空调
#define   PROTOCOLVERSION 0x21    //协议版本
#define   U1_SW_VERSION   0x0A00

enum
{
    GETTTIME    = 0x4d,
 	SETTIME     = 0x4e,
 	GETVERSION  = 0x4f,
 	GETADDRESS  = 0x50,
 	GETMODULEID = 0x51,
};

//air conditioner command code
enum
{
	GETANALOGDATAFIXED  = 0x42,	
	GETSWITCHINPUT  = 0x43,
	REMOTECONTROL   = 0x45,
	GETINTEGERPARA  = 0x47,
	SETINTEGERPARA  = 0x49,	
	GETALARMSTATUS  = 0x80,
	GETALARMHISTORY = 0x81,
	GETUNITSTATUS   = 0x82,
	FACTORYMANUTEST = 0xd0,
};

unsigned char  time_10ms;
unsigned char  time_1sFlag;
unsigned char  a[]={0x7E,0x21,0x01,0x60,0x43,0x00,0x00,0xFD,0xAF,0x0D};     //取模拟量
unsigned char  b[]={0x7E,0x21,0x01,0x60,0x42,0x10,0x13,0xFD,0xAB,0x0D};     //取开关量
unsigned char  c[16];
unsigned char  receiveBuffer[100];
unsigned char  transmitBuffer[100];
unsigned char  receivePointer;
unsigned char  transmitPointer;
unsigned char  RxdEndFlag;
unsigned char  RtnValue;
unsigned char CommandID,Address,Version;
unsigned int  LengthCheck;
unsigned int  SumCheck;
int           tempInputSta 		= 240;         			//温度输入(传感器实际值),	乘10处理,35.0=>350				//ONLY_FOR_TEST
int    		  humInputSta 		= 500; 
//ceshiyong
unsigned char unitNoSet;
unsigned int  tmp,tmp1;

void uart1_init(void)
{
 UCSR1B = 0x00; //disable while setting baud rate
 //UCSR1A = 0x00;
 UCSR1C = (1<<UCSZ11)|(1<<UCSZ10);//8bit+1bit stop
 UBRR1L=(fosc/16/(baud+1))%256;
 UBRR1H=(fosc/16/(baud+1))/256;
 UCSR1B =_BV(RXCIE1) | _BV(RXEN1);//|(1<<TXEN1)|(1<<UDRIE1);//RXCEN TXCEN
 PORTD = 0x7d;
 DDRD  = 0xa9;  //wp=0
 PORTG	= 0x10;
 DDRG	= 0x1d;
}
void	DisableSendInterrupt( void )
{
	
	UCSR1B	&= ~(_BV(TXEN1)| _BV(UDRIE1));
	PORTG   &=~ _BV(PG3);		//485CTL1置为低电平	
	return;	
}
void	EnableSendInterrupt( void )
{
	UCSR1B	|= _BV(UDRIE1) | _BV(TXEN1);
	PORTG 	|= _BV(PG3);	//485CTL1置为高电平
	return;	
}
void putchar1(unsigned char c)
	{	 
         while (!(UCSR1A&(1<<UDRE1)));
	 UDR1=c;    
	}	
	
unsigned char getchar1(void)
  	{
	 while(!(UCSR1A& (1<<RXC1)));
         return UDR1;
	}
			

void puts1(char *s)
	{
	while (*s)
		{
		   putchar1(*s);
		   s++;
		}	
	}	
unsigned char hex_to_asc(unsigned char dat)
{
    unsigned char dat1;
    if((dat<10)&&(dat>=0))
       dat1=dat+0x30;
    else
       dat1=dat+0x37;
    return(dat1);

}
unsigned int ByteToASCII(unsigned char bbyte)
{
    unsigned int result;
	
	/*High significant nibble*/
	if ((bbyte >> 4) > 9)
	{
	    /*characters range from 'A' to 'F'*/
	    result = ((bbyte >> 4) + 0x41 - 0x0a);
	}
	else
	{
	    /*Decimal digital*/
		result = ((bbyte >> 4) + 0x30);
	}
	
	/*Get high byte result*/
	result *= 256;
	
	/*Low significant nibble*/
	if ((bbyte & 0x0f) > 9)
	{
	    result += ((bbyte & 0x0f) + 0x41 - 0x0a);
	}
	else
	{
	    result += ((bbyte & 0x0f) + 0x30);
	}
	
	return result;
}

unsigned char ASCIIToByte(unsigned char hinibble, unsigned char lonibble)
{
	unsigned char result;
	
	/*High significant nibble*/
	if (hinibble <= 0x39)
	{
	    /*characters range from '0' to '9'*/
        result = hinibble - 0x30;
	}	    
	else
	{
	    /*characters range from 'A' to 'F'*/
	    result = hinibble - 0x41 + 0x0a;
	}
	
	/*Shift to get hi nibble*/
	result *= 16;
	
	/*Low significant nibble*/
	if (lonibble <= 0x39)
	{
	    /*characters range from '0' to '9'*/
		result += (lonibble - 0x30);
	}
	else
	{
	    /*characters range from 'A' to 'F'*/
	    result += (lonibble - 0x41 + 0x0a);
	}
			
	return result;
}
void TranstmpData( void)
{
	unsigned char i;
	transmitBuffer[0] = SOI;
	for(i=1;i<(sizeof(a)-1);i++)
	{
	    transmitBuffer[2*i-1] = hex_to_asc(a[i] >>4);
	    transmitBuffer[2*i] = hex_to_asc(a[i] &0x0f);
	}
	transmitBuffer[2*sizeof(a)-3] = EOI;
	
}

void InitT1( void )
{
	TCCR1B  = 0x00;
	TIMSK1  = 0x00;
	TCNT1H	= 0xf8;   //10ms定时中断
	TCNT1L	= 0xad;
	TCCR1B	=  _BV(CS10) | _BV(CS11);          //时钟64分频   溢出需要5592ms, 
	TIMSK1  = _BV(TOIE1);                     //允许T1溢出中断                
	return;
}
SIGNAL( TIMER1_OVF_vect )
{
     
        TCNT1H	= 0xf8;   //10ms定时中断
	    TCNT1L	= 0xad;
        time_10ms++;			//计数器加1
	if (time_10ms >= 100)
	{
		time_10ms  = 0;
		time_1sFlag = 1;	        //置1秒标志
                 		
	}	
	return;
}

void	WriteSendData( unsigned char uData )
{	 	
    UDR1	= uData;		
	return;	
}
SIGNAL( USART1_RX_vect )
{
	unsigned char ReceiveByte,i;
	ReceiveByte = UDR1;
	c[i] = UDR1;
	i++;
	if(i>10)
	{
	  i=0;
	}
	if(receivePointer>=1)   //判断收到的第一个字节是否是SOI
	{
		if(ReceiveByte==SOI)
		{
			receivePointer=0;
			receiveBuffer[receivePointer] = ReceiveByte;
			receivePointer++;
		}
		else
		{
			receiveBuffer[receivePointer] = ReceiveByte;
			receivePointer++;
		}
	}
	else
	{
	    if(ReceiveByte==SOI)
		{
			receiveBuffer[receivePointer] = ReceiveByte;
			receivePointer++;
		}
	}
	
	if(receiveBuffer[receivePointer-1]==EOI)  //接收结束
	{
	   if(receivePointer<16)
	   {
          receivePointer = 0;    
	   }
	   else
	   {
	   	  RxdEndFlag=1;
		  //receivePointer = 0;
	   }
	   
	}
	asm("nop");
}
SIGNAL( USART1_UDRE_vect )
{
	tmp++;
	transmitPointer++;
	WriteSendData(transmitBuffer[transmitPointer]);
	if(transmitBuffer[transmitPointer] == EOI)  //发送结束
	{
	   transmitPointer=0;
	   DisableSendInterrupt();
	}
}
unsigned int LengthChecksum(unsigned int length)
{
	unsigned int result = 0;
	result = ((length & 0x0f) + ((length >> 4) & 0x0f) + ((length >> 8) & 0x0f)) % 16;
	result = (~result + 1) & 0x0f;
	result = (result << 12) + length;
	return result;
}
unsigned int Checksum(unsigned char *startaddress, unsigned char length)
{

⌨️ 快捷键说明

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