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