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