📄 subpro_ds.lst
字号:
C51 COMPILER V7.00 SUBPRO_DS 03/17/2005 19:51:15 PAGE 1
C51 COMPILER V7.00, COMPILATION OF MODULE SUBPRO_DS
OBJECT MODULE PLACED IN SubPro_ds.OBJ
COMPILER INVOKED BY: C:\PROGRA~1\Keil\C51\BIN\c51.exe SubPro_ds.c DB OE SMALL ROM(LARGE)
stmt level source
1 //修改程序中<DS18B20 ID>,<温度超限DS18B20 ID>,<温度数据值在EEPROM中的存放首地址>
2
3 extern unsigned char sla_adr0;
4 extern unsigned char pc_config_data[3];
5 extern unsigned int data t1_data0;
6 extern unsigned int data t1_data1;
7 extern unsigned char data receive_data[5]; //串行通信变量,设为全局变量确保快速响应
8
9 extern void delay_time_1s(void); //Mutiple call to segment ?
10 extern void send_tmp_pc(void);
11 extern void read_all_tmp(void);
12 extern void send_ack_byt(void);
13
14 extern bit data receive_en;
15 #include<transmit_data_h.h>
16 #include<intrins.h>
17
18 #define identity 0x01 //仓库号
19 #define columne 0x01 //列号
20
21 sbit DQ =0x97;
22 unsigned char data pc_cmd_data[4]; //接收到的4byte PC数据字节
23
24 ///////////////////////////////////////////
25 //名称:测温程序
26 //功能:命令64个DS18B20读取温度数据。存入EEPROM中
27 void collect_ds(void)
28 {
29 1 read_all_tmp();
30 1 }
31
32 /////////////////////////////////////////////
33 //名称:定时参数设置程序
34 //功能:修改定时采样时间间隔
35 /////////////////////////////////////////////
36 void change_time(void)
37 {
38 1 unsigned int data time_tmp;
39 1 time_tmp =time_tmp|pc_cmd_data[0];
40 1 time_tmp =(time_tmp<<8)&0xff00;
41 1 t1_data0 =time_tmp|pc_cmd_data[1];
42 1
43 1 time_tmp =time_tmp|pc_cmd_data[2];
44 1 time_tmp =(time_tmp<<8)&0xff00;
45 1 t1_data1 =time_tmp|pc_cmd_data[3];
46 1
47 1 }
48 ///////////////////////////////////////////////////
49 //名称:温度采集
50 //功能:定时命令DS18B20采集温度数据,存入EEPROM中
51 //////////////////////////////////////////////////
52 void collect_ds_tmp(void)
53 {
54 1 if(!OWReset()) //命令DS18B20温度转
55 1 {
C51 COMPILER V7.00 SUBPRO_DS 03/17/2005 19:51:15 PAGE 2
56 2 OWWriteByte(0xCC);
57 2 OWWriteByte(0x44);
58 2 }
59 1 delay_time_1s();
60 1 _nop_();
61 1 delay_time_1s();
62 1 collect_ds(); //读取温度转换数据,存入EEPROM中
63 1 }
64
65 /////////////////////////////////////////
66 //名称:温度采集程序
67 //功能:命令64个DS18B20同时开始温度采集
68 ////////////////////////////////////////
69 void send_ds_cmd(void)
70 {
71 1 //unsigned char i;
72 1 //unsigned char data_rom[9];
73 1
74 1 if(!OWReset())
75 1 {
76 2 OWWriteByte(0xCC);
77 2 OWWriteByte(0x44);
78 2 delay_time_1s();
79 2
80 2 // OWReset();
81 2 // OWWriteByte(0xCC);
82 2 // OWWriteByte(0xBE);
83 2 // for(i=0;i<9;i++)
84 2 // data_rom[i] =OWReadByte();
85 2 _nop_();
86 2
87 2
88 2 }
89 1
90 1 }
91
92
93 ///////////////////////////////////////////////////////////
94 //名称:确认信号解析
95 //功能:对接收到的PC确认信号进行解析,判断本次传送操作是否成功?
96 //////////////////////////////////////////////////////////
97 ////////////////////////////////////////////
98 bit receive_ack(us)
99 unsigned char *us;
100 {
101 1 unsigned char i;
102 1 unsigned char data_tmp[2] ={0x00,0x00};
103 1 //data_tmp[0] =*(us+1);
104 1 //unsigned char data_chk[15]={0xff,0x55,0x55,0xFF,0xAA,0x01,0x01,84}; //为观察指针变量引入测试变量
105 1 //unsigned char data *us=&data_chk[0];
106 1
107 1 for(i=0;i<15;)
108 1 {
109 2 if( (*(us+i)==0x44)&&(*(us+i+1)==0xFF)&&( *(us+i+2)==0xAA ) ) //识别帧同步字节
110 2 {
111 3 data_tmp[0] =*(us+i+3);
112 3 data_tmp[1] =*(us+i+4);
113 3 goto next;
114 3 }
115 2 i++;
116 2 }
117 1
C51 COMPILER V7.00 SUBPRO_DS 03/17/2005 19:51:15 PAGE 3
118 1 next: if( (data_tmp[0]==identity)&(data_tmp[1]==columne) ) //判断是否为对本2051系统
-
119 1 return 1;
120 1 else
121 1 return 0;
122 1 }
123
124
125
126 ////////////////////////////////////////
127 //名称:数据无线传输
128 //功能:2051取RAM单元数据封装成数据帧发送给PC
129 ///////////////////////////////////////
130
131 //传送数据帧
132 void send_data_pc(void)
133 {
134 1 //2051取RAM 数据包发送给PC
135 1 // send_syn_pc();
136 1 repeat_s:send_tmp_pc();
137 1 while(receive_en==1); //等待PC确认信号
138 1 if(!receive_ack(&receive_data[0]) )
139 1 goto repeat_s;
140 1 else
141 1 receive_en =1;
142 1 // send_end_pc();
143 1 }
144
145
146 ////////////////////////////////////////
147 //名称:出错处理
148 //功能:接收到PC非法命令,作显示提示
149 ////////////////////////////////////////
150 void error_set(void)
151 {
152 1 //printf("Command Error!\n");
153 1 _nop_();
154 1 _nop_();
155 1 }
156
157 ////////////////////////////////////////
158 //名称:配置DS18B20
159 //功能:配置DS18B20 采样精度,告警上下限
160 ///////////////////////////////////////
161 void configure_ds(void)
162 {
163 1 bit data flag;
164 1 unsigned char i,j;
165 1 unsigned char id_count =0;
166 1 unsigned char id_rom[8];
167 1 bit page_flg =0;
168 1
169 1 i =0;
170 1 j =0;
171 1 for(i=0;i<3;i++)
172 1 {
173 2 pc_config_data[i] =pc_cmd_data[i];
174 2 }
175 1
176 1 sla_adr0 =0xA0; //24C08硬件地址
177 1 init_adr =0x00; //DS18B20 ID在EEPROM中存放首地址
178 1 flag =OWReset();
C51 COMPILER V7.00 SUBPRO_DS 03/17/2005 19:51:15 PAGE 4
179 1 if(!flag)
180 1 {
181 2 do
182 2 {
183 3 if(page_flg==1)
184 3 { sla_adr0|=pagel;
185 4 page_flg =0;
186 4 rdnbyt(&id_rom[0],sla_adr0,8);
187 4 goto next;
188 4 }
189 3 if(id_count==0xf8)
190 3 page_flg =1;
191 3
192 3 if(j==0)
193 3 rdadr(&id_rom[0],sla_adr0,init_adr,8);
194 3 else
195 3 rdnbyt(&id_rom[0],sla_adr0,8); //读取下一个DS18B20 ID
196 3
197 3 next: OWReset();
198 3 OWWriteByte(0x55); //发匹配ID命令
199 3 for(i=0;i<8;i++)
200 3 {
201 4 OWWriteByte(id_rom[i]);
202 4 }
203 3 OWWriteByte(0x4E); //送出Write ScatchPad命令
204 3 for(i=0;i<3;i++)
205 3 {
206 4 OWWriteByte(pc_config_data[i]);
207 4 }
208 3
209 3 flag =OWReset();
210 3 if(!flag)
211 3 {
212 4 for(i=0;i<8;i++)
213 4 {
214 5 OWWriteByte(id_rom[i]); //发匹配ID命令
215 5 }
216 4 OWWriteByte(0x48); //发COPY ROM命令
217 4 DQ =1;
218 4 delay_time_1s();
219 4 }
220 3
221 3 id_count+=8;
222 3 j++;
223 3 }while(!OWReset()|(j<64) ); //配置64个DS18B20
224 2
225 2 }
226 1 }
227
228
229 ////////////////////////////////////////////////////////////
230 //名称:确认信号帧回复
231 //功能:接收到正确的PC命令帧,回复确认信号帧
232 ///////////////////////////////////////////////////////////
233 void send_ack(void)
234 {
235 1 send_ack_byt();
236 1 }
237
238
239
240 ////////////////////////////////////////////
C51 COMPILER V7.00 SUBPRO_DS 03/17/2005 19:51:15 PAGE 5
241 //名称:串口查询方式接收程序
242 //功能:中断后,关中断使能,以查询方式接收PC命令字节,
243 // 并对命令进行解析,返回命令值
244 /////////////////////////////////////////////
245 unsigned char receive_cmd(us)
246 unsigned char *us;
247 {
248 1 unsigned char i,k;
249 1 unsigned char data_tmp[7];
250 1 unsigned char crc_result;
251 1 //data_tmp[0] =*(us+1);
252 1 //unsigned char data_chk[15]={0xff,0x55,0x55,0xFF,0xAA,0x01,0x01,84}; //为观察指针变量引入测试变量
253 1 //unsigned char data *us=&data_chk[0];
254 1
255 1 for(i=0;i<15;)
256 1 {
257 2 if( (*(us+i)==0x43)&&(*(us+i+1)==0xFF)&&( *(us+i+2)==0xAA ) ) //识别帧同步字节
258 2 {
259 3 for(k=0;k<7;k++)
260 3 {
261 4 data_tmp[k] =*(us+i+3+k); // 此处采用for语句得不到正确值?
262 4 crc_result =OWCrc(data_tmp[k]);
263 4 }
264 3 if(crc_result)
265 3 goto error;
266 3 else
267 3 goto next;
268 3 }
269 2 i++;
270 2 }
271 1
272 1 next: if( (data_tmp[0]==identity)&(data_tmp[1]==columne) ) //判断是否为对本2051系统
-
273 1 {
274 2 for(k=0;k<4;k++)
275 2 pc_cmd_data[k] =data_tmp[k+3]; // 提取命令帧中的数据字节
276 2 send_ack(); //发送确认信号帧
277 2 return (data_tmp[2]); //返回控制指令
278 2 }
279 1 else
280 1 error:return (0x00);
281 1 }
282
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 673 ----
CONSTANT SIZE = 2 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 29
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -