📄 dianziqin.lst
字号:
C51 COMPILER V8.02 DIANZIQIN 04/02/2007 20:26:21 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE DIANZIQIN
OBJECT MODULE PLACED IN dianziqin.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE dianziqin.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*****************************************/
2 /* 基于DS18B20数字温度计 */
3 /* */
4 /* 马泽民 */
5 /*****************************************/
6
7
8
9 #include <reg52.h> // 引用标准库的头文件
10 #include <absacc.h>
11 #include <stdio.h>
12 #include <math.h>
13 #include<intrins.h>
14
15
16 #define uchar unsigned char
17 #define uint unsigned int
18
19 sbit DIN = P1^0; // 串行数据输入
20 sbit CLK = P1^1; // 串行时钟
21 sbit LOAD = P1^3; // 显示数据锁存控制
22 sbit DQ = P3^3; // 数据通信线DQ
23 sbit SQW =P3^5; //报警线
24 sbit light=P2^0; //报警灯
25 sbit motor_a=P3^0;
26 sbit motor_b=P3^1;
27
28
29
30 uchar TH0_temp,TL0_temp;
31 uchar tplsb,tpmsb,tplsb_f,tpmsb_f; // 温度值低位、高位字节
32 uchar tm,tl,tm_f,tl_f,mp,tp;
33
34 #define NoOp 0x00 // 空操作寄存器
35 #define Digit0 0x01 // 数码管1寄存器
36 #define Digit1 0x02 // 数码管2寄存器
37 #define Digit2 0x03 // 数码管3寄存器
38 #define Digit3 0x04 // 数码管4寄存器
39
40 #define DecodeMode 0x09 // 译码模式寄存器
41 #define Intensity 0x0a // 亮度寄存器
42 #define ScanLimit 0x0b // 扫描位数寄存器
43 #define ShutDown 0x0c // 低功耗模式寄存器
44 #define DisplayTest 0x0f // 显示测试寄存器
45
46 #define ShutdownMode 0x00 // 低功耗方式
47 #define NormalOperation 0x01 // 正常操作方式
48 #define ScanDigit 0x04 // 扫描位数设置,显示4位数码管
49 #define DecodeDigit 0xff // 译码设置,4位均为BCD码
50 #define IntensityGrade 0x0f // 亮度级别设置
51 #define TestMode 0x01 // 显示测试模式
52 #define TextEnd 0x00 // 显示测试结束,恢复正常工作模式
53
54
55 /* 延时t毫秒 */
C51 COMPILER V8.02 DIANZIQIN 04/02/2007 20:26:21 PAGE 2
56 void delay(uint t)
57 {
58 1 uint i;
-
59 1 while(t--)
60 1 {
61 2 /* 对于12M时钟,约延时1ms */
62 2 for (i=0;i<125;i++)
63 2 {}
64 2 }
65 1 }
66
67 /* 向MAX7219写入字节(8位)*/
68 void SendChar (uchar byte)
69 {
70 1 uchar i,temp;
71 1 _nop_();
72 1 for (i=0;i<8;i++)
73 1 {
74 2 temp=byte&0x80;
75 2 byte=byte<<1;
76 2 if(temp)
77 2 {
78 3 DIN=1; //写1
79 3 CLK=0;
80 3 CLK=1;
81 3 }
82 2 else
83 2 {
84 3 DIN=0; //写0
85 3 CLK=0;
86 3 CLK=1;
87 3 }
88 2 }
89 1 }
90
91 /* 向MAX7219写入字(16位)*/
92 void WriteWord (uchar addr,uchar num)
93 {
94 1 LOAD=0;
95 1 _nop_();
96 1 SendChar(addr);
97 1 _nop_();
98 1 SendChar(num);
99 1 _nop_();
100 1 LOAD=1; // 锁存进相应寄存器
101 1 }
102
103 /* MAX7219初始化 */
104 void InitDisplay (void)
105 {
106 1 WriteWord (ScanLimit,ScanDigit); // 设置扫描界限
107 1 WriteWord (DecodeMode,DecodeDigit); // 设置译码模式
108 1 WriteWord (Intensity,IntensityGrade); // 设置亮度
109 1 WriteWord (ShutDown,NormalOperation); // 设置为正常工作模式
110 1 }
111
112 /* 产生复位脉冲初始化DS18B20 */
113 void TxReset(void)
114 {
115 1 uint i;
116 1 DQ = 0;
C51 COMPILER V8.02 DIANZIQIN 04/02/2007 20:26:21 PAGE 3
117 1
118 1 /* 拉低约900us */
119 1 i = 100;
120 1 while (i>0) i--;
121 1
122 1 DQ = 1; // 产生上升沿
123 1 i = 4;
124 1 while (i>0) i--;
125 1 }
126
127 /* 等待应答脉冲 */
128 void RxWait(void)
129 {
130 1 uint i;
131 1 while(DQ);
132 1 while(~DQ); // 检测到应答脉冲
133 1 i = 4;
134 1 while (i>0) i--;
135 1 }
136
137 /* 读取数据的一位,满足读时隙要求 */
138 bit RdBit(void)
139 {
140 1 uint i;
141 1 bit b;
142 1 DQ = 0;
143 1 i++;
144 1 DQ = 1;
145 1 i++;i++; // 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
146 1 b = DQ;
147 1 i = 8;
148 1 while(i>0) i--;
149 1 return (b);
150 1 }
151
152 /* 读取数据的一个字节 */
153 uchar RdByte(void)
154 {
155 1 uchar i,j,b;
156 1 b = 0;
157 1 for (i=1;i<=8;i++)
158 1 {
159 2 j = RdBit();
160 2 b = (j<<7)|(b>>1);
161 2 }
162 1 return(b);
163 1 }
164
165 /* 写数据的一个字节,满足写1和写0的时隙要求 */
166 void WrByte(uchar b)
167 {
168 1 uint i;
169 1 uchar j;
170 1 bit btmp;
171 1 for(j=1;j<=8;j++)
172 1 {
173 2 btmp = b&0x01;
174 2 b = b>>1; // 取下一位(由低位向高位)
175 2 if (btmp)
176 2 {
177 3 /* 写1 */
178 3 DQ = 0;
C51 COMPILER V8.02 DIANZIQIN 04/02/2007 20:26:21 PAGE 4
179 3 i++;i++; // 延时,使得15us以内拉高
180 3 DQ = 1;
181 3 i = 8;
182 3 while(i>0) i--; // 整个写1时隙不低于60us
183 3 }
184 2 else
185 2 {
186 3 /* 写0 */
187 3 DQ = 0;
188 3 i = 8;
189 3 while(i>0) i--; // 保持低在60us到120us之间
190 3 DQ = 1;
191 3 i++;
192 3 i++;
193 3 }
194 2 }
195 1 }
196
197 /* 启动温度转换 */
198 void convert(void)
199 {
200 1 TxReset(); // 产生复位脉冲,初始化DS18B20
201 1 RxWait(); // 等待DS18B20给出应答脉冲
202 1 delay(1); // 延时
203 1 WrByte(0xcc); // skip rom 命令
204 1 WrByte(0x44); // convert T 命令
205 1 }
206
207 /* 读取温度值 */
208 void RdTemp(void)
209 {
210 1 TxReset(); // 产生复位脉冲,初始化DS18B20
211 1 RxWait(); // 等待DS18B20给出应答脉冲
212 1 delay(1); // 延时
213 1 WrByte(0xcc); // skip rom 命令
214 1 WrByte(0xbe); // read scratchpad 命令
215 1 tplsb = RdByte(); // 温度值低位字节(其中低4位为二进制的“小数”部分)
216 1 tpmsb = RdByte(); // 高位值高位字节(其中高5位为符号位)
217 1 }
218
219 void INTT0() interrupt 1
220 {
221 1 TH0=TH0_temp;
222 1 TL0=TL0_temp;
223 1 SQW=~SQW;
224 1 }
225
226
227 /* 主函数 */
228 void main(void)
229 {
230 1
231 1 TMOD=0x01;
232 1 ET0 =1;
233 1 EA =1;
234 1 TH0=0;
235 1 TL0=0;
236 1 TCON=0x10;
237 1 TR0=0;
238 1 InitDisplay (); // MAX7219初始化
239 1 WriteWord(DisplayTest,TestMode); // 开始显示测试,点亮所有LED
240 1 delay(1000); // 延时约1s
C51 COMPILER V8.02 DIANZIQIN 04/02/2007 20:26:21 PAGE 5
241 1 WriteWord (DisplayTest,TextEnd); // 退出显示测试模式
242 1 light=1;
243 1
244 1 while(1)
245 1 {
246 2 InitDisplay ();
247 2 delay(1);
248 2 convert();
249 2 delay(1000);
250 2 RdTemp();
251 2
252 2 if(((tpmsb>>3)&0x1f)==0x1f)
253 2 {
254 3 tplsb_f=~tplsb+0x01;
255 3 if (tplsb==0)
256 3 { tpmsb_f=~tpmsb+1;}
257 3 else
258 3 { tpmsb_f=~tpmsb; }
259 3
260 3 tm_f=((tpmsb_f&0x07)<<4)*16+(tplsb_f&0xf0)>>4;
261 3 tl_f=((tplsb_f&0x0f)*10)/16;
262 3 WriteWord (Digit0,0x0a);
263 3 WriteWord (Digit1,tm_f/10);
264 3 WriteWord (Digit2,((tm_f%10)|0x80));
265 3 WriteWord (Digit3,tl_f);
266 3 }
267 2 else
268 2 {
269 3 tm=((tpmsb&0x07)<<4)*16+(tplsb&0xf0)>>4;
270 3 tl=((tplsb&0x0f)*10)/16;
271 3 WriteWord (Digit0,0);
272 3 WriteWord (Digit1,tm/10);
273 3 WriteWord (Digit2,((tm%10)|0x80));
274 3 WriteWord (Digit3,tl);
275 3 if(tm>19)
276 3 {
277 4 TH0_temp=0xFC;
278 4 TL0_temp=0x5C;
279 4 TR0=1;
280 4 light=~light;
281 4
282 4 }
283 3 else
284 3 {
285 4 TR0=0;
286 4 SQW=0;
287 4 }
288 3 }
289 2 }
290 1 }
291
292
293
294
295
296
297
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 649 ----
CONSTANT SIZE = ---- ----
C51 COMPILER V8.02 DIANZIQIN 04/02/2007 20:26:21 PAGE 6
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 12 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -