STC-uart2协议子程序

#include "STC15F2K60S2.H"
#include "intrins.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

#define uchar unsigned char
#define uint unsigned int

#define FOSC 11059200L //系统频率
#define BAUD2 4800 //串口2波特率

#define T2MS ((65536-FOSC/1000)*2) //定时器0计数值,定时1MS



/*.............串口2寄存器相关定义......................*/
#define S2RI 0x01 //S2CON.0
#define S2TI 0x02 //S2CON.1
#define S2RB8 0x04 //S2CON.2
#define S2TB8 0x08 //S2CON.3
#define S2REN 0x10 //S2CON.4
#define S2_S0 0x01 //P_SW2.0
/*..........................................*/

uint TDSH;
bit TDSHTO; //串口定时超时标志
uchar COMMAND_2[10]={0},command[10]={0};//串口2接受缓存
uchar uart2_data[10]; //串口2发送缓存

uint TempUpLimit=0,TempDwLimit=0; //温度上限我下限变量定义
uint TempValue=0; //当前温度值
uchar DelayValue=5,CopiesValue=10,CondValue=1; //延时时间(默认为5分钟),份数(大于10小于20,默认为10份),状态值(默认为1)
uchar CheckNum=0; //单字节和校验中间变量
uchar Peng_ADDR=1,Module_ADDR=1; //大棚地址(默认为0x01),模块地址(默认为0x01)

sbit WOK=P1^7;
sbit FMING=P3^2;

void DELAYUS(uint umnum) //Us级延时程序
{
uint i,j;
for(i=0;i{
for(j=0;j<12;j++)
{
_nop_();
}
}
}
void uart2_init() //串口2初始化定义
{
//P_SW2 &= ~S2_S0; //S2_S0=0 (P1.0/RxD2, P1.1/TxD2)
P_SW2 |= S2_S0; //S2_S0=1 (P4.6/RxD2_2, P4.7/TxD2_2)
S2CON = 0x50; //8位可变波特率
T2L = (65536 - (FOSC/4/BAUD2)); //设置波特率重装值
T2H = (65536 - (FOSC/4/BAUD2))>>8;
AUXR = 0x14; //T2为1T模式, 并启动定时器2
IE2 = 0x01; //使能串口2中断
}
/*利用串口2连续发送COMMAND_2中num个字节,从第num1个数据开始发送*/
uchar uart2_Senddata(uint num,uint num1)
{
uchar i;
S2CON&=~S2REN;
for(i=0;i{
S2BUF=uart2_data[i+num1];
TDSH=5;//定时10ms
TDSHTO=0;
while(TDSHTO!=1&&(S2CON&S2TI)==0);
if(TDSHTO==1)
{
S2CON|=S2REN;
DELAYUS(10);
return 0;
}
DELAYUS(10);
S2CON &= ~S2TI;
}
DELAYUS(10);
S2CON|=S2REN;
return 1;
}
//串口通信程序//////////////////////////////////////////
//RECIEVECHAR
//IF RECIEVE 0 MEAN RECIEVE FAILED
//接受num个数据放在COMMAND_2[num2]开始的数组
//------------------------------
uchar RECIEVECHAR_2(uchar num,uchar num2)
{
uchar i;
for(i=0;i{
TDSH=5;//定时10ms
TDSHTO=0;
while(TDSHTO!=1&&(S2CON&S2RI)==0);
if(TDSHTO==1)
{
return 0;
}
S2CON &=

~S2RI;
COMMAND_2[i+num2]=S2BUF;
DELAYUS(1);
}
return 1;
}
void uart2_Sendchar(uchar date) //利用串口2发送一个字节
{
S2BUF=date;
TDSH=5;//定时10ms
TDSHTO=0;
while(TDSH!=1&&(S2CON&S2TI)==0);
if(TDSHTO==1)
{
S2CON|=S2REN;
DELAYUS(10);
}
DELAYUS(10);
S2CON &= ~S2TI; //清除S2TI位
DELAYUS(10);
S2CON|=S2REN;
}
void Timer_0_INIT() //定时上位机串口的超时功能
{
AUXR|= 0x80; //定时器0为1T模式
// AUXR &= 0x7f; //定时器0为12T模式

TMOD = 0x00; //设置定时器为模式0(16位自动重装载)
TL0 = T2MS; //初始化计时值
TH0 = T2MS >> 8; //定时1MS
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void tm0_isr() interrupt 1 using 1
{
TL0 = T2MS; //重装计数初值
TH0 = T2MS >> 8;
TDSH--;//定时ms
if(TDSH==0)
{
TDSHTO=1;
}
}
void main()
{
Timer_0_INIT();
uart2_init();
EA=1;
while(1);
}
/*----------------------------
UART2 中断服务程序
-----------------------------*/
void Uart2() interrupt 8 using 1
{
if (S2CON & S2RI)
{
IE2=0x00; //关串口2中断
S2CON &= ~S2RI; //清除S2RI位
COMMAND_2[0] = S2BUF;
if(COMMAND_2[0]==0x5A) //检测命令字头‘Z’
{
if(RECIEVECHAR_2(1,1)==1)
{
if(COMMAND_2[1]==Peng_ADDR) //判断棚地址
{
if(RECIEVECHAR_2(1,2)==1)
{
if(COMMAND_2[2]==Module_ADDR) //判断模块地址
{
if(RECIEVECHAR_2(1,3)==1)
{
if(COMMAND_2[3]==0x41||COMMAND_2[3]==0x42||COMMAND_2[3]==0x43||COMMAND_2[3]==0x44)
{
switch(COMMAND_2[3])
{
case 0x41: //如果为‘A’则为获取大棚信息
uart2_data[0]=TempDwLimit/256;
uart2_data[1]=TempDwLimit%256;
uart2_data[2]=TempUpLimit/256;
uart2_data[3]=TempUpLimit%256;
uart2_data[4]=DelayValue;
uart2_data[5]=CopiesValue;
uart2_data[6]=TempValue/256;
uart2_data[7]=TempValue%256;
uart2_data[8]=CondValue;
uart2_data[9]=uart2_data[0]+uart2_data[1]+uart2_data[2]+uart2_data[3]+uart2_data[4]+uart2_data[5]+uart2_data[6]+uart2_data[7]+uart2_data[8];
if(uart2_Senddata(10,0)==1);
break;
case 0x42: //如果为B,则设定温度的上下限
if(RECIEVECHAR_2(5,4)==1)
{
CheckNum=COMMAND_2[0]+COMMAND_2[1]+COMMAND_2[2]+COMMAND_2[3]+COMMAND_2[4]+COMMAND_2[5]+COMMAND_2[6]+COMMAND_2[7];
if(COMMAND_2[8]==CheckNum&&(COMMAND_2[4]*256+COMMAND_2[5])<=COMMAND_2[6]*256

+COMMAND_2[7]) //检验和校验和温度上限是否大于下限
{
TempDwLimit=COMMAND_2[4]*256+COMMAND_2[5];
TempUpLimit=COMMAND_2[6]*256+COMMAND_2[7];
uart2_data[0]=CheckNum;
if(uart2_Senddata(1,0)==1);
}
}
break;
case 0x43: //如果为C,则为设定延时
if(RECIEVECHAR_2(2,4)==1)
{
CheckNum=COMMAND_2[0]+COMMAND_2[1]+COMMAND_2[2]+COMMAND_2[3]+COMMAND_2[4];
if(COMMAND_2[4]>=5&&COMMAND_2[5]==CheckNum) //校验和校验,和判定份数是否大于5
{
DelayValue=COMMAND_2[4];
uart2_data[0]=CheckNum;
if(uart2_Senddata(1,0)==1);
}
}
break;
case 0x44: //如果为D则为设定份数
if(RECIEVECHAR_2(2,4)==1)
{
CheckNum=COMMAND_2[0]+COMMAND_2[1]+COMMAND_2[2]+COMMAND_2[3]+COMMAND_2[4];
if(COMMAND_2[4]>=10&&COMMAND_2[4]<=20&&COMMAND_2[5]==CheckNum) //校验和,判定份数是否在10份到20份之间
{
CopiesValue=COMMAND_2[4];
uart2_data[0]=CheckNum;
if(uart2_Senddata(1,0)==1);
}
}
break;
}
}
}
}
}
}
}
}

}
if (S2CON & S2TI)
{
S2CON &= ~S2TI; //清除S2TI位

}
IE2=0x01; //开串口2中断
}

相关文档
最新文档