📄 111.lst
字号:
C51 COMPILER V8.02 111 03/12/2009 20:05:27 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 111
OBJECT MODULE PLACED IN 111.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 111.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2 #include<AT89X51.H>
3 #include <INTRINS.H>
4
5
6 sbit cs=P1^0;
7 sbit sid=P1^1;
8 sbit sclk=P1^2;
9 sbit fang=P1^3; // squart wave
10 sbit ensp=P2^5;
11 sbit dr=P2^4; //dangerous distance led
12 sbit hy=P2^3; //hold distance led
13 sbit sg=P2^2; //safe distance led
14 sbit dpl=P2^1; //drop power led
15 sbit re=P2^7; //receive led
16 sbit vc=P3^0; //voltage compare
17 sbit dq=P1^4; //18B20 data bit
18 sbit hold=P2^6; //hold
19 sbit play=P2^7; //play
20
21 //****************************************************************
22
23 bit ff;
24 bit flag;
25 bit comflag;
26 unsigned char pf=3; //显示警告标志
27
28 unsigned char soubuf[6];
29 unsigned char disbufs[7]; //distance memory
30 unsigned char disbuft[8]; //temperature memory
31 unsigned char timeh,timel; //time memory
32 unsigned char temp[2]; //temp[1]温度的高位与temp[0]低位
33
34 unsigned char code word[9]={"当前距离:"};
35 unsigned char code wordt[5]={"温度:"};
36 unsigned char code wordd[8]={"危险距离"};
37 unsigned char code wordh[8]={"保持距离"};
38 unsigned char code words[8]={"安全距离"};
39 unsigned char code wordpower[12]={"电源电压正常"};
40 unsigned char code worddrop[12]={"请您更换电池"};
41 unsigned char code check[13]={"系统正在自检!"};
42 unsigned char code sound[10]={74,10,16,22,30,37,43,51,58,67}; //声音地址 点:92;米: 83
43 //***************************************************************
44 void lcdbusy(void);
45 void sendbyte(unsigned char ds);
46 void wrlcd(unsigned char sta,ks);
47 void ex0(void);
48 //void t00(void);
49 void computers(unsigned int v);
50 void display(void);
51 void send0(void);
52 void send1(void);
53 void intlcd(void);
54 unsigned int computerv(void);
55
C51 COMPILER V8.02 111 03/12/2009 20:05:27 PAGE 2
56 void de750ms(void);
57 void init18b20(void);
58 void wr18b20(unsigned char ks);
59 unsigned read18b20(void);
60 void gettemper(void);
61 void computert(void);
62 void checkself(void);
63 void speak(void);
64 //******************************************************
65 void init18b20(void) // 初始化18B20
66 { unsigned char i;
67 1 dq=1;
68 1 _nop_();
69 1 dq=0;
70 1 for(i=255;i>0;i--);
71 1 dq=1;
72 1 for(i=30;i>0;i--);
73 1 for(i=120;i>0;i--)
74 1 if(dq==0) {flag=1;break;}//led=0;
75 1 for(i=100;i>0;i--);
76 1 dq=1;
77 1 }
78 //*************************************************************
79 void wr18b20(unsigned char ks)
80 {unsigned char i,j;
81 1 for(i=8;i>0;i--)
82 1 {
83 2 dq=0;
84 2 for(j=6;j>0;j--) ;
85 2 _nop_();
86 2 dq=(bit)(ks&0x01);
87 2 for(j=24;j>0;j--);
88 2 dq=1;
89 2 ks=ks>>1;
90 2 }
91 1 }
92 //*************************************************************
93 unsigned read18b20(void) //先读出的是低位后读出的是高位,读一个字节子程序
94 {unsigned char i,j,tdata;
95 1 tdata=0;
96 1 for(j=8;j>0;j--)
97 1 {tdata=tdata>>1;
98 2 dq=0;
99 2 for(i=6;i>0;i--);
100 2 _nop_();
101 2 dq=1;
102 2 for(i=6;i>0;i--);
103 2 if(dq==1) tdata=tdata|0x80;
104 2 for(i=28;i>0;i--);
105 2 dq=1;
106 2 }
107 1 return(tdata);
108 1 }
109 //*******************************************************************
110 void gettemper(void)
111 {
112 1 init18b20();
113 1 if(flag==1)
114 1 { //跳过ROM匹配
115 2 wr18b20(0xcc);
116 2 //发出温度转换命令
117 2 wr18b20(0x44);
C51 COMPILER V8.02 111 03/12/2009 20:05:27 PAGE 3
118 2 flag=0;
119 2
120 2 }
121 1 de750ms();
122 1
123 1 init18b20();
124 1 if(flag==1) {
125 2 wr18b20(0xcc); //读温度命令
126 2 wr18b20(0xbe);
127 2 temp[0]=read18b20();
128 2 temp[1]=read18b20();
129 2 flag=0;
130 2
131 2 }
132 1
133 1 else flag=0;
134 1 }
135
136 //*****************************************************************/
137 void computert(void) //温度处理子程序,temp[1]温度的高位与temp[0]低位
138 { unsigned char aa,i;
139 1 unsigned int cc;
140 1 aa=temp[1]&0xf8;
141 1 if(aa==0xf8) {disbuft[5]=0x2d; //处理负温度
142 2
143 2 temp[0]=~temp[0];
144 2 temp[1]=~temp[1];
145 2 if(temp[0]==0xff) temp[1]=temp[1]+1;
146 2 temp[0]=temp[0]+1;
147 2 aa=(temp[1]&0x07)<<4;
148 2 aa=aa|((temp[0]&0xf0)>>4);
149 2 disbuft[4]=aa/10;
150 2 disbuft[3]=(aa%10);
151 2 aa=temp[0]&0x0f;
152 2 cc=(int)(aa*625);
153 2 disbuft[3]=cc/10000+disbuft[3];
154 2 if (disbuft[3]==10) {disbuft[3]=disbuft[3]&0xff;disbuft[4]=disbuft[4]+1;}
155 2 cc=cc%10000;
156 2 disbuft[2]=cc/1000;
157 2 cc=cc%1000;
158 2 disbuft[1]=cc/100;
159 2 cc=cc%100;
160 2 disbuft[0]=cc/10;
161 2 }
162 1 else {aa=((temp[1]&0x07)<<4); //处理正温度
163 2
164 2 aa=aa|((temp[0]&0xf0)>>4);
165 2 disbuft[0]=aa/10;
166 2 disbuft[1]=aa%10;
167 2 aa=temp[0]&0x0f;
168 2 cc=(int)(aa*625);
169 2 disbuft[1]=cc/10000+disbuft[1];
170 2 if (disbuft[1]==10) {disbuft[1]=0;disbuft[0]=disbuft[0]+1;}
171 2 cc=cc%10000;
172 2 disbuft[3]=cc/1000;
173 2 cc=cc%1000;
174 2 disbuft[4]=cc/100;
175 2 cc=cc%100;
176 2 disbuft[5]=cc/10;
177 2 disbuft[6]=cc%10;
178 2
179 2 for(i=0;i<7;i++)
C51 COMPILER V8.02 111 03/12/2009 20:05:27 PAGE 4
180 2 disbuft[i]=disbuft[i]|0x30;
181 2 disbuft[2]=0x2e;
182 2
183 2 }
184 1 }
185 //*****************************************************************
186 unsigned int computerv(void)
187 {unsigned char a;
188 1 unsigned int v;
189 1 temp[1]=temp[1]&0x07;
190 1 a=temp[1]<<4;
191 1 a=a|(temp[0]>>4);
192 1 a=a*6;
193 1 v=3314+a;
194 1 return(v);
195 1
196 1 }
197
198 //*************************************************************
199 void de750ms(void) //750ms
200 {unsigned char i,j,k;
201 1 for(i=6;i>0;i--)
202 1 for(j=255;j>0;j--)
203 1 for(k=255;k>0;k--);
204 1 }
205 //*************************************************************
206 void lcdbusy(void)
207 {unsigned char i,c;
208 1 while(1)
209 1 {sendbyte(0xfc);
210 2 sclk=1;
211 2 c=sid;
212 2 sclk=0;
213 2 for(i=0;i<15;i++)
214 2 {sclk=1;
215 3 sclk=0;}
216 2 if(c==0) break;
217 2 }
218 1 }
219
220 //**********************************************************
221 void sendbyte(unsigned char ds) //向LCD中发送一个字节
222 {unsigned char i;
223 1 for(i=0;i<8;i++)
224 1 {sclk=1;
225 2 sid=ds&0x80;
226 2 // if((ds&0x80)==0x80) sid=1;
227 2 // else sid=0;
228 2 sclk=0;
229 2 ds=ds<<1;}
230 1 }
231 //*************************************************************
232 void wrlcd(unsigned char sta,ks) //向LCD中写入一个起始字节与一个数据
233 {unsigned char hdata,ldata;
234 1 hdata=ks&0xf0;
235 1 ks=ks&0x0f;
236 1 ks=ks<<4;
237 1 ldata=ks;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -