📄 digthermo.lst
字号:
C51 COMPILER V7.50 DIGTHERMO 10/06/2007 20:44:46 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE DIGTHERMO
OBJECT MODULE PLACED IN DigThermo.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE DigThermo.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "lcd2.h"
2 #include "DigThermo.h"
3 uchar tplsb,tpmsb; // 温度值低位、高位字节
4 float n;
5 /* 延时t毫秒 */
6 void delay2(uint t)
7 {
8 1 uint i;
9 1 while(t--)
10 1 {
11 2 /* 对于11.0592M时钟,约延时1ms */
12 2 for (i=0;i<125;i++)
13 2 {}
14 2 }
15 1 }
16
17 /* 产生复位脉冲初始化DS18B20 */
18 void TxReset(void)
19 {
20 1 uint i;
21 1 DQ = 0;
22 1
23 1 /* 拉低约900us */
24 1 i = 100;
25 1 while (i>0) i--;
26 1
27 1 DQ = 1; // 产生上升沿
28 1 i = 4;
29 1 while (i>0) i--;
30 1 }
31
32 /* 等待应答脉冲 */
33 void RxWait(void)
34 {
35 1 uint i;
36 1 while(DQ);
37 1 while(~DQ); // 检测到应答脉冲
38 1 i = 4;
39 1 while (i>0) i--;
40 1 }
41
42 /* 读取数据的一位,满足读时隙要求 */
43 bit RdBit(void)
44 {
45 1 uint i;
46 1 bit b;
47 1 DQ = 0;
48 1 i++;
49 1 DQ = 1;
50 1 i++;i++; // 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
51 1 b = DQ;
52 1 i = 8;
53 1 while(i>0) i--;
54 1 return (b);
55 1 }
C51 COMPILER V7.50 DIGTHERMO 10/06/2007 20:44:46 PAGE 2
56
57 /* 读取数据的一个字节 */
58 uchar RdByte(void)
59 {
60 1 uchar i,j,b;
61 1 b = 0;
62 1 for (i=1;i<=8;i++)
63 1 {
64 2 j = RdBit();
65 2 b = (j<<7)|(b>>1);
66 2 }
67 1 return(b);
68 1 }
69
70 /* 写数据的一个字节,满足写1和写0的时隙要求 */
71 void WrByte(uchar b)
72 {
73 1 uint i;
74 1 uchar j;
75 1 bit btmp;
76 1 for(j=1;j<=8;j++)
77 1 {
78 2 btmp = b&0x01;
79 2 b = b>>1; // 取下一位(由低位向高位)
80 2 if (btmp)
81 2 {
82 3 /* 写1 */
83 3 DQ = 0;
84 3 i++;i++; // 延时,使得15us以内拉高
85 3 DQ = 1;
86 3 i = 8;
87 3 while(i>0) i--; // 整个写1时隙不低于60us
88 3 }
89 2 else
90 2 {
91 3 /* 写0 */
92 3 DQ = 0;
93 3 i = 8;
94 3 while(i>0) i--; // 保持低在60us到120us之间
95 3 DQ = 1;
96 3 i++;
97 3 i++;
98 3 }
99 2 }
100 1 }
101
102 /* 启动温度转换 */
103 void convert(void)
104 {
105 1 TxReset(); // 产生复位脉冲,初始化DS18B20
106 1 RxWait(); // 等待DS18B20给出应答脉冲
107 1 delay(1); // 延时
108 1 WrByte(0xcc); // skip rom 命令
109 1 WrByte(0x44); // convert T 命令
110 1 }
111
112 /* 读取温度值 */
113 float RdTemp(void)
114 {
115 1 TxReset(); // 产生复位脉冲,初始化DS18B20
116 1 RxWait(); // 等待DS18B20给出应答脉冲
117 1 delay(1); // 延时
C51 COMPILER V7.50 DIGTHERMO 10/06/2007 20:44:46 PAGE 3
118 1 WrByte(0xcc); // skip rom 命令
119 1 WrByte(0xbe); // read scratchpad 命令
120 1 tplsb = RdByte(); // 温度值低位字节(其中低4位为二进制的“小数”部分)
121 1 tpmsb = RdByte(); // 高位值高位字节(其中高5位为符号位)
122 1 n=((tpmsb*256)+tplsb)*0.0605;
123 1 return(n);
124 1 }
125
126 /* 主程序,读取的温度值最终存放在tplsb和tpmsb变量中。
127 tplsb其中低4位为二进制的“小数”部分;tpmsb其中高
128 5位为符号位。真正通过数码管输出时,需要进行到十进
129 制有符号实数(包括小数部分)的转换。 */
130 /*void main(void)
131 { float i ;
132 lcd_init();
133 lcd_wchar(0,1,'T');
134 lcd_wchar(1,1,'E');
135 lcd_wchar(2,1,'M');
136 lcd_wchar(3,1,'P');
137 lcd_wchar(4,1,0x3a);
138 lcd_wchar(7,1,'C');
139 do
140 {
141 delay2(1); // 延时1ms
142 convert(); // 启动温度转换,需要750ms
143 delay2(1000); // 延时1s
144 i=RdTemp(); // 读取温度
145 lcd_wdata(5,1,i);
146
147
148 }
149 while(1);
150 }*/
151
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 307 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 ----
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 + -