📄 complete.lst
字号:
C51 COMPILER V6.12 COMPLETE 01/19/2007 19:57:22 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE COMPLETE
OBJECT MODULE PLACED IN .\complete.OBJ
COMPILER INVOKED BY: G:\keil\C51\BIN\C51.EXE .\complete.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*
2 * All rights reserved.
3 * 文件名称:complete.c
4 * 作 者:王喜勤
5 * 完成日期:2007年1月19日
6 */
7 #include <reg52.h>
8 #include <stdio.h>
9 #include <intrins.h>
10 #define uchar unsigned char
11 uchar a;
12 uchar bdata select;//选通道值
13 sbit flag0=select^0;
14 sbit flag1=select^1;
15 sbit flag2=select^2;
16
17 unsigned int count1,count2,tmp4,tmp5; //count1,count2为超声波用
18 float count;
19 sbit P0_0=P0^0;
20 sbit P0_1=P0^1;
21 sbit P0_2=P0^2;
22 sbit P0_3=P0^3;
23
24
25 sbit re_de1=P0^4;
26 sbit re_de2=P0^5;
27 sbit re_de3=P0^6;
28 uchar code meter_address_return[2]={0xac,0xca}; //设置RS485接口接收端所使用变量的定义与说明.
29 float idata array1[8]={5.142,6,7,7,8,8,8,8}; //超声波数组
30 float idata array2[5]={6.587,256,6.78,4,5}; //红外数组.
31 float idata array3[2]={5.148,78.09}; //码盘.
32 float idata array4=57.1987; //罗盘.
33 uchar idata transfer[8]={0}; //sprintf函数使用的数组。
34 uchar idata meter_address[2]={0xac,0xca}; //设置RS485接口接收端所使用变量的定义与说明.
35 uchar idata rs485_status=0x00; //RS485接口在数据接收过程中所处的状态.
36 uchar idata rs485_data; //RS485接口所接收的数据.
37 uchar idata m_meteraddrc=0x00; //数据帧地址段计数器.
38 uchar idata m_meterdatlen; //数据帧数据段的长度.
39 uchar idata m_meterdatbuf[8];//数据帧数据段.
40 uchar idata m_meterdatac; //数据帧数据段计数器.
41 uchar idata m_metercheck=0x00; //数据帧累加和检验码.
42 uchar idata m_metersyscheck=0x00; //中断接收程序计算所得到的累加和校验码.
43 uchar idata m_sendaddrcode; //发送方地址
44 uchar idata m_receiveaddrcode;//接收方地址.
45
46
47 uchar d,e;
48 uchar bdata c; //定义C可位寻址的字节
49 uchar z[5]; //定义一个数组用于接收5路红外线的信息
50 sbit z0=c^0; //z0为第0路红外.
51 sbit z1=c^1; //z1为第1路红外.
52 sbit z2=c^2; //z2为第2路红外.
53 sbit z3=c^3; //z3为第3路红外.
54 sbit z4=c^4; //z4为第4路红外.
55 sbit e1=P1^5;
C51 COMPILER V6.12 COMPLETE 01/19/2007 19:57:22 PAGE 2
56 sbit e2=P1^6;
57 sbit e3=P1^7;
58
59
60 uchar dis1,dis2; //分别记录tmp1,tmp2有值
61 int count3,count4; //count3,count4码盘计数用.
62 #define r 0.022
63 uchar tmp1,tmp2;
64 sbit P0_7=P0^7;
65
66
67
68
69
70
71 /*超声波测距,中断处理*/
72 void interrupt0() interrupt 0 //外部中断int0
73 {
74 1 TR0=0; //停止定时器,测距
75 1 tmp4=TL0;tmp5=TH0; //读入TL0和TH0数据
76 1 count1=tmp4+tmp5*256; //读TH0,TL0中的值,
77 1 count=(count1-51712)*12/(11.0592*1000000)*337.57/2;//在常温为10摄氏度为337.57m/s.
78 1 a=1;
79 1 if(count<0.265)
80 1 { count=-1;
81 2 }
82 1
83 1
84 1 }
85
86 void timer0_int() interrupt 1 //定时器T0溢出中断
87 {
88 1 TR0=0;
89 1 count=0; //返回0表明无障碍物
90 1 a=1;
91 1
92 1 }
93
94
95 void interrupt1() interrupt 2 // 外部INT1中断.
96 {
97 1 e=P1;
98 1 e=e^0xff;
99 1 c=e; //把值赋给c
100 1 IE1=0; //清外部1.
101 1 EX1=0; //关闭外部中断1.
102 1 z[0]=z0; //以下把红外线信息放入到z数组中去.
103 1 z[1]=z1;
104 1 z[2]=z2;
105 1 z[3]=z3;
106 1 z[4]=z4;
107 1
108 1 }
109
110 //计算车轮走过的路程。
111 float road(int a,uchar b) //计算车轮走过的路程。
112 {
113 1 float sum=0; //路程。
114 1 sum=a*2*2*3.14*r+2*b*2*3.14*r/8;
115 1 return(sum);
116 1 }
117
C51 COMPILER V6.12 COMPLETE 01/19/2007 19:57:22 PAGE 3
118
119 //数据通信用.
120 void delayms(int ms)//采用11.0592MHZ晶振,若理论上5ms,实际检测为5.2ms
121 // 延时程序。
122 {
123 1 unsigned char i;
124 1 while(ms--)
125 1 {
126 2 for(i = 0; i < 120; i++);
127 2 }
128 1
129 1 }
130
131 void send_frame() //发送一个数据帧
132 {
133 1
134 1 uchar data i;
135 1 re_de1=0; //设置RS485进入发送状态.设置MAX485(3)接收
136 1 re_de2=0; //设置MAX485(2)接收
137 1 re_de3=1; //设置MAX485(1)发送.
138 1
139 1 m_metercheck=0x00; //和校验清零.
140 1 SBUF=0xac; //发送帧起始符.
141 1 while(!TI);
142 1 TI=0;
143 1 m_metercheck+=0xac; //更新累加和的校验信息
144 1 SBUF=0xca;
145 1 while(!TI);
146 1 TI=0;
147 1 m_metercheck+=0xca; //更新累加和的校验信息
148 1 SBUF=m_sendaddrcode; //发送发送方地址信息.
149 1 while(!TI);
150 1 TI=0;
151 1 m_metercheck+=m_sendaddrcode; //更新累加和的校验信息
152 1 SBUF=m_receiveaddrcode; //发送接收方的地址信息.
153 1 while(!TI);
154 1 TI=0;
155 1 m_metercheck+=m_receiveaddrcode; //更新累加和的校验信息
156 1 for(i=0;i<8;i++)
157 1 {
158 2 SBUF=transfer[i];
159 2 while(!TI);
160 2 TI=0;
161 2 m_metercheck+=transfer[i]; //更新累加和的校验信息
162 2 }
163 1 SBUF=m_metercheck; //发送累加和校验码.
164 1 while(!TI);
165 1 TI=0;
166 1 SBUF=0x55; //发送结束符号
167 1 while(!TI);
168 1 TI=0;
169 1 re_de1=1; //设置MAX485进入接收状态,设置MAX485(3)发送.
170 1 re_de2=0;
171 1 re_de3=0; //设置MAX485(1)接收.
172 1 }
173
174
175 void send_frameagain() //请求重发函数.
176 {
177 1 m_sendaddrcode=0x20;
178 1 m_receiveaddrcode=0x10;
179 1 transfer[0]=0xff;
C51 COMPILER V6.12 COMPLETE 01/19/2007 19:57:22 PAGE 4
180 1 transfer[1]=0xff;
181 1 transfer[2]=0xff;
182 1 transfer[3]=0xff;
183 1 transfer[4]=0xff;
184 1 transfer[5]=0xff;
185 1 transfer[6]=0xff;
186 1 transfer[7]=0xff;
187 1 send_frame();
188 1 }
189
190 void send_ultrasonic() //发送超声波信息函数。
191 {
192 1 uchar i;
193 1 m_sendaddrcode=0x30;
194 1 m_receiveaddrcode=0x10;
195 1 for(i=0;i<8;i++)
196 1 {
197 2 sprintf(transfer,"%8.4f",array1[i]); //将一路超声波信息转换为8个ASCII。
198 2 m_sendaddrcode=0x30+i;
199 2 send_frame();
200 2 }
201 1 }
202
203 void send_mapan() //发送码盘信息函数。
204 {
205 1 uchar i;
206 1 m_sendaddrcode=0x40;
207 1 m_receiveaddrcode=0x10;
208 1 for(i=0;i<2;i++)
209 1 {
210 2 sprintf(transfer,"%8.4f",array3[i]); //将一路码盘信息转换为8个ASCII。
211 2 m_sendaddrcode=0x40+i;
212 2 send_frame();
213 2 }
214 1 }
215 void send_compass()
216 {
217 1 m_sendaddrcode=0x50;
218 1 m_receiveaddrcode=0x10;
219 1 sprintf(transfer,"%8.4f",array4); //将罗盘信息转换为8个ASCII。
220 1 send_frame();
221 1 }
222
223
224
225
226 void com_isp()interrupt 4 using 1 //接收RS485的接口从ARM上传来的数据.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -