📄 appli.c.bak
字号:
u_char k = 0;
/* 搜索定时消息 */
if (timer_int == 1)
{
timer_int = 0;
if (timer_number > 0)
{
for (i=0; i<timer_number; i++)
{
j = timer_map[i];
timer_count[j]++;
if (timer_count[j] >= timer_len[j])
{
msg_first_push(MSG_TIMER, timer_id[j]);
timer_sign[j] = 0;
timer_count[j] = 0; /* 定时计数 */
k = 1;
}
}
if (k != 0)
{
count_timer_map();
}
}
}
/* 键盘扫描 */
key_setmenu_lcd();
if (key_code != 0xFF) /* 如果有按键则停止采样定时 */
{
clear_timer(T_SAMPLE);
tsample_flag = 0;
}
else if (!tsample_flag)/* 无按键并且采样定时器处于停止状态,则启动采样定时器 */
{
set_timer(QUERY_TIMER_LEN,0,T_SAMPLE);
tsample_flag = 1;
}
com_command_receive(); /* 接收命令 */
}
/*计算CRC校验和使用MTT(0X1021)
参数:
pBuff 为需计算CRC的缓冲区的头指针
BufferLen 缓冲区长度(以字节计)
*/
u_short CalCRC16_1021(u_char x[], u_short BufferLen)
{
u_short i;
u_char j;
u_short crc16 = 0;
u_short mask = 0x1021;
u_char *pByteBuffer;
u_char tmpbyte;
u_short calval;
pByteBuffer = &x[0];
for (i = 0; i < BufferLen; i++)
{
tmpbyte = *pByteBuffer;
calval = tmpbyte << 8;
for (j = 0; j < 8; j++)
{
if ((crc16 ^ calval) & 0x8000)
crc16 = (crc16 << 1) ^ mask;
else
crc16 <<= 1;
calval <<= 1;
}
pByteBuffer++;
}
return crc16;
}
/* 串行接收处理 */
void com_command_receive(void)
{
u_char var1,var4;
u_int crc_data = 0;
var4 = pint_read;
if (var4 != pint_write)
{
var1 = pint_buf[var4];
var4 = var4+1;
if (var4 >= MAX_RINTL)
var4=0;
pint_read = var4;
switch(serial_flag)
{
case 0: /*收到起始位*/
if (var1 == SYN)
{
serial_flag = 1;
}
else
{
serial_flag = 0;
}
break;
case 1:/*收到起始位*/
if (var1 == SYN)
{
serial_flag = 2;
}
else
{
serial_flag = 0;
}
break;
case 2:/*收到同步位*/
if (var1 == STX)
{
serial_flag = 3;
}
else
{
serial_flag = 0;
}
break;
case 3: /*收到组地址*/
if (var1 == ADDRESS[0])
{
serial_flag = 4;
prec_num = 1;
prec_buf[0] = var1;
}
else
{
serial_flag = 0;
}
break;
case 4:/*收到本机地址或者广播地址*/
if ( (var1 == ADDRESS[1]) || (var1 == 0) )
{
prec_num = 2;
prec_buf[1] = var1;
serial_flag = 5;
}
else
{
serial_flag = 0;
}
break;
case 5:/*数据长度*/
prec_num = 3;
prec_buf[2] = var1;
serial_lengthl = var1;
serial_flag = 6;
break;
case 6:
prec_num = 4;
prec_buf[3] = var1;
serial_length |= var1;
serial_length = ( (serial_length << 8) & 0xff00 ) + serial_lengthl + 3;
serial_flag = 7;
break;
case 7:
prec_buf[prec_num] = var1;
prec_num++;
serial_length--;
if (serial_length == 0)
{
crc_data = CalCRC16_1021(prec_buf, prec_num - 2); /* 计算crc校验和(从组地址开始到ETX )*/
if ( ( (crc_data & 0x00ff) == prec_buf[prec_num - 2]) && ( ( (crc_data >>8) & 0x00ff) == prec_buf[prec_num - 1]) ) /* 校验和正确 */
{
prec_num = 1;
var1 = 0;
if ( (prec_buf[4] >= 0x31) && (prec_buf[4] <= 0x3b) ) /* 命令有效 */
{
if (prec_buf[1] != 0x00) /* 如果不是广播地址则回应ACK*/
msg_last_push(MSG_ACK,0);
command_decoder(); /* 如果校验和正确,则进行命令解码 */
}
else
{
msg_last_push(MSG_NAK,0);/* 接收数据错误,则发送NAK */
}
}
else
{
msg_last_push(MSG_NAK,0);/* 接收数据错误,则发送NAK */
}
serial_flag = 0;
prec_num = 1;
}
break;
default:
serial_flag = 0;
prec_num = 1;
break;
}
}
}
/* 串口发送一个字节 */
void com_send_command(u_char onebyte)
{
psend_int = 0;
SBUF = onebyte;
while (psend_int != 1);
}
/* 向主机发送消息帧,入口参数:消息类型 */
void send_command(u_char command)
{
switch (command)
{
case ACK:
com_send_command(SYN);
com_send_command(SYN);
com_send_command(ACK);
break;
case NAK:
com_send_command(SYN);
com_send_command(SYN);
com_send_command(NAK);
break;
default:
break;
}
}
/* 系统消息进入栈首 */
void msg_first_push(u_char type, u_char value)
{
if (msg_number < MAX_MSGNUM)
{
msg_number = msg_number + 1;
if (msg_readp == 0)
{
msg_readp=MAX_MSGNUM-1;
}
else
{
msg_readp = msg_readp - 1;
}
msg_type[ msg_readp] = type;
msg_value[ msg_readp] = value;
}
}
/* 系统消息进入栈尾 */
void msg_last_push(u_char type, u_char value)
{
if (msg_number < MAX_MSGNUM)
{
msg_number = msg_number + 1;
msg_type[ msg_writep] = type;
msg_value[ msg_writep] = value;
msg_writep = msg_writep + 1;
if (msg_writep >= MAX_MSGNUM)
{
msg_writep = 0;
}
}
}
/* 主消息处理子程序 */
void main_message_process(void)
{
u_char i;
u_int crc_data = 0;
switch (msg_nowtype)
{
case MSG_TIMER: /* 定时器消息处理 */
switch (msg_nowvalue)
{
case T_WATCHDOG: /* 1秒定时到 */
clear_timer(T_WATCHDOG);
WDI = ~WDI; /* 喂狗 */
set_timer(WD_TIMER_LEN, 0, T_WATCHDOG);
break;
case T_SAMPLE: /* 5秒定时到 */
clear_timer(T_SAMPLE);
/* add 20050922 */
clear_timer(T_LUMIN);
EX1 = 0; /* 关外部中断1 */
/* end of add */
cur_temp = get_temperature();/* 读当前温度 */
analog_in_data = adc_1549(); /* 读当前模入*/
if (lcd_flag)
{
lcd_flag = 0;
sd2300_read_date();
show_time();
}
else
{
lcd_flag = 1;
show_current_environment(cur_temp, cur_lumin, analog_in_data, SWITCH_IN);
}
set_timer(QUERY_TIMER_LEN, 0, T_SAMPLE);
/* add 20050922 */
fhz_tlc555 = 0;
EX1 = 1; /* 开外部中断1 */
set_timer(LUMIN_TIMER_LEN, 0, T_LUMIN);
/* end of add */
break;
case T_LUMIN: /* 2.5秒定时到 */
clear_timer(T_LUMIN);
EX1 = 0; /* 关外部中断1 */
fhz_tlc555 = (fhz_tlc555 * 2) /5;
cur_lumin = calc_lumin(fhz_tlc555); /*计算当前光强*/
fhz_tlc555 = 0;
EX1 = 1; /* 开外部中断1 */
set_timer(LUMIN_TIMER_LEN, 0, T_LUMIN);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -