📄 ds18b20-shuma-c51.lst
字号:
C51 COMPILER V8.02 DS18B20_SHUMA_C51 08/21/2006 15:47:52 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE DS18B20_SHUMA_C51
OBJECT MODULE PLACED IN DS18B20-SHUMA-C51.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DS18B20-SHUMA-C51.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************/
2 /* */
3 /* ME500单片机开发系统演示程序 - DS18B20温度显示 */
4 /* */
5 /* 8数码管显示两个DS18B20的温度值 */
6 /* */
7 /* 版本: V1.0 (2006/11/20) */
8 /* 作者: gguoqing (Email: gguoqing@willar.com) */
9 /* 网站: www.willar.com(伟纳电子) www.mcusj.com(伟纳单片机世界) */
10 /* 时间: 2006/08/15 */
11 /* */
-
12 /*【版权】Copyright(C)伟纳电子 www.willar.com All Rights Reserved */
13 /*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! */
14 /* */
15 /*******************************************************************/
16
17 #include <reg51.h>
18
19 sbit DQ = P3^3; //定义DS18B20端口DQ
20 sbit BEEP=P3^7 ;
21
22 unsigned char presence,ch;
23
24 unsigned char code LEDData[ ] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
25 0x80,0x90,0xff,0xbf};
26
27 unsigned char data temp_data[2] = {0x00,0x00};
28
29 unsigned char data display[5] = {0x00,0x00,0x00,0x00,0x00};
30
31 unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
32 /*小数位的值*/ 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
33
34 unsigned char code RomCode[2][8] = {0x28,0xd6,0x31,0x8a,0x00,0x00,0x00,0xe3,
35 0x28,0x0e,0x4e,0xb3,0x00,0x00,0x00,0x5f};
36
37 void beep();
38 sbit DIN = P0^7; //小数点
39 bit flash=0; //显示开关标记
40
41 /*********************************************************/
42 //延时函数
43 /*********************************************************/
44 void Delay(unsigned int num)//延时函数
45 {
46 1 while( --num );
47 1 }
48
49 /*********************************************************/
50 //初始化函数
51 /*********************************************************/
52 Init_DS18B20(void)
53 {
54 1
C51 COMPILER V8.02 DS18B20_SHUMA_C51 08/21/2006 15:47:52 PAGE 2
55 1 DQ = 1; //DQ复位
56 1 Delay(8); //稍做延时
57 1
58 1 DQ = 0; //单片机将DQ拉低
59 1 Delay(90); //精确延时 大于 480us
60 1
61 1 DQ = 1; //拉高总线
62 1 Delay(8);
63 1
64 1 presence = DQ; //如果=0则初始化成功 =1则初始化失败
65 1 Delay(100);
66 1 DQ = 1;
67 1
68 1 return(presence); //返回信号,0=presence,1= no presence
69 1 }
70 /*********************************************************/
71 //读一个字节函数
72 /*********************************************************/
73 ReadOneChar(void)
74 {
75 1 unsigned char i = 0;
76 1 unsigned char dat = 0;
77 1
78 1 for (i = 8; i > 0; i--)
79 1 {
80 2 DQ = 0;
81 2 dat >>= 1;
82 2 DQ = 1;
83 2
84 2 if(DQ)
85 2 dat |= 0x80;
86 2 Delay(4);
87 2 }
88 1
89 1 return (dat);
90 1 }
91
92 /**********************************************************/
93 //写一个字节函数
94 /*********************************************************/
95 WriteOneChar(unsigned char dat)
96 {
97 1 unsigned char i = 0;
98 1 for (i = 8; i > 0; i--)
99 1 {
100 2 DQ = 0;
101 2 DQ = dat&0x01;
102 2 Delay(5);
103 2
104 2 DQ = 1;
105 2 dat>>=1;
106 2 }
107 1 }
108
109 /*********************************************************/
110 //读取温度函数
111 /*********************************************************/
112 Read_Temperature(unsigned char x)
113 {
114 1 unsigned char i;
115 1 Init_DS18B20();
116 1 if(presence==1)
C51 COMPILER V8.02 DS18B20_SHUMA_C51 08/21/2006 15:47:52 PAGE 3
117 1 { beep();flash=1;} //DS18B20不正常,蜂鸣器报警
118 1 else
119 1 {
120 2 flash=0;
121 2 WriteOneChar(0xCC); // 跳过读序号列号的操作
122 2 WriteOneChar(0x44); // 启动温度转换
123 2
124 2 Init_DS18B20();
125 2 // WriteOneChar(0xCC); //跳过读序号列号的操作
126 2
127 2 WriteOneChar(0x55); //匹配ROM命令
128 2 for(i=0;i<8;i++)
129 2 {
130 3 WriteOneChar(RomCode[x][i]);
131 3 }
132 2 WriteOneChar(0xBE); //读取温度寄存器
133 2
134 2 temp_data[0] = ReadOneChar(); //温度低8位
135 2 temp_data[1] = ReadOneChar(); //温度高8位
136 2 }
137 1 }
138
139 /*********************************************************/
140 //温度值显示函数
141 /*********************************************************/
142 Disp_Temperature()
143 {
144 1 unsigned char n=0;
145 1
146 1 display[4]=temp_data[0]&0x0f;
147 1 display[0]=ditab[display[4]]; //查表得小数位的值
148 1
149 1 display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
150 1 display[3]=display[4]/100;
151 1 display[1]=display[4]%100;
152 1 display[2]=display[1]/10;
153 1 display[1]=display[1]%10;
154 1
155 1 if(!display[3]) //高位为0,不显示
156 1 {
157 2 display[3]=0x0a;
158 2 if(!display[2]) //次高位为0,不显示
159 2 display[2]=0x0a;
160 2 }
161 1
162 1 P0 = 0xc6; //显示 C
163 1 P2 = 0x7f;
164 1 Delay(250);
165 1
166 1 P0 = 0x9c; //显示 °
167 1 P2 = 0xbf;
168 1 Delay(250);
169 1
170 1 P0 =LEDData[display[0]] ; //显示小数位
171 1 P2 = 0xdf;
172 1 Delay(250);
173 1
174 1 P0 =LEDData[display[1]]; //显示个位
175 1 DIN = 0;
176 1 P2 = 0xef;
177 1 Delay(250);
178 1
C51 COMPILER V8.02 DS18B20_SHUMA_C51 08/21/2006 15:47:52 PAGE 4
179 1 P0 =LEDData[display[2]]; //显示十位
180 1 P2 = 0xf7;
181 1 Delay(250);
182 1
183 1 P0 =LEDData[display[3]]; //显示百位
184 1 P2 = 0xfb;
185 1 Delay(250);
186 1
187 1 P0 =LEDData[0x0b]; //显示 "-"
188 1 P2 = 0xfd;
189 1 Delay(250);
190 1
191 1 P0 =LEDData[ch+1]; //显示通道号
192 1 P2 = 0xfe;
193 1 Delay(250);
194 1
195 1 P2 = 0xff;
196 1 }
197
198 /*********************************************************/
199 //驱动蜂鸣器函数
200 /*********************************************************/
201 void beep()
202 {
203 1 unsigned char i;
204 1 for (i=0;i<100;i++)
205 1 {
206 2 Delay(60);
207 2 BEEP=!BEEP; //BEEP取反
208 2 }
209 1 BEEP=1; //关闭蜂鸣器
210 1 }
211
212 /*********************************************************/
213 //主函数
214 /*********************************************************/
215 void main(void)
216 {
217 1 unsigned int time;
218 1 while(1)
219 1 {
220 2 ch = 0; //第一个DS18B20
221 2 for(time=0;time<200;time++)
222 2 {
223 3 Read_Temperature(ch); //读温度值
224 3 if(flash==1)
225 3 {P2 = 0xff;} //DS18B20不正常,关闭显示
226 3 else Disp_Temperature(); //显示温度
227 3 }
228 2
229 2 ch = 1; //第二个DS18B20
230 2 for(time=0;time<200;time++)
231 2 {
232 3 Read_Temperature(ch); //读温度值
233 3 if(flash==1)
234 3 {P2 = 0xff ;} //DS18B20不正常,关闭显示
235 3 else Disp_Temperature(); //显示温度
236 3 }
237 2 }
238 1 }
239
240 /*********************************************************/
C51 COMPILER V8.02 DS18B20_SHUMA_C51 08/21/2006 15:47:52 PAGE 5
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 488 ----
CONSTANT SIZE = 44 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 9 4
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 + -