📄 rs232.c
字号:
/***************************************************************************
//Actpro International (SZ) Ltd
//Project :
//File :Rs232.c Compiler:Keil
//Editor: LIUYI
//Data: 25-12-26 Ver:可设置定时器T1、T2来产生波特率
//General Function
1、void rs232loop(); //串口数据循环处理函数
2、void Rs232Init(); //串口初始化
3、void rs232write(char watch_data);//串口发送接口
4、void rs232receive(); //中断接收
*/
#include <switch.h>
#define rs_rece_buff_length 0x20
#define rs_send_buff_length 0x20
void rs232loop();
void Rs232Init();
void rs232write(UCHAR watch_data);
UCHAR ReadCCR(UCHAR item);
void WriteCCR(UCHAR item,UCHAR num);
UCHAR ReadCCS(UCHAR item);
void WriteCCS(UCHAR item,UCHAR num);
UCHAR ReadSYSTEM(UCHAR item);
void WriteSYSTEM(UCHAR item,UCHAR num);
void CCSInit();
void CCRInit();
xdata UCHAR rs_rece_buff_readptr _at_ 0x100;
xdata UCHAR rs_rece_buff_writerptr _at_ 0x101;
xdata UCHAR rs_rece_buff[rs_rece_buff_length] _at_ 0x120;
bit rs_send_wait_flag;
xdata UCHAR rs_send_buff_writeptr _at_ 0x102;
xdata UCHAR rs_send_buff_readptr _at_ 0x103;
xdata UCHAR rs_send_buff[rs_send_buff_length] _at_ 0x140;
#define CCS_step 8
#define CCS_type 7
#define CCS_command 6
#define CCS_data5 5
#define CCS_data4 4
#define CCS_data3 3
#define CCS_data2 2
#define CCS_data1 1
#define CCS_data0 0
xdata UCHAR CCS[9] _at_ 0x160; //发送控制命令数组
#define CCR_step 4
#define CCR_type 3
#define CCR_command 2
#define CCR_data1 1
#define CCR_data0 0
xdata UCHAR CCR[5] _at_ 0x170; //接收控制命令数组
xdata UCHAR SYSTEM_PARAMETER[20] _at_ 0x180;
/*
xdata UCHAR test_step _at_ 0x104;
xdata UCHAR test_step2 _at_ 0x105;
xdata UCHAR test_step3 _at_ 0x106;
xdata UCHAR test_step4 _at_ 0x107;
xdata UCHAR test_temp _at_ 0x108;
xdata UCHAR test_temp2 _at_ 0x109;
xdata UCHAR test_temp3 _at_ 0x10A;
xdata UCHAR test_temp4 _at_ 0x10B;
xdata UCHAR test_step5 _at_ 0x10c;
xdata UCHAR test_temp5 _at_ 0x10d;
*/
void Rs232Init()
{
idata UCHAR i;
SCON=SCON|0x50; //串口工作与方式一
PCON=PCON|0x80; //波特率倍频
#ifdef BoradRateUse_T2
//使用T2产生波特率
T2CON=0X30;
T2MOD=0;
RCAP2H=ProfitRate_T2>>8;
RCAP2L=ProfitRate_T2; //DE;
TR2=1; //启动波特率发生器
#else
//使用T1产生波特率
TMOD=TMOD|0x20; //T1为波特率发生器,工作于方式二
TH1=ProfitRate_T1; //12M晶振,2400B/S
TL1=ProfitRate_T1;
TR1=1; //启动T1
#endif
PORT_STORE=PORT;
RCON=RCON_Bank1;
rs_rece_buff_readptr=0;
rs_rece_buff_writerptr=0;
rs_send_wait_flag=0;
rs_send_buff_writeptr=0;
rs_send_buff_readptr=0;
for(i=0;i<rs_rece_buff_length;i++)
{rs_rece_buff[i]=0;}
for(i=0;i<rs_send_buff_length;i++)
{rs_send_buff[i]=0;}
PORT=PORT_STORE;
ES=1;
CCSInit();
CCRInit();
}
void rs232receive() interrupt 4
{
if(TI)
{
TI=0;
rs_send_wait_flag=0;
}
if(RI)
{
RI=0;
PORT_STORE=PORT;
RCON=RCON_Bank1;
rs_rece_buff[rs_rece_buff_writerptr]=SBUF;
rs_rece_buff_writerptr++;
if(rs_rece_buff_writerptr>=rs_rece_buff_length){rs_rece_buff_writerptr=0;}
PORT=PORT_STORE;
}
}
void rs232loop()
{
idata UCHAR temp,i,j;
if(rs_send_buff_readptr!=rs_send_buff_writeptr)
{//发送处理
if(!rs_send_wait_flag)
{
PORT_STORE=PORT;
RCON=RCON_Bank1;
SBUF=rs_send_buff[rs_send_buff_readptr];
rs_send_wait_flag=1;
rs_send_buff_readptr++;
if(rs_send_buff_readptr>=rs_send_buff_length){rs_send_buff_readptr=0;}
PORT=PORT_STORE;
}
}
if(rs_rece_buff_readptr!=rs_rece_buff_writerptr)
{//接收数据处理
PORT_STORE=PORT;
RCON=RCON_Bank1;
temp=rs_rece_buff[rs_rece_buff_readptr];
rs_rece_buff_readptr++;
if(rs_rece_buff_readptr>=rs_rece_buff_length){rs_rece_buff_readptr=0;}
PORT=PORT_STORE;
//在此处添加接收数据处理函数****************
//rs232write(temp);
if(ReadCCR(CCR_step)==0)
{
if(temp==0xD0)
{//查询状态
if(ReadSYSTEM(sp_SystemState)==c_SS_none)
{//交换机空闲状态
rs232write(0x21);
WriteCCR(CCR_step,0);
return;
}
if(ReadSYSTEM(sp_SystemState)==c_SS_intoautosystem)
{//进入智能控制系统 (动作)
rs232write(0x03);
WriteCCR(CCR_step,0);
return;
}
if(ReadSYSTEM(sp_SystemState)==c_SS_inautosystem)
{//处于智能控制系统
rs232write(0x04);
WriteCCR(CCR_step,0);
return;
}
}
if(temp==0xD1)
{//电话铃声
rs232write(temp);
WriteCCR(CCR_step,1);
return;
}
if(temp==0xd2)
{//退出智能家居
WriteCCR(CCR_step,0);
return;
}
if(temp==0xd3)
{//智能家居已准备好
if(ReadSYSTEM(sp_SystemState)==c_SS_intoautosystem)
{
WriteSYSTEM(sp_SystemState,c_SS_inautosystem); //系统由进入状态转变为处于智能系统控制状态
}
rs232write(0xff);
WriteCCR(CCR_step,0);
return;
}
if(temp==0xd4)
{//智能家居未准备好
WriteCCR(CCR_step,0);
return;
}
if(temp==0xd5)
{//APBUS抢险
WriteCCR(CCR_step,0);
return;
}
if(temp==0xde)//用于系统检测 语音通道
{
for(i=0;i<16;i++)
{
for(j=0;j<8;j++)
{
if(Readsoundway(i,j)!=0)
{
rs232write(0x12);
rs232write(i);
rs232write(j);
rs232write(Readsoundway(i,j));
rs232write(0x13);
}
}
}
}
if(temp==0xdf)//用于系统检测 分机状态
{
rs232write(ReadExtTelState(0));
rs232write(ReadExtTelState(1));
rs232write(ReadExtTelState(2));
rs232write(ReadExtTelState(3));
rs232write(ReadExtTelState(4));
rs232write(ReadExtTelState(5));
rs232write(ReadExtTelState(6));
rs232write(ReadExtTelState(7));
}
}
if(ReadCCR(CCR_step)==1)
{
rs232write(temp);
WriteCCR(CCR_step,2);
return;
}
if(ReadCCR(CCR_step)==2)
{
rs232write(temp);
WriteCCR(CCR_step,0);
temp=ReadCCR(CCR_data1);
temp=(temp>>4)*10+((ReadCCR(CCR_data1)<<4)>>4);
WriteSYSTEM(sp_TakeLineOutside,temp);
temp=ReadCCR(CCR_data0);
temp=(temp>>4)*10+((ReadCCR(CCR_data0)<<4)>>4);
WriteSYSTEM(sp_TakeLineAtHome,temp);
return;
}
WriteCCR(CCR_step,0); //防止出错
return;
}
}
void rs232write(UCHAR watch_data)
{
PORT_STORE=PORT;
RCON=RCON_Bank1;
rs_send_buff[rs_send_buff_writeptr]=watch_data;
rs_send_buff_writeptr++;
if(rs_send_buff_writeptr>=rs_send_buff_length){rs_send_buff_writeptr=0;}
PORT=PORT_STORE;
}
void CCSInit()
{
idata UCHAR i;
for(i=0;i<9;i++)
{ReadCCS(i);WriteCCS(i,0);}
}
void CCRInit()
{
idata UCHAR i;
for(i=0;i<5;i++)
{WriteCCR(i,0);}
}
void WriteSYSTEM(UCHAR item,UCHAR num)
{
PORT_STORE=PORT;
RCON=RCON_Bank1;
SYSTEM_PARAMETER[item]=num;
PORT=PORT_STORE;
return;
}
UCHAR ReadSYSTEM(UCHAR item)
{
idata UCHAR temp;
PORT_STORE=PORT;
RCON=RCON_Bank1;
temp=SYSTEM_PARAMETER[item];
PORT=PORT_STORE;
return temp;
}
void WriteCCS(UCHAR item,UCHAR num)
{
PORT_STORE=PORT;
RCON=RCON_Bank1;
CCS[item]=num;
PORT=PORT_STORE;
return;
}
UCHAR ReadCCS(UCHAR item)
{
idata UCHAR temp;
PORT_STORE=PORT;
RCON=RCON_Bank1;
temp=CCS[item];
PORT=PORT_STORE;
return temp;
}
void WriteCCR(UCHAR item,UCHAR num)
{
PORT_STORE=PORT;
RCON=RCON_Bank1;
CCR[item]=num;
PORT=PORT_STORE;
return;
}
UCHAR ReadCCR(UCHAR item)
{
idata UCHAR temp;
PORT_STORE=PORT;
RCON=RCON_Bank1;
temp=CCR[item];
PORT=PORT_STORE;
return temp;
}
/*
if(temp==0xff){test_step=1;PORT=PORT_STORE;return;}
if(test_step==1){test_temp=temp; test_step=2;PORT=PORT_STORE;return;}
if(test_step==2){ConnectTowPoint(test_temp,temp);test_step=0;PORT=PORT_STORE;return;}
if(temp==0xfe){test_step2=1;PORT=PORT_STORE;return;}
if(test_step2==1){test_temp2=temp; test_step2=2;PORT=PORT_STORE;return;}
if(test_step2==2){CutTowPoint(test_temp2,temp);test_step2=0;PORT=PORT_STORE;return;}
if(temp==0xfd){test_step3=1;PORT=PORT_STORE;return;}
if(test_step3==1){test_temp3=temp; test_step3=2;PORT=PORT_STORE;return;}
if(test_step3==2){ConnectTowPoint_CD22100(test_temp3,temp);test_step3=0;PORT=PORT_STORE;return;}
if(temp==0xfc){test_step4=1;PORT=PORT_STORE;return;}
if(test_step4==1){test_temp4=temp; test_step4=2;PORT=PORT_STORE;return;}
if(test_step4==2){CutTowPoint_CD22100(test_temp4,temp);test_step4=0;PORT=PORT_STORE;return;}
if(temp==0xfb){test_step5=1;PORT=PORT_STORE;return;}
if(test_step5==1){test_temp5=temp; test_step5=2;PORT=PORT_STORE;return;}
if(test_step5==2)
{
if(test_temp5==1){SetExtTelErrorSound(temp);}
if(test_temp5==2){SetExtTelWaitSound(temp);}
if(test_temp5==3){SetExtTelQuietSound(temp);}
test_step5=0;PORT=PORT_STORE;return;
}
if(temp==0xf9){TakeOutsideLine(0);return;}
if(temp==0xf8){HoldOutsideLine(0);return;}
if(temp==0xf7){TakeOutsideLine(1);return;}
if(temp==0xf6){HoldOutsideLine(1);return;}
if(temp<10){ExtTelRing(temp);}
if((temp>0x0f)&(temp<0x1a)){ExtTelStopRing(temp-0x10);}
if(temp==0xec){ResourceWatch();}
if(temp==0xef){test();}
if(temp==0xed){test2();}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -