-
Notifications
You must be signed in to change notification settings - Fork 0
/
Co2.c
116 lines (104 loc) · 1.96 KB
/
Co2.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#define TIMER_LOW 0x9A
#define TIMER_HIGH 0xA9
#include <string.h>
#include "modbus.h"
#include "uart.h"
#include "IO.h"
bit ModbusRecvCompleteFlag, Co2RecvCompleteFlag, msFlag;
uint16 co2Data = 0;
uint8 co2suffix[6] = {0x20, 0x70, 0x70, 0x6d, 0x0d, 0x0a};
void Co2Main()
{
if (Co2RecvCompleteFlag == TRUE)
{
ES = FALSE; //关串口1中断
if (memcmp(Co2RecvBuf[4], co2suffix, sizeof(co2suffix)) == 0) //后六位为有效数据,前4位可以读取
{
co2Data = 0;
co2Data += ((Co2RecvBuf[0] - 0x30) * 1000);
co2Data += ((Co2RecvBuf[1] - 0x30) * 100);
co2Data += ((Co2RecvBuf[2] - 0x30) * 10);
co2Data += ((Co2RecvBuf[3] - 0x30));
}
else
{
//错误处理
}
ES = TRUE; //开串口1中断
}
}
void ModbusMain()
{
uint8 OkFlag = FALSE;
if (ModbusRecvCompleteFlag == TRUE)
{
IE2 &= 0xFE; //关串口2中断
OkFlag = CheckModbusComm();
IE2 |= 0x01; //开串口2中断
if (OkFlag == TRUE) //收到有效485读取消息,准备发送Co2数据
{
SendCo2Data(co2Data);
}
else
{
uart2_wr = 0;
}
}
}
void Timer0Init(void) //1毫秒@22.1184MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = TIMER_LOW; //设置定时初值
TH0 = TIMER_HIGH; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET = 1;
}
//定时器0 1ms 中断
void timer0IntProc() interrupt 1
{
TL0 = TIMER_LOW;
TH0 = TIMER_HIGHT;
msFlag = TRUE;
}
void timerMain(void)
{
if (msFlag == TRUE)
{
if (ModbusRecvFlag == TRUE)
{
ModbusTimeoutCnt--;
if (ModbusTimeoutCnt == 0)
{
ModbusRecvCompleteFlag = TRUE;
uart2_wr = 0;
}
}
if (Co2RecvFlag == TRUE)
{
Co2TimeoutCnt--;
if (Co2TimeoutCnt == 0)
{
Co2RecvCompleteFlag = TRUE;
uart1_wr = 0;
}
}
}
}
void InitMain(void)
{
InitADIO();
Timer0Init();
UartInit();
}
void main(void)
{
InitMain();
while (1)
{
timerMain();
Co2Main();
ModbusMain();
}
}