?? 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 + -