📄 t2-18b20.lst
字号:
C51 COMPILER V8.18 T2_18B20 01/06/2010 20:47:34 PAGE 1
C51 COMPILER V8.18, COMPILATION OF MODULE T2_18B20
OBJECT MODULE PLACED IN T2-18B20.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE T2-18B20.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h>
2 #include <intrins.h>
3
4 sbit DQ = P3^3; //定义DS18B20端口DQ
5 sbit BEEP = P3^6; //定义蜂鸣器控制端口
6
7 bit presence; //检测DS18B20标志位
8
9 unsigned char code LEDData[] =
10 {
11 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82,
12 0xF8, 0x80, 0x90, 0xff, 0xc6, 0x9c, 0xbf
13 };
14
15 unsigned char shift,n = 0;
16
17 unsigned char data temp_data[2]; //温度数据存放单元
18 unsigned char data display[7]; //显存单元
19
20
21 /**********************************************************
22
23 us延时子函数 (8*1.085)*num
24
25 **********************************************************/
26 void Delay(unsigned int num) //延时函数
27 {
28 1 while (--num)
29 1 ;
30 1 }
31
32 /**********************************************************
33
34 ms延时子函数
35
36 **********************************************************/
37 void delayms(unsigned int ms)
38 {
39 1 unsigned char k;
40 1 while (ms--)
41 1 {
42 2 for (k = 0; k < 114; k++)
43 2 ;
44 2 }
45 1 }
46
47 /**********************************************************
48
49 蜂鸣器驱动子函数
50
51 **********************************************************/
52 void beep()
53 {
54 1 unsigned char i;
55 1 for (i = 0; i < 180; i++)
C51 COMPILER V8.18 T2_18B20 01/06/2010 20:47:34 PAGE 2
56 1 {
57 2 Delay(80);
58 2 BEEP = !BEEP; //BEEP取反
59 2 }
60 1 BEEP = 1; //关闭蜂鸣器
61 1 delayms(100); //延时100ms
62 1 }
63
64 /**********************************************************
65
66 DS18B20初始化子函数
67
68 presence=0 OK presence=1 ERROR
69
70 **********************************************************/
71 unsigned char Init_DS18B20(void)
72 {
73 1 DQ = 0; //单片机发出低电平复位信号
74 1 Delay(60); //延时>480us
75 1 DQ = 1; //释放数据线
76 1 Delay(8); //延时>64us,等待应答
77 1
78 1 presence = DQ; //接收应答信号
79 1 Delay(50); //延时>400us,等待数据线出现高电平
80 1 DQ = 1; //释放数据线
81 1
82 1 return (presence); //返回presence信号
83 1 }
84
85 /**********************************************************
86
87 读一个字节数据子函数
88
89 **********************************************************/
90 unsigned char ReadOneChar(void)
91 {
92 1 unsigned char i;
93 1 unsigned char dat = 0;
94 1
95 1 EA = 0; //读取温度数据时,要关闭中断。
96 1 DQ = 1;
97 1 for (i = 0; i < 8; i++)
98 1 {
99 2 DQ = 0; //给低脉冲信号
100 2 dat >>= 1;
101 2 DQ = 1; //释放总线
102 2 _nop_();
103 2 _nop_();
104 2 if(DQ) //读总线电平状态
105 2 dat |= 0x80; //最高位置1
106 2 Delay(6); //延时>45us
107 2 DQ = 1; //释放总线,表示此次读操作完成
108 2 }
109 1 EA = 1; //开中断
110 1 return (dat); //返回所读得数据
111 1 }
112
113 /**********************************************************
114
115 写一个字节数据子函数
116
117 **********************************************************/
C51 COMPILER V8.18 T2_18B20 01/06/2010 20:47:34 PAGE 3
118 void WriteOneChar(unsigned char dat)
119 {
120 1 unsigned char i;
121 1
122 1 for (i = 0; i < 8; i++) //一个字节8个bit
123 1 {
124 2 DQ = 0; //给低脉冲信号
125 2 Delay(1); //延时<15us
126 2 DQ = (bit)(dat&0x01); //写1bit数据
127 2 dat >>= 1; //数据右移一位
128 2 Delay(6); //延时>45us
129 2 DQ = 1; //释放总线,表示此次写操作完成
130 2 }
131 1 }
132
133 /**********************************************************
134
135 温度数据转换子函数
136
137 **********************************************************/
138 void Temperature_conver()
139 {
140 1 bit minus = 0;
141 1
142 1 display[0]=0x0b; //显示 C
143 1 display[1]=0x0c; //显示 °
144 1
145 1 if (temp_data[1] > 127) //温度为负值
146 1 {
147 2 temp_data[0] = (~temp_data[0]) + 1; //取反加一,将补码变成原码
148 2 if ((~temp_data[0]) >= 0xff)
149 2 temp_data[1] = (~temp_data[1]) + 1;
150 2 else
151 2 temp_data[1] = ~temp_data[1];
152 2 minus = 1; //温度为负值标志
153 2 }
154 1
155 1 display[6] = temp_data[0] &0x0f; //取小数位数据
156 1 display[2] = (display[6] *10) / 16; //保留一位小数
157 1
158 1 display[6] = ((temp_data[0] &0xf0) >> 4)|((temp_data[1] &0x0f) << 4); //取整数
159 1
160 1 display[5] = display[6] / 100; //百位
161 1 display[4] = (display[6] % 100) / 10; //十位
162 1 display[3] = display[6] % 10; //个位
163 1
164 1 if (!display[5])
165 1 {
166 2 display[5] = 0x0a; //高位为0,不显示
167 2 if (!display[4])
168 2 display[4] = 0x0a; //次高位为0,不显示
169 2 }
170 1
171 1 if (minus)
172 1 {
173 2 display[5] = 0x0d; //显示负号
174 2 }
175 1 }
176
177 /**********************************************************
178
179 主函数
C51 COMPILER V8.18 T2_18B20 01/06/2010 20:47:34 PAGE 4
180
181 **********************************************************/
182 void main(void)
183 {
184 1 P0 = 0xff;
185 1 P2 = 0xff;
186 1
187 1 T2CON = 0x00; //设置T2CON寄存器
188 1 TH2 = 0xfc; //1ms定时常数
189 1 TL2 = 0x66;
190 1 ET2 = 1; //允许Timer2中断
191 1 EA = 1; //总中断允许
192 1 TR2 = 1; //启动定时器2
193 1 shift = 0x7f; //送位码初值
194 1
195 1 while (1)
196 1 {
197 2 Init_DS18B20();
198 2 if (presence == 0)
199 2 {
200 3 WriteOneChar(0xCC); //跳过ROM匹配操作
201 3 WriteOneChar(0x44); //启动温度转换
202 3 delayms(2);
203 3 }
204 2
205 2 Init_DS18B20();
206 2 if (presence == 0)
207 2 {
208 3 WriteOneChar(0xCC); //跳过ROM匹配操作
209 3 WriteOneChar(0xBE); //读取温度寄存器
210 3
211 3 temp_data[0] = ReadOneChar(); //读温度低8位
212 3 temp_data[1] = ReadOneChar(); //读温度高8位
213 3
214 3 Temperature_conver(); //温度数据转换
215 3 delayms(200);
216 3 }
217 2 else
218 2 {
219 3 beep(); //蜂鸣器报警
220 3 }
221 2 }
222 1 }
223
224 /**********************************************************
225
226 Timer2中断服务子函数 (负责数码管显示)
227
228 **********************************************************/
229 void timer2(void) interrupt 5
230 {
231 1 TF2 = 0; //手工清中断标志
232 1 TH2 = 0xfc; //1ms定时常数
233 1 TL2 = 0x66;
234 1
235 1 if (presence) //如果DS18B20不存在
236 1 {
237 2 P2 = 0xff; //关闭显示
238 2 P0 = 0xff;
239 2 return; //退出中断
240 2 }
241 1
C51 COMPILER V8.18 T2_18B20 01/06/2010 20:47:34 PAGE 5
242 1 if(n >= 6)
243 1 {
244 2 n = 0; //中断计数单元清零
245 2 shift = 0x7f; //赋位码初值
246 2 P2 = 0xff; //关闭数码管显示
247 2 }
248 1 else
249 1 {
250 2 if (n == 3)
251 2 P0 = (LEDData[display[n]]) &0x7f; //加小数点显示
252 2 else
253 2 P0 = LEDData[display[n]]; //送段码
254 2
255 2 P2 = shift; //送位码
256 2 shift = shift>>1|0x80; //修改位码
257 2 n++; //计数值加1
258 2 }
259 1 }
260
261 /*********************************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 496 ----
CONSTANT SIZE = 14 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 11 ----
IDATA SIZE = ---- ----
BIT SIZE = 1 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -