?? temper.lst
字號:
C51 COMPILER V7.50 TEMPER 05/14/2007 21:37:30 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE TEMPER
OBJECT MODULE PLACED IN temper.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE temper.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include < reg51.h >
2 #include < intrins.h >
3
4 #define uchar unsigned char
5 #define uint unsigned int
6
7 sbit DQ = P3^5 ; //定義DS18B20端口DQ
8 sbit BEEP=P3^3 ; //蜂鳴器驅(qū)動線
9
10 bit presence ;
11
12 sbit LCD_RS = P3^7 ;
13 sbit LCD_RW = P3^6 ;
14 sbit LCD_EN = P3^4 ;
15
16 #define LCD_DATA P2 //LCD
17 uchar code cdis1[ ] = {" DS18B20 OK "} ;
18 uchar code cdis2[ ] = {" TEMP: . C "} ;
19 uchar code cdis3[ ] = {" DS18B20 ERR0R "} ;
20 uchar code cdis4[ ] = {" PLEASE CHECK "} ;
21
22 unsigned char data temp_data[2] = {0x00,0x00} ;
23 unsigned char data display[5] = {0x00,0x00,0x00,0x00,0x00} ;
24 unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
25 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
26 void beep();
27 unsigned char code mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;
28
29 #define delayNOP(); {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;
30
31 /*******************************************************************/
32 void delay1(int ms)
33 {
34 1 unsigned char y ;
35 1 while(ms--)
36 1 {
37 2 for(y = 0 ; y<250 ; y++)
38 2 {
39 3 _nop_() ;
40 3 _nop_() ;
41 3 _nop_() ;
42 3 _nop_() ;
43 3 }
44 2 }
45 1 }
46
47 /******************************************************************/
48 /*檢查LCD忙狀態(tài) */
49 /*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數(shù)據(jù)。 */
50 /******************************************************************/
51 bit lcd_busy()
52 {
53 1 bit result ;
54 1 LCD_RS = 0 ;
55 1 LCD_RW = 1 ;
C51 COMPILER V7.50 TEMPER 05/14/2007 21:37:30 PAGE 2
56 1 LCD_EN = 1 ;
57 1 delayNOP() ;
58 1 result = (bit)(LCD_DATA&0x80) ;
59 1 LCD_EN = 0 ;
60 1 return(result) ;
61 1 }
62
63 /*寫指令數(shù)據(jù)到LCD */
64 /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */
65 /*******************************************************************/
66 void lcd_wcmd(uchar cmd)
67 {
68 1 while(lcd_busy()) ;
69 1 LCD_RS = 0 ;
70 1 LCD_RW = 0 ;
71 1 LCD_EN = 0 ;
72 1 _nop_() ;
73 1 _nop_() ;
74 1 LCD_DATA = cmd ;
75 1 delayNOP() ;
76 1 LCD_EN = 1 ;
77 1 delayNOP() ;
78 1 LCD_EN = 0 ;
79 1 }
80
81 /*******************************************************************/
82 /*寫顯示數(shù)據(jù)到LCD */
83 /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。 */
84 /*******************************************************************/
85 void lcd_wdat(uchar dat)
86 {
87 1 while(lcd_busy()) ;
88 1 LCD_RS = 1 ;
89 1 LCD_RW = 0 ;
90 1 LCD_EN = 0 ;
91 1 LCD_DATA = dat ;
92 1 delayNOP() ;
93 1 LCD_EN = 1 ;
94 1 delayNOP() ;
95 1 LCD_EN = 0 ;
96 1 }
97
98
99 /* LCD初始化設(shè)定 */
100 /*******************************************************************/
101 void lcd_init()
102 {
103 1 delay1(15) ;
104 1 lcd_wcmd(0x01) ; //清除LCD的顯示內(nèi)容
105 1 lcd_wcmd(0x38) ; //16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
106 1 delay1(5) ;
107 1 lcd_wcmd(0x38) ;
108 1 delay1(5) ;
109 1 lcd_wcmd(0x38) ;
110 1 delay1(5) ;
111 1
112 1 lcd_wcmd(0x0c) ; //顯示開,關(guān)光標(biāo)
113 1 delay1(5) ;
114 1 lcd_wcmd(0x06) ; //移動光標(biāo)
115 1 delay1(5) ;
116 1 lcd_wcmd(0x01) ; //清除LCD的顯示內(nèi)容
117 1 delay1(5) ;
C51 COMPILER V7.50 TEMPER 05/14/2007 21:37:30 PAGE 3
118 1 }
119
120 /* 設(shè)定顯示位置 */
121 /*******************************************************************/
122 void lcd_pos(uchar pos)
123 {
124 1 lcd_wcmd(pos | 0x80) ; //數(shù)據(jù)指針=80+地址變量
125 1 }
126
127 /*自定義字符寫入CGRAM */
128 /*******************************************************************/
129 void writetab()
130 {
131 1 unsigned char i ;
132 1 lcd_wcmd(0x40) ; //寫CGRAM
133 1 for (i = 0 ; i< 8 ; i++)
134 1 lcd_wdat(mytab[ i ]) ;
135 1 }
136
137 /*us級延時函數(shù) */
138 /*******************************************************************/
139
140 void Delay(unsigned int num)
141 {
142 1 while( --num ) ;
143 1 }
144
145 /*初始化ds1820 */
146 /*******************************************************************/
147 Init_DS18B20(void)
148 {
149 1 DQ = 1 ; //DQ復(fù)位
150 1 Delay(8) ; //稍做延時
151 1
152 1 DQ = 0 ; //單片機(jī)將DQ拉低
153 1 Delay(90) ; //精確延時 大于 480us
154 1
155 1 DQ = 1 ; //拉高總線
156 1 Delay(8) ;
157 1
158 1 presence = DQ ; //如果=0則初始化成功 =1則初始化失敗
159 1 Delay(100) ;
160 1 DQ = 1 ;
161 1
162 1 return(presence) ; //返回信號,0=presence,1= no presence
163 1 }
164
165
166 /* 讀一個字節(jié) */
167 /*******************************************************************/
168 ReadOneChar(void)
169 {
170 1 unsigned char i = 0 ;
171 1 unsigned char dat = 0 ;
172 1
173 1 for (i = 8 ; i > 0 ; i--)
174 1 {
175 2 DQ = 0 ; // 給脈沖信號
176 2 dat >>= 1 ;
177 2 DQ = 1 ; // 給脈沖信號
178 2
179 2 if(DQ)
C51 COMPILER V7.50 TEMPER 05/14/2007 21:37:30 PAGE 4
180 2 dat |= 0x80 ;
181 2 Delay(4) ;
182 2 }
183 1
184 1 return (dat) ;
185 1 }
186
187 /* 寫一個字節(jié) */
188 /*******************************************************************/
189 WriteOneChar(unsigned char dat)
190 {
191 1 unsigned char i = 0 ;
192 1 for (i = 8 ; i > 0 ; i--)
193 1 {
194 2 DQ = 0 ;
195 2 DQ = dat&0x01 ;
196 2 Delay(5) ;
197 2
198 2 DQ = 1 ;
199 2 dat>>=1 ;
200 2 }
201 1 }
202
203 /* 讀取溫度 */
204 /*******************************************************************/
205 Read_Temperature(void)
206 {
207 1 Init_DS18B20() ;
208 1
209 1 WriteOneChar(0xCC) ; // 跳過讀序號列號的操作
210 1 WriteOneChar(0x44) ; // 啟動溫度轉(zhuǎn)換
211 1
212 1 Init_DS18B20() ;
213 1 WriteOneChar(0xCC) ; //跳過讀序號列號的操作
214 1 WriteOneChar(0xBE) ; //讀取溫度寄存器
215 1
216 1 temp_data[0] = ReadOneChar() ; //溫度低8位
217 1 temp_data[1] = ReadOneChar() ; //溫度高8位
218 1 }
219
220 /* 數(shù)據(jù)轉(zhuǎn)換與溫度顯示 */
221 /*******************************************************************/
222 Disp_Temperature()
223 {
224 1 display[4]=temp_data[0]&0x0f ;
225 1 display[0]=ditab[display[4]]+0x30 ; //查表得小數(shù)位的值
226 1
227 1 display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
228 1 display[3]=display[4]/100+0x30 ;
229 1 display[1]=display[4]%100 ;
230 1 display[2]=display[1]/10+0x30 ;
231 1 display[1]=display[1]%10+0x30 ;
232 1
233 1 if(display[3]==0x30) //高位為0,不顯示
234 1 {
235 2 display[3]=0x20 ;
236 2 if(display[2]==0x30) //次高位為0,不顯示
237 2 display[2]=0x20 ;
238 2 }
239 1
240 1 lcd_pos(0x48) ;
241 1 lcd_wdat(display[3]) ; //百位數(shù)顯示
C51 COMPILER V7.50 TEMPER 05/14/2007 21:37:30 PAGE 5
242 1 lcd_pos(0x49) ;
243 1 lcd_wdat(display[2]) ; //十位數(shù)顯示
244 1 lcd_pos(0x4a) ;
245 1 lcd_wdat(display[1]) ; //個位數(shù)顯示
246 1 lcd_pos(0x4c) ;
247 1 lcd_wdat(display[0]) ; //小數(shù)位數(shù)顯示
248 1 }
249
250 /*******************************************************************/
251 /* 蜂鳴器響一聲 */
252 /*******************************************************************/
253 void beep()
254 {
255 1 unsigned char y ;
256 1 for (y=0 ;y<100 ;y++)
257 1 {
258 2 Delay(60) ;
259 2 BEEP=!BEEP ; //BEEP取反
260 2 }
261 1 BEEP=1 ; //關(guān)閉蜂鳴器
262 1 Delay(40000) ;
263 1 }
264
265 /* DS18B20 OK 顯示菜單 */
266 /*******************************************************************/
267 void Ok_Menu ()
268 {
269 1 uchar m ;
270 1 lcd_init() ; //初始化LCD
271 1
272 1 lcd_pos(0) ; //設(shè)置顯示位置為第一行的第1個字符
273 1 m = 0 ;
274 1 while(cdis1[m] != '\0')
275 1 { //顯示字符
276 2 lcd_wdat(cdis1[m]) ;
277 2 m++ ;
278 2 }
279 1
280 1 lcd_pos(0x40) ; //設(shè)置顯示位置為第二行第1個字符
281 1 m = 0 ;
282 1 while(cdis2[m] != '\0')
283 1 {
284 2 lcd_wdat(cdis2[m]) ; //顯示字符
285 2 m++ ;
286 2 }
287 1
288 1 writetab() ; //自定義字符寫入CGRAM
289 1 delay1(5) ;
290 1 lcd_pos(0x4d) ;
291 1 lcd_wdat(0x00) ; //顯示自定義字符
292 1 }
293
294
295 /* DS18B20 ERROR 顯示菜單 */
296 /*******************************************************************/
297 void Error_Menu ()
298 {
299 1 uchar m ;
300 1 lcd_init() ; //初始化LCD
301 1
302 1 lcd_pos(0) ; //設(shè)置顯示位置為第一行的第1個字符
303 1 m = 0 ;
C51 COMPILER V7.50 TEMPER 05/14/2007 21:37:30 PAGE 6
304 1 while(cdis3[m] != '\0')
305 1 { //顯示字符
306 2 lcd_wdat(cdis3[m]) ;
307 2 m++ ;
308 2 }
309 1
310 1 lcd_pos(0x40) ; //設(shè)置顯示位置為第二行第1個字符
311 1 m = 0 ;
312 1 while(cdis4[m] != '\0')
313 1 {
314 2 lcd_wdat(cdis4[m]) ; //顯示字符
315 2 m++ ;
316 2 }
317 1 }
318
319
320 /* 主函數(shù) */
321 /************************************/
322 void main()
323 { delay1(10) ;
324 1 Ok_Menu () ;
325 1
326 1 do
327 1 {
328 2 Read_Temperature() ;
329 2 Disp_Temperature() ;
330 2 }
331 1 while(!presence) ;
332 1
333 1 Error_Menu () ;
334 1
335 1 do
336 1 {
337 2 Init_DS18B20() ;
338 2 beep() ;
339 2 }
340 1 while(presence) ;
341 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 629 ----
CONSTANT SIZE = 92 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 ----
IDATA SIZE = ---- ----
BIT SIZE = 1 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -