📄 appli.lst
字号:
C51 COMPILER V7.09 APPLI 10/09/2005 20:45:34 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE APPLI
OBJECT MODULE PLACED IN E:\C51PRJ\APPNEW\APPLI.OBJ
COMPILER INVOKED BY: d:\keil\c51\BIN\C51.EXE E:\C51PRJ\APPNEW\APPLI.C DB SB OE
line level source
1 /****************************************************************************/
2 /* */
3 /* Copyright (c) 2005, 老树工作室 */
4 /* All rights reserved. */
5 /* */
6 /* http://www.saintone.net Email:hxm0902@163.com */
7 /* QQ:112431149 Tel:010-62966630 */
8 /* */
9 /****************************************************************************/
10 /****************************************************************************/
11 /* 文件名:comapp.c */
12 /* 版 本:Version 1.0 */
13 /* 描 述:实现计算机和单片机的通讯协议,根据计算机发给的命令进行相应操作 */
14 /* 作 者:spot */
15 /* 函 数: */
16 /* clear_timer */
17 /* com_command_receive */
18 /* com_send_command */
19 /* main_message_process */
20 /* message_loop */
21 /* msg_first_push */
22 /* msg_last_push */
23 /* send_command */
24 /* set_timer */
25 /* system_init */
26 /* ext1_int_proc */
27 /* geT_LUMINity */
28 /* time0_over_int */
29 /* com_int_proc */
30 /* command_decoder */
31 /* */
32 /* 历史记录: */
33 /* spot 2005-07-10 Creat Inital version. (Version 1.0) */
34 /****************************************************************************/
35
36 #include <reg52.h>
37 #include <absacc.h>
38 #include <intrins.h>
39 #include "../includes/com.h"
40 #include "../includes/sd2k3drv.h"
41 #include "../includes/lcd.h"
42 #include "../includes/hc595drv.h"
43 #include "keyboard.h"
44
45 u_char calc_lumin(u_int fhz); /* 计算当前光强 */
46
47 extern void write_iic_data(u_char write_data[], u_char address, u_char num); /* 向iic设备写入N个字节 */
48 extern void read_iic_data(u_char read_data[], u_char address, u_char num); /* 从iic设备读取N个字节 */
49 extern void dac_5615(u_int data_in);/* 写入DAC的10bit输入数据 */
50 extern u_int adc_1549(void); /* 读取模拟量输入 */
51 extern u_char get_temperature(void);/* 读取温度子程序 */
52 extern void key_setmenu_lcd(void); /* 键盘扫描 */
53 extern u_char key_code;
54
55 ALARM_DATA_INFO alarm_limit; /* 报警阈值结构变量 */
C51 COMPILER V7.09 APPLI 10/09/2005 20:45:34 PAGE 2
56
57 sbit SWITCH_IN = P3^2; /* 开关量输入信号 */
58 sbit CTRL_RELAY = P3^4; /* 控制继电器开关 */
59 sbit WDI = P0^5; /* 喂狗信号 */
60
61 /* 定时器变量 */
62 bit timer_int; /* 定时到标志 */
63 u_char idata timer_sign[MAX_TNUM]; /* 1:已定时 */
64 u_char idata timer_type[MAX_TNUM]; /* 1:循环定时 0:一般 */
65 u_char idata timer_len[MAX_TNUM]; /* 定时时长 单位: 2ms */
66 u_char idata timer_count[MAX_TNUM]; /* 当前定时计数 */
67 u_char idata timer_id[MAX_TNUM]; /* 定时标识号 */
68 u_char idata timer_map[MAX_TNUM]; /* 定时映射 */
69 u_char timer_number; /* 定时器数目 */
70
71 u_char idata msg_type[MAX_MSGNUM]; /* 消息类型 */
72 u_char idata msg_value[MAX_MSGNUM]; /* 消息数值 */
73 u_char msg_number; /* 消息总数 */
74 u_char msg_nowtype; /* 当前消息类型 */
75 u_char msg_nowvalue; /* 当前消息数值 */
76 u_char msg_readp; /* 消息队列读指针 */
77 u_char msg_writep; /* 消息队列写指针 */
78
79 u_char idata prec_buf[MAX_COMMAND_LEN];/* 命令接收缓冲区 */
80 u_char prec_num; /* 命令接收缓冲区字节数 */
81 u_char idata pint_buf[MAX_RINTL]; /* 串口缓冲区 */
82 u_char pint_read; /* 串口缓冲区读指针 */
83 u_char pint_write; /* 串口缓冲区写指针 */
84 bit psend_int; /* 串口发送允许标志 */
85
86 u_int int_times;
87
88 u_char serial_flag = 0; /* 串口接收数据标志位 */
89 u_char serial_lengthl = 0; /* 消息命令长度低8位 */
90 u_int serial_length = 0; /* 消息命令长度16位 */
91
92 u_char send_buf[15]; /* 消息发送缓冲区 */
93
94 extern u_char date[7]; /* 实时时钟数组 */
95 u_char watchdog_date[7]; /* WATCHDOG数据 */
96
97 u_int analog_in_data; /* 当前模拟量输入 */
98 u_int analog_out_data; /* 当前模拟量输出 */
99 u_char cur_temp; /* 当前温度数值 */
100 u_char cur_lumin; /* 当前光强数值 */
101
102 bit lcd_flag = 1; /* 液晶显示页面标志*/
103
104 u_int fhz_tlc555; /* tlc555输出频率 */
105
106 bit tsample_flag = 0; /* 采样定时标志1:启动,0:停止 */
107
108 u_char ADDRESS[2]; /* byte0:通讯组地址, byte1:开发板地址 */
109
110 /* 外部中断1中断服务程序,使用第2组寄存器 */
111 void ext1_int_proc(void) interrupt 2 using 2
112 {
113 1 fhz_tlc555++;
114 1 }
115
116 /* 计算当前光强 */
117 u_char calc_lumin(u_int fhz)
C51 COMPILER V7.09 APPLI 10/09/2005 20:45:34 PAGE 3
118 {
119 1 u_char lumin = 0;
120 1
121 1 if (fhz <= 2000)/* 光强为0 */
122 1 {
123 2 return 0;
124 2 }
125 1 else if ( (fhz > 2000) && (fhz <= 4770) )/* 光强为0~10 */
126 1 {
127 2 lumin = fhz / 277 - 7.2;
128 2 return lumin;
129 2 }
130 1 else if ( (fhz > 4770) && (fhz <= 5400) )/* 光强为10~20 */
131 1 {
132 2 lumin = fhz / 63 - 65.7;
133 2 return lumin;
134 2 }
135 1 else if ( (fhz > 5400) && (fhz <= 8200) )/* 光强为20~30 */
136 1 {
137 2 lumin = fhz / 280 + 0.7;
138 2 return lumin;
139 2 }
140 1 else if ( (fhz > 8200) && (fhz <= 9600) )/* 光强为30~40 */
141 1 {
142 2 lumin = fhz / 140 - 28.6;
143 2 return lumin;
144 2 }
145 1 else if ( (fhz > 9600) && (fhz <= 10100) )/* 光强为40~50 */
146 1 {
147 2 lumin = fhz / 50 - 152;
148 2 return lumin;
149 2 }
150 1 else if ( (fhz > 10100) && (fhz <= 12100) )/* 光强为50~60 */
151 1 {
152 2 lumin = fhz / 200;
153 2 return lumin;
154 2 }
155 1 else if ( (fhz > 12100) && (fhz <= 12900) )/* 光强为60~100 */
156 1 {
157 2 lumin = fhz / 20 - 545;
158 2 return lumin;
159 2 }
160 1 }
161
162 /* 定时器0中断服务程序 ,使用第1组寄存器 */
163 void time0_over_int(void) interrupt 1 using 1
164 {
165 1 TF0=0;
166 1 timer_int=1;
167 1 TH0 = -(46080 / 256);
168 1 TL0 = -(46080 % 256);
169 1 }
170
171 /* 串口中断服务程序,使用第3组寄存器 */
172 void com_int_proc(void) interrupt 4 using 3
173 {
174 1 u_char temp;
175 1 u_char temp1;
176 1
177 1 if (TI == 1)
178 1 {
179 2 TI = 0;
C51 COMPILER V7.09 APPLI 10/09/2005 20:45:34 PAGE 4
180 2 psend_int = 1; /* 可以发送 */
181 2 }
182 1
183 1 if (RI == 1)
184 1 {
185 2 RI = 0; /* 清串口接收中断 */
186 2 temp1 = SBUF;
187 2 temp = pint_write + 1; /* 判断是否可以写入 */
188 2 if (temp == MAX_RINTL)
189 2 {
190 3 temp=0;
191 3 }
192 2
193 2 if (temp != pint_read)
194 2 {
195 3 pint_buf[pint_write] = temp1; /* 读取数据 */
196 3 pint_write = temp;
197 3 }
198 2 }
199 1 }
200
201 /* 确认正在定时的定时器映射关系 */
202 void count_timer_map(void)
203 {
204 1 u_char loop;
205 1 u_char temp;
206 1
207 1 timer_number = 0;
208 1
209 1 for (loop=0; loop<MAX_TNUM; loop++)
210 1 {
211 2 if (timer_sign[loop] != 0)
212 2 {
213 3 temp = timer_number;
214 3 timer_map[temp] = loop;
215 3 timer_number++;
216 3 }
217 2 }
218 1 }
219
220 /* 设置定时参数 */
221 void set_timer(u_int time_len, u_char type, u_char id)
222 {
223 1 u_char loop;
224 1
225 1 for (loop=0; loop<MAX_TNUM; loop++)
226 1 {
227 2 if (timer_sign[loop] == 0)
228 2 {
229 3 timer_count[loop] = 0; /* 定时计数 */
230 3 timer_sign[loop] = 1; /* 定时标志 */
231 3 timer_type[loop] = type; /* 定时类型 0:一般 1:循环 */
232 3 timer_len[loop] = time_len; /* 时长 10ms 的倍数 */
233 3 timer_id[loop] = id; /* 定时器id */
234 3
235 3 count_timer_map();
236 3 return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -