📄 ds18b20.lst
字号:
C51 COMPILER V8.02 DS18B20 04/15/2009 18:08:19 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN DS18B20.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DS18B20.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<C8051F020.h>
2 #include<intrins.h>
3
4 #define uchar unsigned char
5 #define uint unsigned int
6
7 /*DS18B20功能命令*/
8 #define SEARCH_ROM 0xf0 //搜索ROM
9 #define READ_ROM 0x33 //读DS18B20序列号
10 #define MATCH_ROM 0x55 //匹配ROM
11 #define SKIP_ROM 0xcc //跳过读序列号的操作
12 #define ALARM_SEARCH 0xec //报警搜索
13 #define CONVERT_T 0x44 //启动温度转换
14 #define WRITE_SCRATCHPAD 0x4e //可写暂存器,即高温,低温触发器
15 #define READ_SCRATCHPAD 0xbe //读取温度寄存器
16 #define READ_POWER_SUPPLY 0xb4 //读供电方式,0为寄生方式,1为外部电源
17 #define COPY_SCRATCHPAD 0x48 //拷贝存储器
18
19 sbit DQ =P0^0; //模拟1_Wire总线DQ
20
21 uchar High_limit=30; //代表初始上限30
22 uchar Low_limit =10; //代表初始下限27
23
24 /*--------------------------------------------------------------------------------
25 函数名称:void Wire_delay(uint T_us);
26 函数功能:初始化DS18B20;
27 ---------------------------------------------------------------------------------*/
28 void Wire_delay(uint T_us) //延时T_us,us
29 {
30 1 while(T_us)
31 1 {
32 2 _nop_();_nop_();
33 2 _nop_();_nop_();_nop_();
34 2 _nop_();_nop_();_nop_();
35 2 // _nop_();_nop_();_nop_();
36 2 // _nop_();_nop_();_nop_();
37 2 // _nop_();_nop_();_nop_();
38 2 --T_us;
39 2 }
40 1 }
41
42 /*--------------------------------------------------------------------------------
43 函数名称:void Reset_DS18B20( );
44 函数功能:复位DS18B20; 调试好
45 ---------------------------------------------------------------------------------*/
46 bit Reset_DS18B20( ) //初始化函数
47 {
48 1 uchar Reset_flag=1,i;
49 1 bit Judge=1;
50 1
51 1 DQ=0; //上拉电阻拉高总线
52 1 Wire_delay(600); //等待DS18B20响应
53 1 DQ=1;
54 1 Wire_delay(80);
55 1 for (i=0;i<16;i++) //60us-240us
C51 COMPILER V8.02 DS18B20 04/15/2009 18:08:19 PAGE 2
56 1 {
57 2 Wire_delay(20);
58 2 Reset_flag=DQ; //采样应答信号
59 2 if(Reset_flag==0)
60 2 Judge=0;
61 2 }
62 1 return(Judge); //返回0-有设备连接1-无设备连接
63 1 }
64 /*--------------------------------------------------------------------------------
65 函数名称:uchar Read_byte( );
66 函数功能:通过总线,将18B20内部数据读出,以字节为单位;
67 入口参数:无;
68 出口参数:receive_data;读出的数据;
69 ---------------------------------------------------------------------------------*/
70 bit Read_bit()
71 {
72 1 bit re_bit;
73 1
74 1 DQ=0; // 给脉冲信号
75 1 Wire_delay(1);
76 1 DQ=1;
77 1 Wire_delay(2);
78 1 re_bit=DQ;
79 1 Wire_delay(60); //重要!!!
80 1 return(re_bit);
81 1 }
82
83 uchar Read_byte( ) //读一个字节
84 {
85 1 uchar i,receive_data=0;
86 1
87 1 for(i=0;i<8;i++)
88 1 {
89 2 if(Read_bit()==1)
90 2 receive_data=receive_data|(0x01<<i);
91 2 Wire_delay(2);
92 2 }
93 1
94 1 return(receive_data);
95 1 }
96
97 /*--------------------------------------------------------------------------------
98 函数名称:void Write_byte(uchar write_data);
99 函数功能:通过总线,将数据写入DS18B20内部;
100 入口参数:write_data;写入的数据;
101 出口参数:无;
102 ---------------------------------------------------------------------------------*/
103 void Write_bit(bit Trans_data)
104 {
105 1 DQ=0;
106 1 Wire_delay(2);
107 1 if(Trans_data==1)
108 1 DQ=1;
109 1 Wire_delay(60);
110 1 DQ=1;
111 1 }
112
113 void Write_byte(uchar write_data) //写一个字节
114 {
115 1 uchar i,Bit;
116 1
117 1 for(i=0;i<8;i++)
C51 COMPILER V8.02 DS18B20 04/15/2009 18:08:19 PAGE 3
118 1 {
119 2 Bit=write_data>>i;
120 2 Bit=Bit&0x01; //1_wire低位在前传输
121 2 Write_bit(Bit);
122 2 Wire_delay(2);
123 2 }
124 1 //Wire_delay(120);
125 1 }
126
127 /*--------------------------------------------------------------------------------
128 函数名称:DS18B20_Initial( );
129 函数功能:初始化;
130 入口参数:无;
131 出口参数:无;
132 ---------------------------------------------------------------------------------*/
133 void DS18B20_Initial( ) //18b20寄存器初始化
134 {
135 1 Reset_DS18B20( );
136 1 Write_byte(SKIP_ROM ); //跳过读序列号
137 1 Write_byte(WRITE_SCRATCHPAD); //写字节到暂存器,即高温,低温触发器和配置寄存器
138 1 Write_byte(High_limit); //设置上限温度值
139 1 Write_byte(Low_limit); //设置下限温度值
140 1 Write_byte(0x7f); //设置为12位分辨率
141 1 Reset_DS18B20( );
142 1 Write_byte(SKIP_ROM); //跳过读序列号
143 1 Write_byte(CONVERT_T); //拷贝存储器
144 1 }
145
146 /*--------------------------------------------------------------------------------
147 函数名称:void Start_Convert();
148 函数功能;开始温度转换;
149 入口参数:无;
150 出口参数:无;
151 ---------------------------------------------------------------------------------*/
152 void Start_Convert()
153 {
154 1 Reset_DS18B20( );
155 1 Write_byte(SKIP_ROM); //跳过读序列号
156 1 Write_byte(CONVERT_T); //拷贝存储器
157 1 }
158
159
160 /*--------------------------------------------------------------------------------
161 函数名称:uint Read_temperature( );
162 函数功能:读取温度;
163 入口参数:无;
164 出口参数:温度所对应的二进制数;
165 ---------------------------------------------------------------------------------*/
166 uint Temper;
167 uint Read_temperature() //读取温度
168 {
169 1 bit Busy_Test=0;
170 1 uchar tempL=0; //温度值低8位
171 1 uchar tempH=0; //温度值高8位
172 1 //uint i;//,T[16];
173 1
174 1 Reset_DS18B20();
175 1 Write_byte(SKIP_ROM); //跳过读序号列号的操作
176 1 Write_byte(READ_SCRATCHPAD); //读取温度寄存器(共可读9个寄存器),前两个就是温度值
177 1 /*for(i=0;i<16;i++)
178 1 {
179 1 T[i]=Read_bit();
C51 COMPILER V8.02 DS18B20 04/15/2009 18:08:19 PAGE 4
180 1 Wire_delay(200);
181 1 }*/
182 1 tempL=Read_byte(); //读一个字节
183 1 tempH=Read_byte(); //读一个字节
184 1
185 1 Start_Convert();
186 1 Wire_delay(2);
187 1 Busy_Test=DQ;
188 1 while(!Busy_Test)
189 1 Busy_Test=DQ;
190 1 //for(i=0;i<80;i++)
191 1 // Wire_delay(1000);
192 1
193 1 /*Temper=T[0]*0.0625+T[1]*0.125+T[2]*0.25+T[3]*0.5+T[4]*1+T[5]*2+T[6]*4+T[7]*8+T[8]*16
194 1 T[9]*32+T[10]*64+T[11]*128+T[12]*256;*/
195 1 Temper=tempH;
196 1 Temper<<=8;
197 1 Temper|=tempL;
198 1 return(Temper);
199 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 307 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 1
IDATA SIZE = ---- ----
BIT SIZE = ---- 4
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -