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

📄 control.c

📁 基于Keil RTX51Tiny的远程监控采集系统从设备开发
💻 C
字号:
/****************************************/
/* Copyright (c) 2004, 63研究所 苗龙    */
/* All rights reserved.                 */
/* 作    者:苗龙                       */
/****************************************/

#include <reg52.h>                    /* special function registers 8052      */
//#include "SST89x5x4.H"
#include <rtx51tny.h>                 /* RTX-51 tiny functions & defines      */

sbit lrun=P3^5;
sbit lctrl=P3^4;

sbit state0=P1^0;
sbit state1=P1^1;
sbit state2=P1^2;
sbit state3=P1^3;
sbit state4=P1^4;
sbit state5=P1^5;
sbit state6=P1^6;
sbit state7=P1^7;

//注意On='0'
sbit config1=P0^0;
sbit config2=P0^1;
sbit config3=P0^2;
sbit config4=P0^3;
sbit config5=P0^4;
sbit config6=P0^5;
sbit config7=P0^6;
sbit config8=P0^7;
sbit config9=P2^0;
sbit config10=P2^1;

//定义功能码
#define FUN_GetState_M2S	0x3
#define FUN_GetAnalog_M2S	0x4

#define FUN_GetState_S2M	0x3
#define FUN_GetAnalog_S2M	0x4
#define FUN_Error_S2M		0x5
/*
"01H"表示"功能码错误","02H"表示"非法数据寄存器地址",
"03H"表示"数据非法", "04H"表示"设备地址错误",
"05H"表示"查询帧正确,但设备未准备好","06H"表示"设备忙",
"07H"表示"编程错误","08H"表示"奇偶校验错误"。
*/
//定义错误代码
#define ERR_FunCode	 	0x01
#define ERR_RegAddr	 	0x02
#define ERR_Data		0x03
#define ERR_EquAddr		0x04
#define ERR_Ready		0x05
#define ERR_Busy		0x06
#define ERR_Prog		0x07
#define ERR_Check		0x08
//定时参数
#define INTEVAL_TICK		10  //2.4k
#define INTEVAL_GETSTATE	500//5000 tick  5 s
#define INTEVAL_GETANALOG	100//1000 tick  1 s

#define SEND485	1
#define RECV485	0

unsigned char Address;
unsigned short RegStart;
unsigned short RegNum;
unsigned char SysFun;

//状态变量存储区
#define LEN_STATE_AREA	8
unsigned char AreaState[LEN_STATE_AREA];


#define INIT      	0                   /* task number of task:  init           */
#define CLOCK   	1                   /* task number of task:  command        */
#define POLLED     	2                   /* task number of task:  clock          */
#define WAITFRAME   3                   /* task number of task:  keyread        */

unsigned char frameRecv[16];
unsigned char frameSend[16];


extern char putchar (char c);
extern char _getkey (void);
extern unsigned char  istart;        
extern unsigned char  iend;   

extern unsigned char code auchCRCLo[];      //CRC校验表    
extern unsigned char code auchCRCHi[];

void config(void)
{
	unsigned char i,j;
	//取地址
	i=0;
	j=!config7;//高7位
	i+=j<<6;
	j=!config6;
	i+=j<<5;
	j=!config5;
	i+=j<<4;
	j=!config4;
	i+=j<<3;
	j=!config3;
	i+=j<<2;
	j=!config2;
	i+=j<<1;
	j=!config1;
	i+=j;

	Address=i;
	
	//配置串口参数
	if((!config10)==0)//OFF  2.4k
	{
		SCON  = 0x50;                      // mode 1: 8-bit UART, enable receiver   
  		TMOD |= 0x20;                      // timer 1 mode 2: 8-Bit reload         
  		TH1   = 0xf4;                      // reload value 2400 baud                
  		TR1   = 1;                         // timer 1 run                         
  		ES    = 1;                         // enable serial port interrupt        
	}
	else//9.6k
	{
		SCON  = 0x50;                      // mode 1: 8-bit UART, enable receiver   
  		TMOD |= 0x20;                      // timer 1 mode 2: 8-Bit reload         
  		TH1   = 0xfd;                      // reload value 2400 baud                
  		TR1   = 1;                         // timer 1 run                         
  		ES    = 1;                         // enable serial port interrupt      
	}
	//系统参数
	lrun=1;
  	lctrl=RECV485;
}
void Send485()
{
	os_wait (K_TMO, 1, 0);
	lctrl=SEND485;
	os_wait (K_TMO, 1, 0);
}
void Recv485()
{
	os_wait (K_TMO, 1, 0);
	lctrl=RECV485;
	os_wait (K_TMO, 1, 0);
}
//CRC循环校验
unsigned short crc(unsigned char pchar[],unsigned char len)
{
  unsigned char i=0;
  unsigned char uchCRCHi = 0xFF ;             /* 高CRC字节初始化 */ 
  unsigned char uchCRCLo = 0xFF ;             /* 低CRC 字节初始化 */ 
  unsigned char uIndex ;                      /* CRC循环中的??*/ 

  while (len--)                       /* 传输消息缓冲?  ?*/ 
  { 
    //uIndex = uchCRCHi ^ *pchar++ ; /* 计算CRC */ 
    uIndex = uchCRCHi ^ pchar[i] ; /* 计算CRC */ 
    uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ; 
    uchCRCLo = auchCRCLo[uIndex] ; 
	i=i+1;
  } 
  return (uchCRCHi << 8 | uchCRCLo) ; 
}
//unsigned char crct[]={1,2,3,4,5,6,7,8,9,0x0e,0xb3};
//unsigned short crcttt;
//  crcttt=crc(crct,11);
//{0,3,0,0,0,0};{0,3,0,0,0,0,0x45,0xdd};
//
/******************************************************************************/
/*        Task 0 'init': Initialize                                           */
/******************************************************************************/
void init (void) _task_ INIT  {       /* program execution starts here        */
  config();
  os_create_task (POLLED); 
  os_create_task (CLOCK);             /* start clock task                     */
  os_create_task (WAITFRAME); 
  
  
  os_delete_task (INIT);              /* stop init task (no longer needed)    */
}
/******************************************************************************/
/*        Task 2 'clock'                                                      */
/******************************************************************************/
void Getstate (void) 
{    
	AreaState[0]=state0;
	AreaState[1]=state1;
	AreaState[2]=state2;
	AreaState[3]=state3;
	AreaState[4]=state4;
	AreaState[5]=state5;
	AreaState[6]=state6;
	AreaState[7]=state7;
}
void clock (void)  _task_ CLOCK  
{
  unsigned int count;
  count=0;
  while (1)  
  {            
  	if(count%INTEVAL_GETSTATE==0)   
	{
		Getstate();
        lrun=!lrun;
	}
	
	/*
	if(count%INTEVAL_GETANALOG==0)
	{
		os_send_signal (GETANALOG); 
	}
	*/
	
	os_wait (K_TMO, INTEVAL_TICK, 0); 
	count++;
    
  }
}

void waitframe (void)  _task_ WAITFRAME  
{
  while (1)  
  { 
	if(istart==iend)
	{ 
		os_wait (K_TMO, INTEVAL_TICK*4, 0); 
		if(istart==iend)
		{
			os_send_signal (POLLED);
			os_wait (K_SIG,0,0);
		}
		else
			istart=iend;
	}
	else
	{
		istart=iend;
	}
	
  }
}
/******************************************************************************/
/*        Task 1 'command': command processor */
/******************************************************************************/
void SendError(unsigned char ErrCode)
{
	
	switch(ErrCode)
	{
		case 1:
			break;
		case 2:
			break;
		default:
			;
	}
	
}
void SendGetState(void)
{
	unsigned char i,j;
	unsigned short crcResult;
	i=0;	
	
	if((RegStart+RegNum>LEN_STATE_AREA)||(RegNum==0))
		SendError(1);
	else
	{
		frameSend[i++]=Address;
		frameSend[i++]=FUN_GetState_S2M;
		frameSend[i++]=RegNum;

		for(j=0;j<RegNum;j++)
			frameSend[i++]=AreaState[RegStart+j];
		crcResult=crc(frameSend,i);
		frameSend[i++]=crcResult/256;
		frameSend[i++]=crcResult%256;

		//putchar(i);
		for(j=0;j<i;j++)
		{
			putchar(frameSend[j]);	
		}
	}
	
}
void polled (void) _task_ POLLED  {
  unsigned char i=0;
  unsigned short crcResult;
  while (1)  {  
    os_wait (K_SIG,0,0);
	i=0;
	frameRecv[i]=(unsigned char) _getkey();
	if(frameRecv[i]==Address)
	{
		
		frameRecv[++i]=(unsigned char) _getkey();
		switch(frameRecv[i])
		{
			case FUN_GetState_M2S:
				SysFun=FUN_GetState_M2S;

				frameRecv[++i]=(unsigned char) _getkey();
				RegStart=frameRecv[i]*256;
				frameRecv[++i]=(unsigned char) _getkey();
				RegStart+=frameRecv[i];
				
				
				frameRecv[++i]=(unsigned char) _getkey();

				RegNum=frameRecv[i]*256;
				frameRecv[++i]=(unsigned char) _getkey();
				RegNum+=frameRecv[i];
				frameRecv[++i]=(unsigned char) _getkey();//crc high
				frameRecv[++i]=(unsigned char) _getkey();//crc low

				i++;

				

				crcResult=crc(frameRecv,i);//crc 校验
				if(crcResult==0)
				{
					Send485();
					SendGetState();//如果成功,发送数据
					os_wait (K_TMO,50, 0); 
					Recv485();
				}
				break;
		}	
	}
	os_send_signal (WAITFRAME);
  }
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -