📄 ds18b20.lst
字号:
C51 COMPILER V8.02 DS18B20 07/15/2008 12:40:00 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN DS18B20.OBJ
COMPILER INVOKED BY: G:\Keil\C51\BIN\C51.EXE DS18B20.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*********************************************************************/
2 //
3 // DS18B20温度计C程序
4 // 2005.2.28通过调试
5 /*********************************************************************/
6 //使用AT89C2051单片机,12MHZ晶振,用共阳LED数码管
7 //P1口输出段码,P3口扫描
8 #include "reg51.h"
9 #include "intrins.h" //_nop_();延时函数用
10 #define Disdata P1 //段码输出口
11 #define discan P3 //扫描口
12 #define uchar unsigned char
13 #define uint unsigned int
14 sbit DQ=P3^7; //温度输入口
15 sbit DIN=P1^0; //LED小数点控制
16 uint h;
17 //
18 //
19 //*******温度小数部分用查表法**********//
20 uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
21 //
22 uchar code dis_7[12]={0x02,0x9f,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0xFF,0xFD};
23 /* 共阳LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" */
24 uchar code scan_con[4]={0xf7,0xfb,0xfd,0xfe}; // 列扫描控制字
25 uchar data temp_data[2]={0x00,0x00}; // 读出温度暂放
26 uchar data display[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据,一个运算暂存用
27 uchar code dong[9]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0x7f,0xfd,0xfe};
28 //
29 //
30 //
31 /***********11微秒延时函数**********/
32 //
33 void delay(uint t)
34 {
35 1 for(;t>0;t--);
36 1 }
37 /*************************************/
38 void delay1(uint t)
39 {
40 1 uint w,q;
41 1 for(;t>0;t--)
42 1 {
43 2 for(w=20;w>0;w--)
44 2 {
45 3 for(q=45;q>0;q--);
46 3 }
47 2 }
48 1 }
49
50
51 /************************************************/
52 //
53 /***********显示扫描函数**********/
54 scan()
55 {
C51 COMPILER V8.02 DS18B20 07/15/2008 12:40:00 PAGE 2
56 1 char k;
57 1 for(k=0;k<4;k++) //四位LED扫描控制
58 1 {
59 2 Disdata=dis_7[display[k]];
60 2 if(k==0){DIN=1;}
61 2 if(k==1){DIN=0;}
62 2 discan=scan_con[k];delay(90);discan=0xff;
63 2 }
64 1 }
65 //
66 //
67 /***********18B20复位函数**********/
68 ow_reset(void)
69 {
70 1 char presence=1;
71 1 while(presence)
72 1 {
73 2 while(presence)
74 2 {
75 3 DQ=1;_nop_();_nop_();
76 3 DQ=0; //
77 3 delay(50); // 550us
78 3 DQ=1; //
79 3 delay(6); // 66us
80 3 presence=DQ; // presence=0继续下一步
81 3 }
82 2 delay(45); //延时500us
83 2 presence = ~DQ;
84 2 }
85 1 DQ=1;
86 1 }
87 //
88 //
89 /**********18B20写命令函数*********/
90 //向 1-WIRE 总线上写一个字节
91 void write_byte(uchar val)
92 {
93 1 uchar i;
94 1 for (i=8; i>0; i--) //
95 1 {
96 2 DQ=1;_nop_();_nop_();
97 2 DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
98 2 DQ = val&0x01; //最低位移出
99 2 delay(6); //66us
100 2 val=val/2; //右移一位
101 2 }
102 1 DQ = 1;
103 1 delay(1);
104 1 }
105 //
106 /*********18B20读1个字节函数********/
107 //从总线上读取一个字节
108 uchar read_byte(void)
109 {
110 1 uchar i;
111 1 uchar value = 0;
112 1 for (i=8;i>0;i--)
113 1 {
114 2 DQ=1;_nop_();_nop_();
115 2 value>>=1;
116 2 DQ = 0; //
117 2 _nop_();_nop_();_nop_();_nop_(); //4us
C51 COMPILER V8.02 DS18B20 07/15/2008 12:40:00 PAGE 3
118 2 DQ = 1;_nop_();_nop_();_nop_();_nop_(); //4us
119 2 if(DQ)value|=0x80;
120 2 delay(6); //66us
121 2 }
122 1 DQ=1;
123 1 return(value);
124 1 }
125 //
126 /***********读出温度函数**********/
127 //
128 read_temp()
129 {
130 1 ow_reset(); //总线复位
131 1 write_byte(0xCC); // 发Skip ROM命令
132 1 write_byte(0xBE); // 发读命令
133 1 temp_data[0]=read_byte(); //温度低8位
134 1 temp_data[1]=read_byte(); //温度高8位
135 1 ow_reset();
136 1 write_byte(0xCC); // Skip ROM
137 1 write_byte(0x44); // 发转换命令
138 1 }
139 //
140 /***********温度数据处理函数**********/
141 work_temp()
142 {
143 1 uchar n=0; //
144 1 if(temp_data[1]>127)
145 1 {temp_data[1]=(256-temp_data[1]);temp_data[0]=(256-temp_data[0]);n=1;}//负温度求补码
146 1 display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]];
147 1 display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//
148 1 display[3]=display[4]/100;
149 1 display[1]=display[4]%100;
150 1 display[2]=display[1]/10;
151 1 display[1]=display[1]%10;
152 1 if(!display[3]){display[3]=0x0A;if(!display[2]){display[2]=0x0A;}}//最高位为0时都不显示
153 1 if(n){display[3]=0x0B ;}//负温度时最高位显示"-"
154 1 }
155 //
156 //
157 /************检测数码管****************/
158 jiance()
159 {
160 1 uchar i,j;
161 1 for(i=0;i<7;i++)
162 1 {
163 2 discan=scan_con[i];
164 2 for(j=0;j<7;j++)
165 2 {
166 3 Disdata=dong[j];
167 3 delay1(5);
168 3 }
169 2 }
170 1 discan=0xff;
171 1 Disdata=0xff;
172 1 for(i=0;i<2;i++)
173 1 {
174 2 discan=0xf3;
175 2 for(j=0;j<7;j++)
176 2 {
177 3 Disdata=dong[j];
178 3 delay1(8);
179 3 }
C51 COMPILER V8.02 DS18B20 07/15/2008 12:40:00 PAGE 4
180 2 }
181 1 discan=0xff;
182 1 Disdata=0xff;
183 1 for(i=0;i<3;i++)
184 1 {
185 2 discan=0xf1;
186 2 for(j=0;j<7;j++)
187 2 {
188 3 Disdata=dong[j];
189 3 delay1(8);
190 3 }
191 2 }
192 1 discan=0xff;
193 1 Disdata=0xff;
194 1 for(i=0;i<3;i++)
195 1 {
196 2 discan=0xf0;
197 2 for(j=0;j<7;j++)
198 2 {
199 3 Disdata=dong[j];
200 3 delay1(8);
201 3 }
202 2 }
203 1 discan=0xff;
204 1 Disdata=0xff;
205 1 for(i=0;i<10;i++)
206 1 {
207 2 discan=0xf0;
208 2 for(j=7;j<9;j++)
209 2 {
210 3 Disdata=dong[j];
211 3 delay1(15);
212 3 }
213 2 }
214 1 discan=0xff;
215 1 Disdata=0xff;
216 1 for(i=0;i<6;i++)
217 1 {
218 2 discan=0xf0;
219 2 Disdata=0x00;
220 2 delay1(20);
221 2 discan=0xff;
222 2 Disdata=0xff;
223 2 delay1(50);
224 2
225 2 }
226 1 discan=0xff;
227 1 Disdata=0xff;
228 1 }
229 /***********************************************/
230 /**************主函数****************/
231 main()
232 {
233 1
234 1 Disdata=0xff; //初始化端口
235 1 discan=0xff;
236 1 /*for(h=0;h<4;h++){display[h]=8;}//开机显示8888*/
237 1 jiance();
238 1 ow_reset(); // 开机先转换一次
239 1 write_byte(0xCC); // Skip ROM
240 1 write_byte(0x44); // 发转换命令
241 1 for(h=0;h<500;h++)
C51 COMPILER V8.02 DS18B20 07/15/2008 12:40:00 PAGE 5
242 1 {scan();} //开机显示"8888"2秒
243 1 while(1)
244 1 {
245 2 read_temp(); //读出18B20温度数据
246 2 work_temp(); //处理温度数据
247 2 for(h=0;h<500;h++)
248 2 {scan();} //显示温度值2秒
249 2 }
250 1 }
251 //
252 //*********************结束**************************//
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 689 ----
CONSTANT SIZE = 41 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 9 1
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -