|
#include <STC12C2052AD.h> /* STC12C1052的头文件*/
//#define RELOAD_COUNT 0xC4 //18.432MHz Crystial,1T,SMOD = 1, 19,200bps
//#define RELOAD_COUNT 0x88 //18.432MHz Crystial,1T,SMOD = 1, 9,600bps
//#define RELOAD_COUNT 0xFB //18.432MHz Crystial,12T,SMOD = 1,19200bps
//#define RELOAD_COUNT 0xFB //18.432MHz Crystial,12T,SMOD = 0,9600bps
//#define RELOAD_COUNT 0xFD //11.0592MHz Crystial,12T,SMOD = 0,9600bps
//软件版本 2Byte 如:Ver1.10,Version_H=1 Version_L=10
#define Version_H 1 //
#define Version_L 0 //
#define InBuf_len 3 // 定义接收数组长度
uchar PACKAGE[3]; //通讯数据缓冲区数组//
uchar InBuf[InBuf_len]; //串口数据接收缓冲区数组
uchar count1; //串口数据接收计数器
uchar read_flag; //如果串口接收的数据达到INBUF_LEN个,且校验没错,就置位取数标志
void UART_Init();
void send_char_com(uchar ch);//向串口发送一个字节数据//
void RevDataPross();
//////////////////////////////////////////////////////////////////////////////////
void INT_SERIAL(void) interrupt 4 //串行中断服务程序,接收到握手信号后设置应答标志//
{
if(RI==1)//是接收产生的中断//
{
RI=0;//清除接收中断标志//
if (SBUF==0xaa)
{
count1=0;
}
else
{
InBuf[count1++]=SBUF;
if(count1==InBuf_len)
{
read_flag=1; //如果串口接收的数据达到INBUF_LEN个,且校验没错, 就置位取数标志
}
}
}
}
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
void send_char_com(uchar ch) //向串口发送一个字节数据//
{
SBUF=ch;//将需发送的字节放到发送缓冲区//
while(TI==0);//等待发送完成//
TI=0;//清除发送完成中断标志//
}
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
void delay() //延时//
{
uchar i,j;
for(i=0;i<200;i++)
{
for(j=0;j<200;j++){}
}
}
//////////////////////////////////////////////////////////////////////////////////
void TX(void) //发送数据帧//
{
uchar verify;
//计算校验值chksum//
verify = PACKAGE[0]+PACKAGE[1]+PACKAGE[2];
// send_char_com(0xaa); //同步头//
send_char_com(PACKAGE[0]); //状态//
send_char_com(PACKAGE[1]); //XH//
send_char_com(PACKAGE[2]); //XL//
send_char_com(verify); //发送校验值//
//led2 = !led2;
}
//////////////////////////////////////////////////////
//函 数 名:UART_Init(void)
//功 能:串口初始化函数
//输入参数:无
//输出参数:无
//返 回 值:无
//////////////////////////////////////////////////////
void UART_Init()
{
// AUXR=0x40;//1T模式
AUXR = 0x80;//12T模式
SCON = 0x50; //无校验//0xD0//0xF0;////方式1 允许接受//SM2=0
TMOD = 0x20; ////T1模式2自动重装 T0模式1,16位定时,
PCON = 0x00; ///0x00波特率不加倍SMOD=0////0x80;波特率翻倍SMOD=1
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1; //波特率开启 //TR0=1;//T0开启
IE |= 0x90 ; //Enable Serial Interrupt ES=1,EA=1
// ES = 1;
// EA = 1;
}
//////////////////////////////////////////////////////////////////////////////////
main()
{
delay();
//初始化//
UART_Init();
led1 = 1;
led2 = 1;
led3 = 1;
read_flag = 0;
count1 = 0;
PACKAGE[0] = 0;
PACKAGE[1] = 0;
PACKAGE[2] = 0;
while(1)
{
if(read_flag==1) //如果已经与PC联机,则向PC发送数据帧//
{
RevDataPross();
// PACKAGE[0] = InBuf[0];
// PACKAGE[1] = InBuf[1];
// PACKAGE[2] = InBuf[2];
delay();
// TX();//向主机发送数据帧///////
read_flag = 0; //没有与连接好//
InBuf[0] = 0xff;
InBuf[1] = 0xff;
InBuf[2] = 0xff;
}
delay();
//led1 = !led1;
}
}
//////////////////////////////////////////////////////
//函 数 名:RevDataPross(void)
//功 能:函数
//输入参数:InBuf[]
//输出参数:无
//返 回 值:无
//////////////////////////////////////////////////////
void RevDataPross()
{
uchar chksum;
chksum=InBuf[0]+InBuf[1];
if(chksum==InBuf[2])
{
switch(InBuf[0])
{
case 0x00:
if(InBuf[1]==0xff)
{
PACKAGE[0] = 0x11;
PACKAGE[1] = 0x22;
PACKAGE[2] = 0x33;
TX();
}
led1 = 0;
break;
case 0x01:
if(InBuf[1]==0x00)
{
PACKAGE[0] = 0xfe;
PACKAGE[1] = Version_H;
PACKAGE[2] = Version_L;
TX();
}
led2 = 0;
break;
case 0x02:
if(InBuf[1]==0x00)
{
PACKAGE[0] = 0xfe;
PACKAGE[1] = 0x88;
PACKAGE[2] = 0x99;
TX();
}
led3 = 0;
break;
default:
led1 = 1;
led2 = 1;
led3 = 1;
send_char_com(0x80); //Error:无此命令
send_char_com(0x97);
return;
}
}
else
{
led1 = 1;
led2 = 1;
led3 = 1;
send_char_com(0xff); //Error: Chksum错误
send_char_com(0xff);
}
}