📄 main_sub.lst
字号:
C51 COMPILER V7.00 MAIN_SUB 06/14/2005 17:21:11 PAGE 1
C51 COMPILER V7.00, COMPILATION OF MODULE MAIN_SUB
OBJECT MODULE PLACED IN main_sub.OBJ
COMPILER INVOKED BY: C:\PROGRA~1\KEILC5~1\C51\BIN\c51.exe main_sub.c DB OE SMALL ROM(LARGE)
stmt level source
1 //#pragma src
2 ///////////////////////////////////////////////
3 //EEPROM存储区安排:
4 //0000H~01FFH 512byte DS18B20 ID
5 //0200H~027FH 128byte 温度数据
6 //0280H~03FFH 384byte 配置参数<温度报警上下限值,温度转换精度>
7 #include<reg51.h>
8 #include<intrins.h>
9 #include<rount3.h>
10 #include<rount5.h>
11 #include<rount6.h>
12
13 #define collect 67 //C ASCII 码为67
14 #define transmit 84
15 #define init 73
16 #define shedule 83
17 #define dat 68
18 #define ack 65
19
20 sbit led =0x92;
21 sbit rst_rf =0xb3;
22
23 // GLOBAL VARIABLES
24 unsigned char data receive_data[16]; //串行通信变量,设为全局变量确保快速响应
25 unsigned char data command;
26 unsigned char byt_count =0; //串行中断接收字节计数
27
28 bit data collect_tmp_flg =0; //是否开始温度采集标志
29 bit data receive_en =1; //命令是否处理标志
30
31 unsigned int data t1_count0 =900; //定时间隔参数
32 unsigned int data t1_count1 =80;
33 //PC命令修改下列两个参数值,可以改变温度采样时间间隔
34 unsigned int data t1_data0 =900;
35 unsigned int data t1_data1 =80;
36
37 ////////////////////////////
38 //名称:延迟程序
39 //功能:根据参数延迟
40 ////////////////////////////
41 void delay_time(unsigned int us) //29us/40us/52us/64us
42 {
43 1 unsigned int data i;
44 1 for(i=0;i<=us;i++)
45 1 _nop_();
46 1 }
47
48 void delay_time_1s (void) //实际模拟仿真测试 /0.9s
49 {
50 1 unsigned char data i;
51 1 while(i<4)
52 1 {
53 2 delay_time(8000);
54 2 _nop_();
55 2 delay_time(8000);
C51 COMPILER V7.00 MAIN_SUB 06/14/2005 17:21:11 PAGE 2
56 2 i++;
57 2 }
58 1 }
59
60
61 //////////////////////////////
62 //名称:定时器0 ISR
63 //功能:DS18B20定时温度采集,存储
64 //////////////////////////////
65 void timer0(void) interrupt 1 using 3
66 {
67 1 ET0 =0;
68 1 TH0 =0x4C;
69 1 TL0 =0x00;
70 1 if( (--t1_count0)==0 )
71 1 {
72 2 if( (--t1_count1)==0 )
73 2 {
74 3 // collect_ds_tmp(); //此处可以调用温度采集程序<必须为再入函数>
75 3 if(collect_tmp_flg==1) //设置开始温度采集标志
76 3 _nop_();
77 3 else
78 3 collect_tmp_flg =1;
79 3
80 3 t1_count1 =t1_data1;
81 3 }
82 2 t1_count0 =t1_data0;
83 2 }
84 1 TF0 =0;
85 1 ET0 =1;
86 1 EA =1; //(十进制,两位整数,两位小数,
87 1 } //小数在低地址),存入EEPROM
88
89 /////////////////////////////
90 //名称:串口 ISR
91 //功能:接收PC主机命令
92 ////////////////////////////
93 void serial_isr(void) interrupt 4
94 {
95 1 if(TI==1)
96 1 TI =0;
97 1 else if(RI==1&&(receive_en==1))
98 1 {
99 2 RI =0;
100 2 receive_data[byt_count++]=SBUF;
101 2 if(byt_count>16)
102 2 {
103 3 byt_count =0;
104 3 receive_en =0;
105 3 }
106 2 }
107 1 else
108 1 RI =0;
109 1 }
110
111 ///////////////////////////////////////////////////////
112 //名称:测试程序
113 //功能:检测配置DS18B20是否成功
114 /////////////////////////////////////////////////////
115 /*
116 void verify_config(void)
117 {
C51 COMPILER V7.00 MAIN_SUB 06/14/2005 17:21:11 PAGE 3
118 bit data flag;
119 bit data page_ch_flg;
120 unsigned char i,j;
121 unsigned char id_count =0;
122 unsigned char init_adr0,sla_adr;
123 unsigned char config_data[9];
124 unsigned char id_rom[8];
125
126 i =0;
127 j =0;
128 sla_adr =0xA0; //DS18B20 ID在EEPROM中存放首地址
129 init_adr0 =0x00;
130 id_count =0;
131 page_ch_flg =0;
132
133 flag =OWReset();
134 if(!flag)
135 {
136 do
137 {
138 if(page_ch_flg==1)
139 {
140 sla_adr =0xA2;
141 rdnbyt(&id_rom[0],sla_adr,8);
142 goto next;
143 }
144 if(id_count==0xf8)
145 page_ch_flg =1;
146
147 if(j==0)
148 rdadr(&id_rom[0],sla_adr,init_adr0,8);
149 else
150 rdnbyt(&id_rom[0],sla_adr,8);
151
152 next: id_count+=8;
153 OWReset();
154 OWWriteByte(0x55); //发匹配ID命令
155 for(i=0;i<8;i++)
156 {
157 OWWriteByte(id_rom[i]);
158 }
159 OWWriteByte(0xBE); //送出Read ScatchPad命令
160 for(i=0;i<9;i++)
161 {
162 config_data[i] =OWReadByte();
163 }
164
165 j++;
166 }while(!OWReset()&&(j<64) ); // 读取64个DS18B20 ID
167 }
168 _nop_();
169 }
170 */
171
172 ////////////////////////////////////////////////////////////
173 //名称:确认信号帧回复
174 //功能:接收到正确的PC命令帧,回复确认信号帧
175 ///////////////////////////////////////////////////////////
176 unsigned char code index_rom[2] ={0x01,0x01}; //仓库号,列号
177
178 void send_ack(void)
179 {
C51 COMPILER V7.00 MAIN_SUB 06/14/2005 17:21:11 PAGE 4
180 1 ES =0;
181 1 send_syn_pc();
182 1 send_byte_pc(65); //发送标识符A<ASCII>
183 1 send_pbyt_pc(&index_rom[0]);
184 1 send_end_pc();
185 1 ES =1;
186 1 }
187
188 ////////////////////////////////////////////
189 //名称:串口查询方式接收程序
190 //功能:中断后,关中断使能,以查询方式接收PC命令字节,
191 // 并对命令进行解析,返回命令值
192 /////////////////////////////////////////////
193 unsigned char pc_cmd_data[4];
194 #define identity 1
195 #define columne 1
196
197 unsigned char receive_cmd(us)
198 unsigned char *us;
199 {
200 1 unsigned char i,k;
201 1 unsigned char data_tmp[8];
202 1 unsigned char crc_result;
203 1 bit crc_flg;
204 1 crc_result =0;
205 1 //data_tmp[0] =*(us+1);
206 1 //unsigned char data_chk[15]={0xff,0x55,0x55,0xFF,0xAA,0x01,0x01,84}; //为观察指针变量引入测试变量
207 1 //unsigned char data *us=&data_chk[0];
208 1
209 1 for(i=0;i<16;)
210 1 {
211 2 // data_tmp[0] =*us; //set for test varibles
212 2 // data_tmp[1] =*(us+1);
213 2 if( (*(us+i)==0xFF)&&( *(us+i+1)==0xAA )&&(*(us+i+2)==0x44) ) //识别帧同步字节
214 2 {
215 3 for(k=0;k<8;k++)
216 3 {
217 4 data_tmp[k] =*(us+i+3+k); // 此处采用for语句得不到正确值?
218 4 if(k==0) //初始化CRC码
219 4 crc_flg =1;
220 4 else
221 4 crc_flg =0;
222 4
223 4 crc_result =OWCrc_c(data_tmp[k],crc_flg);
224 4 }
225 3 if(crc_result) //CRC校验正确,往下判断是否呼叫本仓库
226 3 goto error;
227 3 else
228 3 goto next;
229 3 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -