📄 control.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 + -