📄 main.lst
字号:
C51 COMPILER V7.06 MAIN 06/15/2007 16:33:06 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: E:\My Electronic\Tools\Design tools\keil7.06\C51\BIN\C51.EXE main.c
stmt level source
1 //#include "STC12C5410AD.h"
2 #include <REG52.H>
3 #define uchar unsigned char
4 #define uint unsigned int
5 #define ulong unsigned long
6
7 /*----------------------
8 分体式超声波发射接收对管
9 型号:TR40
10 频率:40K
11 T是发射
12 R是接收
13 ----------------------*/
14 sbit k1 = P3^4;
15 sbit bg = P3^3;
16 sbit csbout = P3^5; //超声波发送
17 sbit csbint = P3^7; //超声波接收
18 float csbc = 0.034; //声音的传播速度 0.034 cm/us(厘米/微秒)
19
20 uchar csbds,digit,buffer[3],xm1,xm2,xm0,key,jpjs; //显示标识
21
22 uchar convert[10]={ 0x3F, //0
23 0x06, //1
24 0x5b, //2
25 0x4f, //3
26 0x66, //4
27 0x6d, //5
28 0x7d, //6
29 0x07, //7
30 0x7f, //8
31 0x6f //9
32 }; //0~9段码
33
34 uint s,t,i, xx,j,sj1,sj2,sj3,mqs,sx1;
35 bit cl;
36
37 void csbcj();
38 void delay(j); //延时函数,延时的时间由变量J决定
39 void scanLED(); //显示函数
40 void timeToBuffer(); //显示转换函数
41 void keyscan(); //用于识别是设定最近值还是最远值及报警值和各种情况所对应的延时值mqs
42 void k1cl(); //用于设定测距的最近值
43 void k2cl(); //用于设定测距的报警值,如果到了设定的报警值时,bg位置1
44 void k3cl(); //用于设定测距的最远值
45 void k4cl(); //用于设定在发送超声信号后,所要的延时值,在不同地最近值时,其延时值也不会相同
46 void offmsd();
47
48
49 void main() //主函数
50 {
51 1 EA=1; //开中断
52 1 TMOD=0x11; //设定时器0为计数,设定时器1定时
53 1 ET1=1; //定时器1中断允许
54 1 TH0=0x00;
55 1 TL0=0x00;
C51 COMPILER V7.06 MAIN 06/15/2007 16:33:06 PAGE 2
56 1 TH1=0x9E;
57 1 TL1=0x57;
58 1 csbds=0;
59 1 cl=0;
60 1 TR1=1;
61 1 jpjs=0;
62 1 sj1=30;
63 1 sj2=80;
64 1 sj3=200;
65 1 P2=0xff;
66 1 k4cl();
67 1 P0=0xff;
68 1 P3=0xff;
69 1 while(1)
70 1 {
71 2 keyscan();
72 2
73 2 if(jpjs<1) csbcj();
74 2
75 2 timeToBuffer(); //将值转换成LED段码
76 2 offmsd();
77 2 scanLED(); //显示函数
78 2
79 2 if(s<sj2) //距离小于报警值,报警,点亮指示灯
80 2 bg=0;
81 2 else
82 2 bg=1;
83 2 }
84 1 }
85
86 void scanLED() //显示功能模块
87 {
88 1 digit=0x80;
89 1 for( i=0; i<3; i++) //3位数显示
90 1 {
91 2 P2=~digit; //依次显示各位数
92 2 P0=~buffer[i]; //显示数据送P0口
93 2 delay(20); //延时处理
94 2 P2=0xff;
95 2 P0=0xff; //P1口置高电平(关闭)
96 2 digit>>=1; //循环右移1位
97 2 }
98 1 P2=0xff;
99 1 }
100
101 void timeToBuffer() //转换段码功能模块
102 {
103 1 xm0=s/100;
104 1 xm1=(s-100*xm0)/10;
105 1 xm2=s-100*xm0-10*xm1;
106 1 buffer[2]=convert[xm2];
107 1 buffer[1]=convert[xm1];
108 1 buffer[0]=convert[xm0];
109 1 }
110
111 void delay(i)
112 {
113 1 while(--i);
114 1 }
115
116 void timer1int (void) interrupt 3 //定时器延时一段时间,消除未接受的超声波信号的干扰
117 {
C51 COMPILER V7.06 MAIN 06/15/2007 16:33:06 PAGE 3
118 1 TH1=0x9E;
119 1 TL1=0x57;
120 1 csbds++;
121 1 if(csbds>=40)
122 1 {
123 2 csbds=0;
124 2 cl=1; //延时时间结束,置标志信号,可以再次测距
125 2 TR1=0;
126 2 }
127 1 }
128
129 /*---------测距函数---------------
130 先发送5个周期的超声波信号,然后开计数器0,
131 延时一段时间mqs,再识别是否收到超声波信号.
132 如有则关计数器0,然后读计数器内的值,再经运
133 算换算成三位的整数,存放在S中.
134 --------------------------------*/
135 void csbcj() //产生超声波并测距
136 {
137 1 csbint=1;
138 1 if(cl==1) //检测是否可以开始测距
139 1 {
140 2 TR1=0;
141 2 TH0=0x00;
142 2 TL0=0x00;
143 2 i=10;
144 2 TR0=1;
145 2 while(i--)
146 2 {
147 3 csbout=!csbout;
148 3 }
149 2 i=0;
150 2 while(csbint)
151 2 {
152 3 if(++i>=4000) //上限值,最多可循环4000次,以防止定时器T0溢出
153 3 break; //达到上限,强制退出循环
154 3 }
155 2 TR0=0; //停止计时
156 2 TH1=0x9E;
157 2 TL1=0x57;
158 2 csbds=0;
159 2 cl=0; //测试允许标志位清零,关闭测试
160 2 TR1=1; //启动定时器1延时,消除尚未接收的超声波信号
161 2 t=TH0;
162 2 t=t*256+TL0;
163 2 s=t*csbc/2.0; //测距离
164 2 }
165 1 }
166
167 void keyscan() //健盘处理函数
168 {
169 1 xx=0;
170 1 if(k1!=1) // 判断开关是否按下
171 1 {
172 2 delay(400); //延时去抖动
173 2 if(k1!=1) // 判断开关是否按下
174 2 {
175 3 while(!k1)
176 3 {
177 4 delay(30);
178 4 xx++;
179 4 }
C51 COMPILER V7.06 MAIN 06/15/2007 16:33:06 PAGE 4
180 3 if(xx>2000) //若按下一定时间,则为功能设定,将功能选项下移一位
181 3 {
182 4 jpjs++;
183 4 if(jpjs>4) //若已到最后一项选项,则退出设定
184 4 jpjs=0;
185 4 }
186 3 xx=0;
187 3 switch(jpjs)
188 3 {
189 4 case 1: k1cl();break; //用于设定测距的最近值
190 4 case 2: k2cl();break; //用于设定测距的报警值,如果到了设定的报警值时,bg位置1
191 4 case 3: k3cl();break; //用于设定测距的最远值
192 4 case 4: k4cl();break; //用于设定在发送超声信号后,所要的延时值,在不同地最近值时,其延时值也不会
-相同
193 4 }
194 3 }
195 2 }
196 1 }
197
198 /*---设定测距的最近值---*/
199 void k1cl()
200 {
201 1 sj1=sj1+5;
202 1 if(sj1>100)
203 1 sj1=30;
204 1 s=sj1;
205 1 }
206
207 /*---设定测距的报警值,如果到了设定的报警值时,bg位置1---*/
208 void k2cl()
209 {
210 1 sj2=sj2+5;
211 1 if(sj2>500)
212 1 sj2=40;
213 1 s=sj2;
214 1 }
215
216 /*---用于设定测距的最远值---*/
217 void k3cl()
218 {
219 1 sj3=sj3+10;
220 1 if(sj3>500)
221 1 sj3=100;
222 1 s=sj3;
223 1 }
224
225 /*---用于设定在发送超声信号后,所要的延时值,在不同地最近值时,其延时值也不会相同---*/
226 void k4cl()
227 {
228 1 sx1=sj1-1; //最小测试距离-1
229 1 sx1=sx1/csbc; //传送时间
230 1 mqs=sx1/4.5; //延时时间
231 1 }
232
233 void offmsd()
234 {
235 1 if (buffer[0] == 0x3f)
236 1 buffer[0] = 0x00;
237 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
C51 COMPILER V7.06 MAIN 06/15/2007 16:33:06 PAGE 5
CODE SIZE = 689 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 44 ----
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -