📄 chaosheng.lst
字号:
C51 COMPILER V8.02 CHAOSHENG 05/25/2007 11:20:26 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE CHAOSHENG
OBJECT MODULE PLACED IN C:\DOCUME~1\ADMINI~1\桌面\超声波5.13\CHAOSHENG.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE C:\DOCUME~1\ADMINI~1\桌面\超声波5.13\CHAOSHENG.C DB SB OE
line level source
1 #include"reg51.h"
2 #include"intrins.h"
3
4 #define uint unsigned int
5 #define uchar unsigned char
6
7 sbit DS=P1^4;
8 sbit START=P1^5;
9
10 sbit SCK=P1^0;
11 sbit SI=P1^1;
12 sbit SO=P1^2;
13 sbit cs_feed=P1^3;//喂狗信号
14
15 uchar code *init="超声波液位仪";
16 uchar code *work_temp="工作温度 ℃";
17 uchar code *test= "测量距离 mm";
18 uchar code *fail=": 失败mm";
19 uchar code *num_data="0123456789";
20 uchar code *chao_v="超声波速 m/s";
21
22 uchar data temp_data[2];//={0x00,0x00}; //读出温度暂存单元 {0x91,0x01} 25度; 高位存高位 低位存低位
23 uint data plus_data;//存放中断时的计数
24 uint data average=0;
25
26 //RT12864写指令
27 void cmd (uchar intr)
28 {
29 1 P2=0x04;
30 1 P0=intr;
31 1 P2=0x00;
32 1 P2=0x03;// 写指令周期结束
33 1 }
34 //RT12864写数据
35 void dat (uchar *p,uchar data j)
36 {
37 1 uchar data i,k;
38 1 for(i=0;i<j;i++)
39 1 {
40 2 for(k=0;k<10;k++); //延时大约100us
41 2 P2=0x05;
42 2 P0=*(p+i);
43 2 P2=0x01;
44 2 P2=0x02;// 写数据周期结束
45 2 }
46 1 }
47 //
48 void delay(uint t)
49 {
50 1 for(;t>0;t--);//循环一次延时11us
51 1 }
52
53 //18b20复位程序
54
55 void reset()
C51 COMPILER V8.02 CHAOSHENG 05/25/2007 11:20:26 PAGE 2
56 {
57 1 bit bdata flag=1;
58 1 while(flag)
59 1 {
60 2 while(flag)
61 2 {
62 3 DS=1;
63 3 _nop_(); _nop_(); _nop_();
64 3 DS=0;//以上程序段制造一个下降延
65 3 delay(50);//延时550us 最短延时480us
66 3 DS=1;//18b20在上升延后等待15~60us发出存在脉冲,低电平持续60~240us 复位成功
67 3 delay(3);
68 3 flag=DS;
69 3 }
70 2
71 2 delay(50);//延时550us 看电平能不能升高 如果能升高证明是 低电平脉冲
72 2 DS=1;
73 2 flag=~DS;
74 2
75 2 }
76 1
77 1 }
78 //18b20写命令函数
79
80 void write(uchar rule)
81 {
82 1 uchar i,temp;
83 1 for(i=0;i<8;i++)
84 1 {
85 2 temp=rule&0x01;
86 2 DS=1;
87 2 _nop_(); _nop_(); _nop_();
88 2 DS=0;//以上程序段制造一个下降延
89 2 _nop_(); _nop_(); _nop_();
90 2 DS=temp;//从低位起 按位取出 送给18B20
91 2 rule=rule>>1;
92 2 delay(6);//延时66us
93 2 }
94 1 DS=1;
95 1 delay(1);
96 1 }
97
98 //读一温度字节
99 uchar read()
100 {
101 1 uchar data i;
102 1 uchar data temp=0x00;
103 1 uchar data value=0;
104 1 for(i=0;i<8;i++)
105 1 {
106 2 DS=1;
107 2 _nop_(); _nop_(); _nop_();
108 2 DS=0;//以上程序段制造一个下降延
109 2 _nop_(); _nop_(); _nop_();
110 2 DS=1;
111 2 _nop_(); _nop_(); _nop_();
112 2 value>>=1;
113 2 DS=0;
114 2 _nop_(); _nop_(); _nop_(); _nop_();
115 2 DS=1;
116 2 _nop_(); _nop_(); _nop_(); _nop_();
117 2 if(DS) value|=0x80;
C51 COMPILER V8.02 CHAOSHENG 05/25/2007 11:20:26 PAGE 3
118 2 delay(6);
119 2 }
120 1 DS=1;
121 1 return(value);
122 1 }
123 //读出温度函数
124 void read_temp()
125 {
126 1 reset();
127 1 write(0xcc);//发skiprom命令
128 1 write(0x44);//发送转换命令
129 1 reset();
130 1 write(0xcc);//发skiprom命令
131 1 write(0xbe); //读命令
132 1 temp_data[0]=read();
133 1 temp_data[1]=read();
134 1 reset();
135 1
136 1
137 1 }
138
139 //数据处理显示函数
140
141 uchar deal_dis()
142 {
143 1 uchar data k;
144 1 uchar data tmp[2];
145 1 uchar data dis_data[6];
146 1 dis_data[0]=':';
147 1 if(temp_data[1]>127) //判断小于零
148 1 {
149 2 temp_data[1]=~temp_data[1]+1;
150 2 temp_data[0]=~temp_data[0]+1;
151 2 dis_data[1]='-';
152 2 }
153 1 else
154 1 dis_data[1]=0x20; //清空单元
155 1 tmp[0]=temp_data[1]<<4;
156 1 tmp[1]=temp_data[0]>>4;
157 1 tmp[1]=tmp[1]&0x0f;
158 1 tmp[0]=tmp[0]|tmp[1];//整数部分
159 1 tmp[1]=temp_data[0]&0x0f; //小数部分
160 1 dis_data[2]=*(num_data+tmp[0]%100/10);
161 1 dis_data[3]=*(num_data+tmp[0]%10); //dis_data[0--3]内容是"-" 高位到低位
162 1 dis_data[4]='.';
163 1 if(tmp[1]==0x00)
164 1 dis_data[5]='0';
165 1 else if(tmp[1]==0x0f)
166 1 dis_data[5]='9';
167 1 else
168 1 dis_data[5]= *(num_data+tmp[1]/2+1);
169 1 for(k=0;k<10;k++); //延时大约100us
170 1 cmd(0x94); //位置 //
171 1 for(k=0;k<10;k++); //延时大约100us
172 1 dat(dis_data ,6); // 温度
173 1 return(tmp[0]); //返回温度整数部分用来超声波计算超声波速度
174 1
175 1 }
176 //开始发送超声波
177 void send_wave()
178 {
179 1 uchar w;
C51 COMPILER V8.02 CHAOSHENG 05/25/2007 11:20:26 PAGE 4
180 1 START=0;//开始发送超声波
181 1 TR0=1;
182 1 for(w=0;w<15;w++);//延时大约100us
183 1 START=1; //停止发送
184 1 for(w=0;w<5;w++);//延时等待超声波换能器余震 过去
185 1 EX0=1;//外部中断0允许
186 1 }
187
188 // 测试失败
189 void failed()
190 {
191 1 uchar k;
192 1 for(k=0;k<10;k++); //延时大约100us
193 1 cmd(0x9c); //位置
194 1 for(k=0;k<10;k++); //延时大约100us
195 1 dat(fail,8); //距离
196 1 }
197 //计算速度和距离并显示
198 void math(uchar t)
199 {
200 1 uint data s;
201 1 float v;
202 1 uchar data i;
203 1 float data temp1,temp2;
204 1 uchar data distan_data[6];
205 1 uint data div;//记录有多少个100个脉冲 用来解决直接计算的越界问题
206 1 v=331.5+0.6*t;
207 1 s=v; //s是整形量 用来存储v的整数部分
208 1 distan_data[0]=':';
209 1 distan_data[1]=' ';
210 1 distan_data[2]=*(num_data+s/100);
211 1 distan_data[3]=*(num_data+s%100/10);
212 1 distan_data[4]=*(num_data+s%10);
213 1 for(i=0;i<10;i++); //延时大约100us
214 1 cmd(0x8c); //位置
215 1 for(i=0;i<10;i++); //延时大约100us
216 1 dat(distan_data,5); //距离
217 1 // plus_data=50001 ;
218 1 if(plus_data>50000||TF0==1)
219 1 {
220 2 failed();
221 2 for(i=0;i<100;i++); //延时大约100us
222 2 return ;
223 2 }
224 1 plus_data/=2;
225 1 div=plus_data/100;
226 1 plus_data=plus_data%100;
227 1 temp1=100*v/1000;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -