📄 测量温度.lst
字号:
C51 COMPILER V8.02 测量温度 07/13/2008 20:50:07 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 测量温度
OBJECT MODULE PLACED IN 测量温度.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE 测量温度.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg52.h>
2 #include<intrins.h>
3
4
5 void delay(unsigned int t);
6 void beep(unsigned int i);
7
8
9 unsigned char DisBuff[4];
10 unsigned char temp;
11 unsigned char COM;
12
13 sbit COM1=P2^7; //定义通信端口
14 sbit COM2=P2^4;
15 sbit COM3=P2^5;
16 sbit COM4=P2^6;
17 sbit DQ=P3^7;
18 sbit BEEP=P3^4;
19
20
21 #define a 0x04 // AAAA
22 #define b 0x01 // F B
23 #define c 0x10 // F B
24 #define d 0x40 // GGGG
25 #define e 0x80 // E C
26 #define f 0x02 // E C
27 #define g 0x08 // DDDD H
28 #define h 0x20
29
30 unsigned char code LED_table[]={
31 a+b+c+d+e+f, //"0"
32 b+c, //"1"
33 a+b+d+e+g, //"2"
34 a+b+c+d+g, //"3"
35 b+c+f+g, //"4"
36 a+c+d+f+g, //"5"
37 a+c+d+e+f+g, //"6"
38 a+b+c, //"7"
39 a+b+c+d+e+f+g, //"8"
40 a+b+c+d+f+g, //"9"
41 b+c+e+f+g, //"H"
42 a+f+e+d, //"C"
43 d+e+f, //"L"
44 g, //"-"
45 0x00 //black
46 };
47
48 #undef a
49 #undef b
50 #undef c
51 #undef d
52 #undef e
53 #undef f
54 #undef g
55
C51 COMPILER V8.02 测量温度 07/13/2008 20:50:07 PAGE 2
56 #define SP 14
57 /********************************************************/
58 /* 初始化系统 */
59 /********************************************************/
60 void Sys_Init()
61 {
62 1 TMOD=0x01;
63 1 TH0=(65536-1000)/256; //1ms
64 1 TL0=(65536-1000)%256;
65 1 EA=1;
66 1 ET0=1;
67 1 TR0=1;
68 1 }
69
70 /*********************************************************/
71 /* 初始化DS18B20 */
72 /*********************************************************/
73 void Init_DS18B20(void) //初始化函数
74 {
75 1 unsigned char x=0;
76 1 DQ = 1; //DQ复位
77 1 delay(8); //稍做延时
78 1 DQ = 0; //pull DQ line low
79 1 delay(80); //leave it low for 480~960us
80 1 DQ = 1; //allow line to return high
81 1 delay(14); //wait for presence 15~60us
82 1 x=DQ; //稍做延时后 如果x=0则初始化成功
83 1 delay(20); // x=1则初始化失败
84 1 }
85 /*********************************************************/
86 /* 读一个字节 */
87 /*********************************************************/
88 unsigned char Read_byte(void)
89 {
90 1 unsigned char i=0;
91 1 unsigned char dat=0;
92 1 for (i=8;i>0;i--)
93 1 {
94 2 DQ = 0; // 给脉冲信号
95 2 dat>>=1;
96 2 DQ = 1; // 给脉冲信号
97 2 if(DQ)
98 2 dat|=0x80; // 取数据最高位
99 2 delay(4);
100 2 }
101 1 return(dat);
102 1 }
103
104 /*********************************************************/
105 /* 写一个字节 */
106 /*********************************************************/
107 void Write_byte(unsigned char dat)
108 {
109 1 unsigned char i=0;
110 1 for (i=8; i>0; i--)
111 1 {
112 2 DQ = 0;
113 2 DQ = dat&0x01; //取数据最低位
114 2 delay(5);
115 2 DQ = 1;
116 2 dat>>=1;
117 2 }
C51 COMPILER V8.02 测量温度 07/13/2008 20:50:07 PAGE 3
118 1 delay(4);
119 1 }
120
121 /*********************************************************/
122 /* 读取温度 */
123 /*********************************************************/
124 ReadTemperature(void)
125 {
126 1 unsigned char a=0;
127 1 unsigned char b=0;
128 1 unsigned char t=0;
129 1
130 1 Init_DS18B20();
131 1
132 1 Write_byte(0xCC); // 跳过读序号列号的动作 因为只有一个器件
133 1 Write_byte(0x44); // 启动温度转换
134 1
135 1 Init_DS18B20();
136 1
137 1 Write_byte(0xCC); //跳过读序号列号的动作
138 1 Write_byte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
139 1 a=Read_byte(); //读取温度值低位
140 1 b=Read_byte(); //读取温度值高位
141 1 //a=a>>4; //低位右移4位,舍弃小数部分
142 1 //b=b<<4; //高位左移4位,舍弃符号位
143 1 //t=b|a;
144 1 //return(t);
145 1 t=(b*256+a)*10/16;
146 1 if(t!=temp)
147 1 {
148 2 beep(5000);
149 2 temp=t;
150 2 }
151 1 return((b*256+a)*10/16); // b*256+a 把两个8位温度变成16位
152 1 } // *10 扩大10倍从而保留小数位
153 // /16 把18b20的输出换算成实际温度,
154 // 显示时的小数点视情况而定
155
156 /*********************************************************/
157 /* 温度显示函数 */
158 /*********************************************************/
159 void DisplayNumber(unsigned int Num)
160 {
161 1 unsigned char i;
162 1 EA=0;
163 1 for(i=0;i<4;i++)
164 1 {
165 2 DisBuff[i]=Num%10;
166 2 Num/=10;
167 2 }
168 1 /* if(DisBuff[3]==0)
169 1 {
170 1 DisBuff[3]=0xff;
171 1 if(DisBuff[2]==0)
172 1 {
173 1 DisBuff[2]=0xff;
174 1 if(DisBuff[1]==0)
175 1 DisBuff[1]=0xff;
176 1 }
177 1 } */
178 1 for(i=3;i>=0;i--) //消隐无效"0"
179 1 {
C51 COMPILER V8.02 测量温度 07/13/2008 20:50:07 PAGE 4
180 2 if(DisBuff[i]==0) DisBuff[i]=SP;
181 2 else break;
182 2 }
183 1 delay(100);
184 1 EA=1;
185 1
186 1 }
187 /*********************************************************/
188 /* 数码管扫描选通 */
189 /*********************************************************/
190 void Display_Scan() interrupt 1 //中断1触发时,就会指向该函数执行
191 { //并且保留现场,该函数完成后,回到入口,
192 1 TR0=0; //从原现场继续执行,等待下次中断发生
193 1 TH0=(65536-1000)/256; //1ms
194 1 TL0=(65536-1000)%256;
195 1 TR0=1;
196 1
197 1 if(COM>3) COM=0;
198 1 COM1=1;COM2=1;COM3=1;COM4=1;
199 1 switch(COM)
200 1 {
201 2 case 0: P0=LED_table[DisBuff[0]]; COM1=0; break;
202 2 case 1: P0=LED_table[DisBuff[1]]|0x20; COM2=0; break; //在数码管第二位上点亮小数点
203 2 case 2: P0=LED_table[DisBuff[2]]; COM3=0; break;
204 2 case 3: P0=LED_table[DisBuff[3]]; COM4=0; break;
205 2 }
206 1 COM++;
207 1 }
208
209 /*********************************************************/
210 /* 延时子程序 */
211 /*********************************************************/
212 void delay(unsigned int i)
213 {
214 1 while(i--);
215 1
216 1 }
217
218 /*********************************************************/
219 /* 蜂鸣器 */
220 /*********************************************************/
221 void beep(unsigned int i)
222 {
223 1 BEEP = 0;
224 1 while(i--) {}
225 1 BEEP = 1;
226 1 }
227
228 /*********************************************************/
229 /* 主函数 */
230 /*********************************************************/
231 void main(void)
232 {
233 1 unsigned int temp;
234 1 Sys_Init();
235 1 while(1) //死循环
236 1 {
237 2 temp=ReadTemperature();
238 2 DisplayNumber(temp);
239 2 }
240 1 }
241
C51 COMPILER V8.02 测量温度 07/13/2008 20:50:07 PAGE 5
242
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 484 ----
CONSTANT SIZE = 15 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 11
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 + -