📄 sushe_lamp.lst
字号:
178 1 }
179 void keyscan() //键盘扫描
C51 COMPILER V7.06 SUSHE_LAMP 01/02/2009 13:18:11 PAGE 4
180 {
181 1 uchar temp;
182 1 temp=P1;
183 1 temp=temp&0x0f;
184 1 while(temp!=0x0f)
185 1 {
186 2 temp=P1;
187 2 temp=temp&0x0f;
188 2 delay(3);
189 2 switch(temp)
190 2 {
191 3 case 0x07: cro_t=!cro_t;
192 3 break;
193 3 case 0x0b: min++;
194 3 if(min==60)
195 3 min=0;
196 3 break;
197 3 case 0x0d: hour++;
198 3 if(hour==24)
199 3 hour=0;
200 3 break;
201 3 case 0x0e: week++;
202 3 if(week==7)
203 3 week=0;
204 3 break;
205 3 }
206 2 while(temp!=0x0f) //按键松开检测
207 2 {
208 3 temp=P1;
209 3 temp=temp&0x0f;
210 3 }
211 2
212 2 }
213 1
214 1 }
215
216 void time_init() //定时器初始化
217 {
218 1
219 1 TMOD=0x01;
220 1 TH0=(65536-50000)/256;
221 1 TL0=(65536-50000)%256;
222 1 EA=1;
223 1 ET0=1;
224 1 TR0=1;
225 1
226 1 }
227 void ADC_init() //ADC转换初始化
228 {
229 1 wr=1;
230 1 wr=0;
231 1 delay(2);
232 1 wr=1;
233 1 rd=0;
234 1 un_guang=P0; //AD转换后的电压值二进制数据赋给变量un_guang
235 1 delay(2);
236 1 rd=1;
237 1 }
238 void DS18B20_init() //温度传感ds18b20初始化
239 {
240 1 flag_init=1; //初始化成功标志位,0为成功
241 1 DQ=1; //DQ复位
C51 COMPILER V7.06 SUSHE_LAMP 01/02/2009 13:18:11 PAGE 5
242 1 _nop_();
243 1 DQ=0; //拉低DQ
244 1 Delay_uS(52); //延时484us(此信号要求480us~960us)
245 1 DQ=1; //释放DQ
246 1 Delay_uS(5); //延时61us (在检测到 I/O 引脚上的上升沿之后DS18B20等待15us~60us并且接着发送存在脉冲60-240us
-的低电平信号)
247 1 flag_init=DQ;
248 1 Delay_uS(25); //延时241us(DS18B20发送存在脉冲的低电平信号60~240us)
249 1 }
250 void displaytemp() //温度显示
251 {
252 1
253 1 uchar te1,te2,te3;
254 1 write_com(0x80+0x4a);
255 1 te3=ascII[tens];
256 1 write_data(te3);
257 1 delay(5);
258 1 te2=ascII[units];
259 1 write_data(te2);
260 1 delay(5);
261 1 write_data(0x2e);
262 1 delay(5);
263 1 te1=ascII[decile];
264 1 write_data(te1);
265 1 delay(5);
266 1 write_data(0xdf);
267 1 delay(5);
268 1 write_data(0x43);
269 1 delay(5);
270 1
271 1 }
272
273
274 uchar Readonechar() //读一个字节
275 {
276 1 unsigned char i,dat=0;
277 1 for(i=8;i;i--)
278 1 {
279 2 DQ=0;
280 2 dat>>=1;
281 2 DQ=1;
282 2 if(DQ)
283 2 dat|=0x80;
284 2 Delay_uS(5);//延时61us(所有读时间片的最短持续期限为60us,各个读时间片之间必须有最短为1us的恢复时间)
285 2 }
286 1 return dat;
287 1 }
288
289 void Writeonechar(unsigned char dat) //写一个字节
290 {
291 1 unsigned char i;
292 1 for(i=8;i;i--)
293 1 {
294 2 DQ=0;
295 2 DQ=dat&0x01;
296 2 Delay_uS(5); //延时61us(在I/O线由高电平变为低电平之后DS1820在15us~60us之间对 I/O 线采样)
297 2 DQ=1;
298 2 dat>>=1;
299 2 }
300 1 }
301
302 void Readtemperature() //读温度
C51 COMPILER V7.06 SUSHE_LAMP 01/02/2009 13:18:11 PAGE 6
303 {
304 1 tens=0;units=0;decile=0;tmp=0;
305 1 tmprt=0;
306 1 DS18B20_init();
307 1 Writeonechar(0xcc);// 跳过读序列号的操作
308 1 Writeonechar(0x44);// 启动温度转换
309 1 DS18B20_init();
310 1 Writeonechar(0xcc);//跳过读序号列号的操作
311 1 Writeonechar(0xbe);//读取温度寄存器
312 1
313 1 units=Readonechar();//读低八位
314 1 tens=Readonechar(); //读高八位
315 1
316 1 tens<<=8;
317 1 tens|=units; //高低位合并
318 1 tmprt=tens*0.0625; //计算温度值
319 1 tmp=tmprt*10+0.5; //放大10倍输出并四舍五入
320 1
321 1
322 1 tens=tmp/100; //十位
323 1 units=tmp/10%10; //个位
324 1 decile=tmp%10; //小数位
325 1 }
326
327 void timer0() interrupt 1
328 {
329 1 TH0=(65536-50000)/256;
330 1 TL0=(65536-50000)%256;
331 1 time++;
332 1
333 1 }
334 void delay(uint z)
335 {
336 1 uint x,y;
337 1 for(x=z;x>0;x--)
338 1 for(y=110;y>0;y--);
339 1 }
340 void Delay_uS(unsigned int tt) //延时时间为(tt*9+16)us.晶振为12MHz
341 {
342 1 while(tt--)
343 1 ;
344 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 983 ----
CONSTANT SIZE = 73 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 19 15
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 + -