?? 測量溫度.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 + -