📄 module.lst
字号:
C51 COMPILER V3.20, SN-0 MODULE 05/24/04 10:40:00 PAGE 1
DOS C51 COMPILER V3.20, COMPILATION OF MODULE MODULE
OBJECT MODULE PLACED IN MODULE.OBJ
COMPILER INVOKED BY: C:\XINGYAN\FSI\BIN\C51.EXE MODULE.C DB SB OE ROM(LARGE) SMALL OT(2) RB(0)
stmt level source
1 /* module.c
* main program 新驱动(2路7703加2块继电器) 2003/1/11
*/
4 #include "absacc.h"
5 #include "math.h"
6 #include "sja.h"
7 #include "jdq.h"
8 #include "pid.h"
9 #include <reg52.h>
10 #include <intrins.h>
11 #include <string.h>
12 #include "link.h"
13 #include "ad7703_2.h"
14 #include "watchdog.h"
15 #include "delay.h"
16 #include "exp.h"
17 #include "L8279.h"
18 #include "XData.h"
19 //#include "PinAlarm.h"
20 /*==================================================================
Main
==================================================================*/
23 /*
2003-2-27 王嵩
1加入模块PID控制,并有多种算法选择;
2断开模块PID时,由上位机给出控制量;
3上位机能直接控制继电器;
4若无阀位反馈,可用灵敏度法控制;
5新增定时器0中断;
6上位机可优化模块PID各参数;
7实时采集温度数据;
8可一次1帧或5帧收发数据;
*/
34 /*数据采集双缓冲
采集数据ad_val和cool_temp,外部读取ad_val_bk和cool_temp_bk*/
36
37 /*
* 修改:王占成
* zcwang@mail.ustc.edu.cn
* 2003.4.29
* 加入键盘和显示器部分
*
*/
44
45 /***************************************************************/
46 /**********外部变量***************/
47 BYTE RXdata[11];
48 BYTE TXdata[11];
49 idata BYTE nr_frame;
50 idata BYTE TempTimes;
51 idata BYTE PIDTimes;
52 idata BYTE OnNewData;
53 idata BYTE NewLEDStatus;
54 idata BYTE TFlag;
55 idata BYTE DispTtime;
C51 COMPILER V3.20, SN-0 MODULE 05/24/04 10:40:00 PAGE 2
56 idata BYTE DispTFlag;
57
58 idata UINT cool_temp;
59 idata UINT cool_temp_bk;
60 idata UINT ad_val_bk[2];
61 idata UINT SP_nCount = 0;
62
63 BYTE p0val;
64
65
66 void data_sample()/*采集AD7703温度角度数据和室温数据*/
67 {
68 1 ad_val00 = read_ad_1(); ad_val10 = read_ad_2();
69 1 ad_val01 = read_ad_1(); ad_val11 = read_ad_2();
70 1 ad_val02 = read_ad_1(); ad_val12 = read_ad_2();
71 1 ad_val03 = read_ad_1(); ad_val13 = read_ad_2();
72 1
73 1 cool_temp = read_ds_data();
74 1 clear_watchdog();
75 1 return;
76 1 }
77 void order(UINT * table,BYTE size)/*排序 put the max into ad_val_0[4]*/
78 {
79 1 BYTE i,j;
80 1 UINT tmp;
81 1 for(i=size-1;i>=1;i--){/*共比较(size-1)轮*/
82 2 clear_watchdog();
83 2 for(j=0;j<i;j++){
84 3 if(table[i] < table[j]){
85 4 tmp = table[j];
86 4 table[j] = table[i];
87 4 table[i] = tmp;
88 4 }
89 3 }
90 2 }
91 1 return;
92 1 }
93 void cp_temp()/*处理7703采集的数据*/
94 {
95 1 EA=0;
96 1 order((UINT *)XAD0,4);/*将ad_val[i]去掉1个最大值,1个最小值,剩余2个求平均*/
97 1 order((UINT *)XAD1,4);
98 1 ad_val_bk[0] = (ad_val01+ad_val02)>>1;
99 1 ad_val_bk[1] = (ad_val11+ad_val12)>>1;
100 1 cool_temp_bk = cool_temp & 0x7FF;
101 1 EA=1;
102 1 clear_watchdog();
103 1 return;
104 1 }
105
106 void PinAlarm() /***++=蜂鸣器报警程序++=***/
107 { BYTE i;
108 1 for(i=0;i<500;i++){ /***产生500Hz方波,持1秒***/
109 2 P2=0x28; /***选通Y1***/
110 2 delay1ms();
111 2 P2=0xF8;
112 2 delay1ms();
113 2 }
114 1 clear_watchdog();
115 1 AlarmFlag = 0;
116 1 }
117
C51 COMPILER V3.20, SN-0 MODULE 05/24/04 10:40:00 PAGE 3
118 void init_system() /*系统初始化*/
119 {
120 1 BYTE baud;
121 1 EA = 0; /* 禁止中断 */
122 1
123 1 /* 设置CPU寄存器 */
124 1
125 1 IE=0x2F; /*定时器0中断计算温度角度*/
126 1 /*定时器1中断设定值曲线*/
127 1 /*定时器2中断PID计算*/
128 1 /*外部中断0收发数据*/
129 1 /*外部中断1响应键盘中断*/
130 1
131 1 IP=0x01; /*外部中断0优先级最高*/
132 1
133 1 TCON=0x01; /*外部中断0下降沿触发,外部中断1低电平触发*/
134 1 T2CON = 0x00; /*中断程序设置T2CON.7 = 0, T2CON.2 = 0 (stop counter) */
135 1 T2MOD = 0x00; /*增计数*/
136 1 RCAP2H = 0x9E;
137 1 RCAP2L = 0x58;/*定时长度25ms*/
138 1 TMOD=0x11; /*定时器0,1工作在模式1,16位定时器*/
139 1 TH0 = 0;
140 1 TL0 = 0; /*定时器0定时长度65ms*/
141 1 TH1 = 0x3c;
142 1 TL1 = 0xaf; /*定时器0定时长度50ms*/
143 1
144 1 /* 读取模块地址 */
145 1
146 1 P2 = 0x08;
147 1 p0val = P0; /*不要使用访问内存的方法读取*/
148 1 P2 = 0xF8;
149 1
150 1 /* 设置外设 */
151 1 init_watchdog(); /*初始化看门狗*/
152 1 Init_8279();
153 1 init_jdq();
154 1 init_ad7703(); /* 4k Hz */
155 1
156 1 switch(p0val&0xc0){
157 2 case 0x00: baud=0xc3; break;
158 2 case 0x40: baud=0xc9; break;
159 2 case 0x80: baud=0xd3; break;
160 2 case 0xc0: baud=0xe7; break;
161 2 }
162 1
163 1 clear_watchdog();
164 1 init_sja(p0val&0x3f,baud);
165 1
166 1 if((PIDIni != 0x01)&&(RFlag!=0xc5)) { /***+++++ 上电复位时,初始化各PID参数++++****/
167 2 Init_Para();
168 2 PIDIni = 0x01;
169 2 }
170 1
171 1
172 1
173 1
174 1 EA = 1;
175 1
176 1 TR0 = 1;/*定时器0开*/
177 1 TR2 = 1;/*定时器2开*/
178 1 if(RFlag==0xC5)
179 1 TR1 = 1; /*定时器1开*/
C51 COMPILER V3.20, SN-0 MODULE 05/24/04 10:40:00 PAGE 4
180 1 return;
181 1 }
182
183 void main()
184 {
185 1 BYTE i;
186 1 OnNewData = TRUE;
187 1 NewLEDStatus = TRUE;
188 1 ResetFlag=0;
189 1 TempFlag=1;
190 1 PIDFlag = 0;
191 1 TFlag = TRUE;
192 1 DispTtime = 0;
193 1 DispTFlag = TRUE;
194 1 AlarmFlag = 0; /*+++++AlarmFlag = 0 不报警 **/
195 1 AlarmTime = 0;
196 1 AutoFlag = 1; /***自动控制**/
197 1
198 1 init_system(); /*系统初始化*/
199 1
200 1
201 1 RFlag=0xC5; /**用于区分复位标志**/
202 1 do{
203 2 if (ResetFlag == 1){
204 3 init_system();
205 3 ResetFlag=0;
206 3 }
207 2
208 2 if((TFlag == TRUE) && (DispTFlag == TRUE)){
209 3 DispT();
210 3 DispTFlag = FALSE;
211 3 }
212 2
213 2 if (TempFlag == 1){ /*采样*/
214 3 data_sample(); /* 读取来自7703数据 */
215 3 cp_temp(); /*AD7703采样数据处理*/
216 3
217 3 TempFlag=0;
218 3
219 3 Yk=CalcTemp(); /*计算当前温度*/
220 3 Angle=CalcAngle(); /*有反馈,计算当前阀位角度*/
221 3 }
222 2
223 2 if(OnNewData == TRUE) { /*接受到了新帧*/
224 3 Update_PID_Para(); /*更新PID参数,为测试用总更新*/
225 3 }
226 2
227 2 if((PIDFlag == 1)&&(AutoFlag == 1)){/*PID计算 每4秒钟执行一次PID控制*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -