📄 超声波测距离程序.lst
字号:
C51 COMPILER V6.12 超__瞋瞋_郷氤_序 03/15/2010 12:44:04 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE 超__瞋瞋_郷氤_序
OBJECT MODULE PLACED IN .\超声波测距离程序.OBJ
COMPILER INVOKED BY: D:\20090829 XP new file\Keil\C51\BIN\C51.EXE .\超声波测距离程序.c DEBUG OBJECTEXTEND
stmt level source
1 #include <AT89x51.H> //器件配置文件
2 #include <intrins.h>
3 #define RX P3_6
4 #define TX P3_7
5 #define LCM_RW P2_6 //定义LCD引脚
6 #define LCM_RS P2_5
7 #define LCM_E P2_7
8 #define LCM_Data P0
9 #define Key_Data P3_1 //定义Keyboard引脚
10 #define Key_CLK P3_2
11 #define Busy 0x80 //用于检测LCM状态字中的Busy标识
12
13 void LCMInit(void);//LCD初始化函数
14 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);//LCD显示一个字符函数
15 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);//LCD显示一个字符串函数
16 void Delay5Ms(void);//延时5毫秒函数
17 void Delay400Ms(void);//延时400毫秒函数
18 void Decode(unsigned char ScanCode);
19 void WriteDataLCM(unsigned char WDLCM);//LCD1602写数据函数
20 void WriteCommandLCM(unsigned char WCLCM,BuysC);//LCD写命令函数
21
22 //unsigned char ReadDataLCM(void);
23 unsigned char ReadStatusLCM(void);
24 unsigned char code Range[] ="==Range Finder==";//LCD1602显示格式
25 unsigned char code ASCII[13] = "0123456789.-M";
26 unsigned char code table[]="Distance:000.0cm";
27 unsigned char code table1[]="!!! Out of range";
28
29 //static unsigned char DisNum = 0; //显示用指针
30 unsigned int time=0;
31 unsigned long S=0;
32 bit flag =0;
33 unsigned char disbuff[4]={ 0,0,0,0,};
34
35 //写数据
36 void WriteDataLCM(unsigned char WDLCM)
37 {
38 1 ReadStatusLCM(); //检测忙
39 1 LCM_Data = WDLCM;
40 1 LCM_RS = 1;
41 1 LCM_RW = 0;
42 1 LCM_E = 0; //若晶振速度太高可以在这后加小的延时
43 1 LCM_E = 0; //延时
44 1 LCM_E = 1;
45 1 }
46
47 //写指令
48 void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
49 {
50 1 if (BuysC) ReadStatusLCM(); //根据需要检测忙
51 1 LCM_Data = WCLCM;
52 1 LCM_RS = 0;
53 1 LCM_RW = 0;
54 1 LCM_E = 0;
55 1 LCM_E = 0;
C51 COMPILER V6.12 超__瞋瞋_郷氤_序 03/15/2010 12:44:04 PAGE 2
56 1 LCM_E = 1;
57 1 }
58
59 //读数据
60 /*unsigned char ReadDataLCM(void)
61 {
62 LCM_RS = 1;
63 LCM_RW = 1;
64 LCM_E = 0;
65 LCM_E = 0;
66 LCM_E = 1;
67 return(LCM_Data);
68 }*/
69
70 //读状态
71 unsigned char ReadStatusLCM(void)
72 {
73 1 LCM_Data = 0xFF;
74 1 LCM_RS = 0;
75 1 LCM_RW = 1;
76 1 LCM_E = 0;
77 1 LCM_E = 0;
78 1 LCM_E = 1;
79 1 while (LCM_Data & Busy); //检测忙信号
80 1 return(LCM_Data);
81 1 }
82
83 void LCMInit(void) //LCM初始化
84 {
85 1 LCM_Data = 0;
86 1 WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
87 1 Delay5Ms();
88 1 WriteCommandLCM(0x38,0);
89 1 Delay5Ms();
90 1 WriteCommandLCM(0x38,0);
91 1 Delay5Ms();
92 1
93 1 WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
94 1 WriteCommandLCM(0x08,1); //关闭显示
95 1 WriteCommandLCM(0x01,1); //显示清屏
96 1 WriteCommandLCM(0x06,1); // 显示光标移动设置
97 1 WriteCommandLCM(0x0c,1); // 显示开及光标设置
98 1 }
99
100 //按指定位置显示一个字符
101 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
102 {
103 1 Y &= 0x1;
104 1 X &= 0xF; //限制X不能大于15,Y不能大于1
105 1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
106 1 X |= 0x80; //算出指令码
107 1 WriteCommandLCM(X, 1); //发命令字
108 1 WriteDataLCM(DData); //发数据
109 1 }
110
111 //按指定位置显示一串字符
112 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
113 {
114 1 unsigned char ListLength;
115 1
116 1 ListLength = 0;
117 1 Y &= 0x1;
C51 COMPILER V6.12 超__瞋瞋_郷氤_序 03/15/2010 12:44:04 PAGE 3
118 1 X &= 0xF; //限制X不能大于15,Y不能大于1
119 1 while (DData[ListLength]>0x19) //若到达字串尾则退出
120 1 {
121 2 if (X <= 0xF) //X坐标应小于0xF
122 2 {
123 3 DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
124 3 ListLength++;
125 3 X++;
126 3 }
127 2 }
128 1 }
129
130 //5ms延时
131 void Delay5Ms(void)
132 {
133 1 unsigned int TempCyc = 5552;
134 1 while(TempCyc--);
135 1 }
136
137 //400ms延时
138 void Delay400Ms(void)
139 {
140 1 unsigned char TempCycA = 5;
141 1 unsigned int TempCycB;
142 1 while(TempCycA--)
143 1 {
144 2 TempCycB=7269;
145 2 while(TempCycB--);
146 2 };
147 1 }
148 /********************************************************/
149 void Conut(void)
150 {
151 1 time=TH0*256+TL0;
152 1 TH0=0;
153 1 TL0=0;
154 1
155 1 S=(time*1.7)/10; //算出来是MM
156 1 if((S>=7000)||flag==1) //超出测量范围
157 1 {
158 2 flag=0;
159 2 DisplayListChar(0, 1, table1);
160 2 }
161 1 else
162 1 {
163 2 disbuff[0]=S%10;
164 2 disbuff[1]=S/10%10;
165 2 disbuff[2]=S/100%10;
166 2 disbuff[3]=S/1000;
167 2 DisplayListChar(0, 1, table);
168 2 DisplayOneChar(9, 1, ASCII[disbuff[3]]);
169 2 DisplayOneChar(10, 1, ASCII[disbuff[2]]);
170 2 DisplayOneChar(11, 1, ASCII[disbuff[1]]);
171 2 DisplayOneChar(12, 1, ASCII[10]);
172 2 DisplayOneChar(13, 1, ASCII[disbuff[0]]);
173 2 }
174 1 }
175 /********************************************************/
176 void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
177 {
178 1 flag=1; //中断溢出标志
179 1 RX=0;
C51 COMPILER V6.12 超__瞋瞋_郷氤_序 03/15/2010 12:44:04 PAGE 4
180 1 }
181 /********************************************************/
182 void StartModule() //启动模块
183 {
184 1 TX=1; //启动一次模块
185 1 _nop_();
186 1 _nop_();
187 1 _nop_();
188 1 _nop_();
189 1 _nop_();
190 1 _nop_();
191 1 _nop_();
192 1 _nop_();
193 1 _nop_();
194 1 _nop_();
195 1 _nop_();
196 1 _nop_();
197 1 _nop_();
198 1 _nop_();
199 1 _nop_();
200 1 _nop_();
201 1 _nop_();
202 1 _nop_();
203 1 _nop_();
204 1 _nop_();
205 1 _nop_();
206 1 TX=0;
207 1 }
208 /********************************************************/
209 /*void delayms(unsigned int ms)
210 {
211 unsigned char i=100,j;
212 for(;ms;ms--)
213 {
214 while(--i)
215 {
216 j=10;
217 while(--j);
218 }
219 }
220 }*/
221 void Timer_Count(void)
222 {
223 1 TR0=1; //开启计数
224 1 while(RX); //当RX为1计数并等待
225 1 TR0=0; //关闭计数
226 1 Conut(); //计算
227 1
228 1 }
229 /*********************************************************/
230 void main(void)
231 {
232 1 unsigned int valA;
233 1 Delay400Ms(); //启动等待,等LCM讲入工作状态
234 1 LCMInit(); //LCM初始化
235 1 Delay5Ms(); //延时片刻
236 1 DisplayListChar(0, 0, Range);
237 1 DisplayListChar(0, 1, table);
238 1 //ReadDataLCM();//测试用句无意义
239 1 TMOD=0x01;//设T0为方式1,GATE=1;
240 1 EA=1;
241 1 TH0=0;
C51 COMPILER V6.12 超__瞋瞋_郷氤_序 03/15/2010 12:44:04 PAGE 5
242 1 TL0=0;
243 1 ET0=1; //允许T0中断
244 1 //开启总中断
245 1 while(1)
246 1 {
247 2 RX=1;
248 2 StartModule();
249 2 for(valA=7510;valA>0;valA--)
250 2 {
251 3
252 3 if(RX==1)
253 3 {
254 4 Timer_Count();
255 4 }
256 3 }
257 2 }
258 1 }
259
260
261
262
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 648 ----
CONSTANT SIZE = 64 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 10 10
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 + -