📄 kjj19-mn.c
字号:
/************************************************************************************
* NOTICE:
* NAME: KJF19-MN
* USE: 模拟监控仪(无线)
* VERSION: V6.8
* START DATE: 28/8/2006
* END DATE: 31/10/2006
* MCU: STC89C52RD
* CRYSTAL: 11.0592MHz
* COMPANY: 镇江中煤电子有限公司
* WRITER: 胡峰平
* FUNCTION DESCRIPTION:
************************************************************************************/
#include <At89x52.h>
#include<absacc.h> //引用外部数据存储器XBYTE
#include<intrins.h> //_nop_()引用
//AT89S52 pins define
#define uchar unsigned char
#define uint unsigned int
#define SIOAB P2_0 //Z85C30 A/B 路选择
#define SIODC P2_1 //Z85C30 D/C 数据/控制选择
#define SIOCS P2_4 //Z85C30片选
#define SIOWR P2_2 //Z85C30写信号
#define SIORD P2_3 //Z85C30读信号
#define l_red P1_6 //红发光管
#define l_green P1_7 //绿发光管
#define l_x P1_0 //实验灯
sfr ISP_DATA=0xe2; //内部EEPROM寄存器定义
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_CMD=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;
sfr WDT_CONTR=0xe1; //看门狗
uchar r_count; //红灯计数器
uchar data RIbuf[12]; //串口接收缓存
uchar rsum; //已接收数
uchar rljh; //接收累加和
uchar data TIbuf[10]; //串口发送缓存
uchar tsum; //已发送数
uchar siobuf[15]; //SIO接收数据缓存
uchar siojsgs; //SIO数据个数
uchar data siofs[8]; //sio发送数据缓存
uchar siofsgs; //SIO发送数据个数
uchar data wxfzh[8]; //设定无线挂接分站最大八个
uchar idata wxfzcs[32]; //无线分站的参数
uchar idata fzsj[64]; //8个分站的数据
uchar wxh; //下发分站数组序号,对无线
uchar ddfz; //断电分站
uchar ddcs; //断电参数
uchar data dzzs; //巡检地址总数,对SDLC总线
uchar xjxh; //当前巡检序号 ,对SDLC
uchar RIYC; //接收延迟
uchar xjfzh; //巡检分站号
uchar mm5s; //5秒延迟
uchar mm3s; //3秒延迟
uchar mm20ms; //20-30毫秒延迟
uchar bmoks; //用于Z85C30发送计数
uchar bms; //发送延迟数
uchar qtzlh; //其他指令号
bit bmok; //用于Z85C30发送标记
bit fsok; //发送OK
bit Z85C30zdok; //Z85C30接收中断OK
bit RIBJ; //串口接收标记
bit TIBJ; //串口发送标记
bit RIOK; //接收完成了
bit fzhybj; //分站询问回答标记
bit qtzlbj; //地面下发的其他指令标记
bit CKZY; //串口占用标志
bit qtzlbj; //其他指令标记
void Z85C30_KZJCQ(uchar KZJCQH,uchar KZSJ); //控制寄存器设置
void Z85C30_WR0(uchar KSJ); //WR0设置
uchar Z85C30_JCQRD(uchar JCQH); //寄存器读取
void system_init(void); //系统初始化
void Z85C30_init(void); //Z85C30设置
void Z85C30_init_A(void); //Z85C30设置快速
void delay_ms(unsigned int delay_counter); //毫秒延迟
void sytx(void); //SIO回答
void HY232(uchar ml); //串口输出
void cl232(void); //串口数据处理
void eeprom_w(uchar addrh,uchar addrl,uchar sj);//EEPROM写操作
uchar eeprom_r(uchar addrh,uchar addrl); //EEPROM读操作
void eeprom_clr(uchar addrh,uchar addrl); //EEPROM清空
void main(void); //主程序
void szzd(void); //TO中断
void int0_51(void); //外中断0,Z85C30中断
void int_232(void); //串口中断
/***********************************************************************************
* function: main()
* use:
* input parameter: none
* output parameter: none
***********************************************************************************/
void main(void)
{
uchar m;
P1=0XFF;
P0=0XFF;
P2=0XFF;
P3=0XFF;
SP=0Xf0; //225字节开始
l_red=0;
delay_ms(100);
wxh=0;
xjxh=0;
CKZY=0;
qtzlbj=0;
WDT_CONTR=0x37; //看门狗设置9秒一次的溢出
for(m=0;m<32;m++) //读取8个分站的参数
{
wxfzcs[m]=eeprom_r(0x20,m);
}
for(m=32;m<40;m++) //读8个分站的地址
{
wxfzh[m-32]=eeprom_r(0x20,m);
}
dzzs=eeprom_r(0x20,40); //读取设置分站数
m=eeprom_r(0x20,41); //读取设置分站数反码
if(m+dzzs!=0xFF)
dzzs=0;
Z85C30_init(); //Z85C30初始化
system_init(); //系统初始化
RIOK=0;
rsum=0;
RIbuf[0]=0;
Z85C30zdok=0;
fzhybj=0;
siojsgs=0;
while(1)
{
if(RIOK==1) //**********如果有串口数据包进来***********
{
cl232(); //串口数据处理
RIOK=0;
rsum=0;
} // if(RIOK==1)
if(Z85C30zdok==1) //***********如果有Z85C30数据包接收到,需要回答数据*********
{
for(m=0;m<dzzs;m++)
{
if(wxfzh[m]==siobuf[0]) //如果有设置相同的点号
{
xjxh=m; //确定SDLC巡检的序号
if(siojsgs==15) //给计算机回应监控仪数据
sytx();
break;
}
if(siojsgs==4) //控制命令
{
qtzlh=5;
qtzlbj=1;
break;
}
if(siojsgs==7) //总清命令
{
qtzlh=6;
qtzlbj=1;
break;
}
}
Z85C30zdok=0;
Z85C30_init_A();
}
if(qtzlbj==1) //*******************其他指令标记*****************
{
if(CKZY==0) //检查是否串口空闲60ms了
{
delay_ms(100);
if(CKZY==0)
{
qtzlbj=0;
HY232(qtzlh);
}
}
}
} //while(1)
} //main
/*********************************************************************************
* function: system_init()
* use: 系统初始化
* input parameter: none
* output parameter: none
*********************************************************************************/
void system_init(void)
{
delay_ms(10);
TMOD=0x21; //T0方式1,T1方式2
PCON=0x80;
SCON=0x50; /* 串口方式1, 8-bit UART,接收允许 */
TH0=0xdc;
TL0=0x00;
TH1=0xfd; /* TH1: 19.2k bps @ 11.0592MHz */
TL1=0xfd;
IT0=1; //外中断0下降沿触发
IP=0x02; //T0高优先级
IE=0x93; //允许外部中断0,T0中断,串口中断
TR0=1; //记数T0
TR1=1;
}
/***************************************************************************
实验通信-模拟分站与主接口的通信,回答接口的询问
******************************************/
void sytx(void)
{
uchar data i,b;
WDT_CONTR=0x37; //看门狗设置9秒一次的溢出
SIOAB=1; //设置控制字A路接收
Z85C30_KZJCQ(0x03,0xCC); //WR3 RX不允许接收
SIOAB=0; //B路设置
Z85C30_KZJCQ(0x05,0x69); //WR5 发送8位字符,发送器开放,发送CRC开放
Z85C30_WR0(0x80); //WR0 TX_CRC复位
Z85C30_KZJCQ(0x0A,0x80); //WR10 TX_CRC预置为FF
SIODC=1; //发送上位机地址
P0=0x00; //接口地址
SIOCS=0;SIOWR=0;
_nop_();
SIOWR=1; SIOCS=1;SIODC=0;
Z85C30_WR0(0xC0); //发送欠载/信息结束位复位
i=xjxh*8;
for (b=0;b<8;b++)//把要回答给接口的数据提取
{
siofs[b]=fzsj[i];
i=i+1;
}
for (b=0;b<8;b++) //上传接口8个字节,
{
i=0;
bmoks=0;
bms=3;
bmok=0; //用于SIO发送成功标记
while(i!=0x04)
{
if (bmok==1)
goto willx1;
i=Z85C30_JCQRD(0X00); //读取寄存器中的数据
i=i&0x04;
}
goto pp1;
willx1: break;
pp1:
P0=siofs[b]; //参数数据
SIODC=1; //发送数据
SIOCS=1;SIOWR=1;
SIOCS=0;SIOWR=0;
_nop_();
SIOWR=1; SIOCS=1;
SIODC=0;
}
i=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -