📄 ds18b20.lst
字号:
C51 COMPILER V8.16 DS18B20 12/25/2008 19:46:19 PAGE 1
C51 COMPILER V8.16, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN .\bin\ds18b20.obj
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE src\ds18b20.c ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND PRINT(.\
-bin\ds18b20.lst) OBJECT(.\bin\ds18b20.obj)
line level source
1 #include<reg52.h>
2 #include<rtx51tny.h>
3 #include"inc/define.h"
4 #include"inc/utility.h"
5 #include"inc/ds18b20.h"
6
7 sbit DS18B20_DQ= P1^4; //单总线引脚
8
9 extern vu8 idata week_tempert[8];
10
11
12
13 /*********************************************************
14 *将获取的当前温度设置为待显示数据
15 *函数名称:setTempertShowData()
16 *说明:这是一个RTX51任务,os_create_task(3)之后开始运行
17 *********************************************************/
18 void setTempertShowData(void ) _task_ 8
19 {
20 1 t_tempert tempert;
21 1 while(1)
22 1 {
23 2 getTempert(&tempert);
24 2
25 2 if(tempert.flag>0)
26 2 week_tempert[3]=12;
27 2 else
28 2 week_tempert[3]=11;
29 2 week_tempert[4]=(tempert.tempert>>4) & 0x0F;
30 2 week_tempert[5]=tempert.tempert & 0x0F;
31 2
32 2 os_wait(K_TMO,20,0);
33 2 }
34 1 }
35
36
37 /**********************************************************
38 *DS1820复位及存在检测(通过存在脉冲判断有无正常工作的DS1820)
39 *函数名称:DS1820_reset()
40 *说明:函数返回一个位标量(0或1)flag=0存在,反之flag=1不存在
41 **********************************************************/
42 bit DS18B20_reset()
43 {
44 1 bit flag;
45 1 DS18B20_DQ = 0; //拉低总线
46 1 delay20US(30); //延时至少480us,产生复位脉冲
47 1 DS18B20_DQ = 1; //释放总线
48 1 delay20US(4); //延时60--240微秒后对总线采样
49 1 flag=DS18B20_DQ;
50 1 delay20US(15); //延时至少240微秒等待总线恢复
51 1
52 1 return flag;
53 1 }
54
C51 COMPILER V8.16 DS18B20 12/25/2008 19:46:19 PAGE 2
55
56 /**********************************************************
57 *写数据到DS1820
58 *函数名称:DS1820_inputByte()
59 *说明:
60 **********************************************************/
61 void DS18B20_inputByte(u8 ibyte)
62 {
63 1 u8 i,delay;
64 1 for (i=8;i>0;i--)
65 1 {
66 2 DS18B20_DQ = 0; //拉低总线,产生写信号
67 2 for(delay=2;delay>0;delay--) ; //延时4us
68 2 DS18B20_DQ = ibyte&0x01; //发送1位
69 2 delay20US(4); //写时序至少要60us--120us
70 2 DS18B20_DQ = 1; //释放总线,等待总线恢复
71 2 ibyte>>=1; //准备下一位数据的传送
72 2 }
73 1 }
74
75
76 /**********************************************************
77 *从DS1820中读出数据
78 *函数名称:DS1820_outputByte()
79 *说明:
80 **********************************************************/
81 u8 DS18B20_outputByte()
82 {
83 1 u8 i,delay,obyte;
84 1 for (i=8;i>0;i--)
85 1 {
86 2 obyte>>=1;
87 2 DS18B20_DQ = 0; //拉低总线,产生读信号
88 2 for(delay=2;delay>0;delay--); //延时4us
89 2 DS18B20_DQ = 1; //释放总线,准备读数据
90 2 for (delay=4;delay>0;delay--); //延时8微秒读数据
91 2 if (DS18B20_DQ == 1)
92 2 obyte |= 0x80;
93 2 delay20US(4); //延时80us
94 2 DS18B20_DQ = 1; //拉高总线,准备下一位数据的读取.
95 2 }
96 1 return obyte;//返回读到的数据
97 1 }
98
99
100 /**********************************************************
101 *获取当前温度
102 *函数名称:getTempert()
103 *说明:
104 **********************************************************/
105 void getTempert(t_tempert * t)
106 {
107 1 u8 i;
108 1 u8 tempert[2];
109 1
110 1 DS18B20_reset(); //复位
111 1 DS18B20_inputByte(0xcc); //跳过ROM命令
112 1 DS18B20_inputByte(0x44); //温度转换命令
113 1 os_wait(K_TMO,100,0); //完成温度转换至少需要750ms
114 1 DS18B20_reset(); //复位
115 1 DS18B20_inputByte(0xcc); //跳过ROM命令
116 1 DS18B20_inputByte(0xbe); //读DS1820温度暂存器命令
C51 COMPILER V8.16 DS18B20 12/25/2008 19:46:19 PAGE 3
117 1 for (i=0;i<2;i++)
118 1 tempert[i]=DS18B20_outputByte();
119 1 DS18B20_reset(); //复位,结束读数据
120 1
121 1 if(tempert[1] & 0xF8==0)
122 1 (*t).flag=1;
123 1 else
124 1 (*t).flag=-1;
125 1 (*t).tempert=((tempert[1] & 0x07)<<4) + ((tempert[0] & 0xF0)>>4);
126 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 269 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 12
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 + -