📄 temp.lst
字号:
C51 COMPILER V7.09 TEMP 06/05/2008 21:41:50 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE TEMP
OBJECT MODULE PLACED IN Temp.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Temp.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg52.h>
2 #define uchar unsigned char
3 #define uint unsigned int
4
5
6 uchar dis[5]={0x10,0x10,0x10,0x10};
7 uchar c[4]={1, 2, 4, 8};
8 uchar seg7[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
9 uchar dot_seg[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
10
11 uint tm; //从DS18B20读出的数据
12
13 uchar isNeg;/*是否为负数标志位*/
14 sbit DQ=P3^7;/*DS18B20的DQ端*/
15 /* ********************延时t毫秒 ***************************/
16 void delay(uint t)
17 {
18 1 uchar m;
19 1 while(t--)
20 1 {
21 2 for (m=0;m<100;m++)
22 2 ;
23 2 }
24 1 }
25
26 /******************************ds1820程序***************************************/
27 void delay_18B20(uint i)//延时1微秒
28 {
29 1 while(i--)
30 1 ;
31 1 }
32
33
34 /********************* 产生复位脉冲初始化DS18B20 **************************/
35 void TxReset(void)
36 {
37 1 DQ = 1; //DQ复位
38 1 delay_18B20(4); //延时
39 1 DQ = 0; //DQ拉低
40 1 delay_18B20(100); //精确延时大于480us
41 1 DQ = 1; //拉高
42 1 delay_18B20(4);
43 1 }
44
45 /* ***********************等待应答脉冲 *********************/
46 void RxWait(void)
47 {
48 1 while(DQ)
49 1 ;
50 1 while(~DQ)
51 1 ; // 检测到应答脉冲
52 1
53 1 delay_18B20(1);
54 1 }
55
C51 COMPILER V7.09 TEMP 06/05/2008 21:41:50 PAGE 2
56 /* ****************读取数据的一个字节 *****************************/
57 uchar RdByte(void)
58 {
59 1 unsigned char i=0;
60 1 unsigned char dat = 0;
61 1 for(i = 8; i > 0; i--)
62 1 {
63 2 DQ = 0; //给脉冲信号
64 2 dat >>= 1;
65 2 DQ = 1; //给脉冲信号
66 2 if(DQ)
67 2 dat |= 0x80;
68 2 delay_18B20(10);
69 2 }
70 1 return(dat);
71 1 }
72
73 /* ****************写数据的一个字节,满足写1和写0的时隙要求 *************/
74 void WrByte(uchar wdata)
75 {
76 1 unsigned char i=0;
77 1 for(i = 8; i > 0; i--)
78 1 {
79 2 DQ = 0;
80 2 DQ = wdata&0x01;
81 2 delay_18B20(10);
82 2 DQ = 1;
83 2 wdata>>=1;
84 2 delay_18B20(10);
85 2 }
86 1 }
87
88 /* **************启动温度转换 *******************/
89 void convert(void)
90 {
91 1 TxReset(); // 产生复位脉冲,初始化DS18B20
92 1 RxWait(); // 等待DS18B20给出应答脉冲
93 1 WrByte(0xcc); // skip rom 命令
94 1 WrByte(0x44); // convert T 命令
95 1 }
96
97 /**************** 读取温度值 *********************/
98 void RdTemp(void)
99 {
100 1 uchar tpmsb, tplsb;
101 1
102 1 convert();
103 1 TxReset(); // 产生复位脉冲,初始化DS18B20
104 1 RxWait(); // 等待DS18B20给出应答脉冲
105 1 WrByte(0xcc); // skip rom 命令
106 1 WrByte(0xbe); // read scratchpad 命令
107 1 tplsb = RdByte(); // 温度值低位字节(其中低4位为二进制的“小数”部分)
108 1 tpmsb = RdByte(); // 高位值高位字节(其中高5位为符号位)
109 1 tm = tpmsb;
110 1 tm <<= 8;
111 1 tm = tm | tplsb;
112 1 if(tm & 0x0fff)
113 1 isNeg = 0;
114 1 else
115 1 {
116 2 tm = ~tm + 1;
117 2 isNeg = 1;
C51 COMPILER V7.09 TEMP 06/05/2008 21:41:50 PAGE 3
118 2 }
119 1 }
120
121 //*************************8数据处理程序************************//
122 void dataProc(void)
123 {
124 1 uchar temp1,temp2;
125 1 uint tt;
126 1 uint tmp;
127 1
128 1 if(tm < 0)
129 1 tm = 0 - tm;
130 1 temp2 = tm & 0x0f;
131 1 temp1 = (tm >> 4) & 0xff;
132 1 tmp = temp1 / 10 % 10;
133 1 if(tmp >= 5 && tmp != 16)
134 1 P1 = 0x08;
135 1 else
136 1 P1 = 0x40;
137 1
138 1 if(tmp == 0)
139 1 dis[0] = seg7[16];
140 1 else
141 1 dis[0] = seg7[tmp];
142 1 if(isNeg)
143 1 dis[0] = 0xbf;
144 1 tmp = temp1 % 10;
145 1 dis[1] = dot_seg[tmp];
146 1 tt = tm & 0x0f;
147 1 if(isNeg == 0)
148 1 tt = 625*tt;
149 1 else
150 1 {
151 2 tt = 0 - tt;
152 2 tt = tt & 0x0f;
153 2 tt = tt * 625;
154 2 }
155 1 tmp = tt / 1000;
156 1 dis[2] = seg7[tmp];
157 1 tmp = tt / 100 % 10;
158 1 dis[3] = seg7[tmp];
159 1 }
160 //**************显示程序**************** 使用了时钟中断//
161 void display(void) interrupt 1
162 {
163 1 static uchar i;
164 1
165 1 TH0 = 0xD8;
166 1 TL0 = 0xF0;
167 1 P2 = c[i];
168 1 P0 = dis[i];
169 1 i = (i + 1) % 4;
170 1 }
171
172 void initINT(void)
173 {
174 1 TMOD = 0x01;
175 1 TH0 = 0xF0;
176 1 TL0 = 0x5F;
177 1 ET0 = 1;
178 1 EX0 = 1;
179 1 TR0 = 1;
C51 COMPILER V7.09 TEMP 06/05/2008 21:41:50 PAGE 4
180 1 EA = 1;
181 1 }
182
183 /* 主程序,读取的温度值最终存放在tplsb和tpmsb变量中。
184 tplsb其中低4位为二进制的“小数”部分;tpmsb其中高
185 5位为符号位。真正通过数码管输出时,需要进行到十进
186 制有符号实数(包括小数部分)的转换。*/
187 void main(void)
188 {
189 1 initINT();
190 1 P0=0xff;
191 1 P1 = 0;
192 1 while(1)
193 1 {
194 2 RdTemp(); // 读取温度
195 2 dataProc();
196 2 delay(250);
197 2 }
198 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 509 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 40 1
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -