📄 testuart.c
字号:
#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 + -