⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kjj19-mn.c

📁 这是一个模拟分站的C51源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************************************************************
*					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 + -