📄 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 ; //蜂鸣器驱动线
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忙状态 */
49 /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
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 /*写指令数据到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 /*写显示数据到LCD */
83 /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
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初始化设定 */
100 /*******************************************************************/
101 void lcd_init()
102 {
103 1 delay1(15) ;
104 1 lcd_wcmd(0x01) ; //清除LCD的显示内容
105 1 lcd_wcmd(0x38) ; //16*2显示,5*7点阵,8位数据
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) ; //显示开,关光标
113 1 delay1(5) ;
114 1 lcd_wcmd(0x06) ; //移动光标
115 1 delay1(5) ;
116 1 lcd_wcmd(0x01) ; //清除LCD的显示内容
117 1 delay1(5) ;
C51 COMPILER V7.50 TEMPER 05/14/2007 21:37:30 PAGE 3
118 1 }
119
120 /* 设定显示位置 */
121 /*******************************************************************/
122 void lcd_pos(uchar pos)
123 {
124 1 lcd_wcmd(pos | 0x80) ; //数据指针=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级延时函数 */
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复位
150 1 Delay(8) ; //稍做延时
151 1
152 1 DQ = 0 ; //单片机将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 /* 读一个字节 */
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 /* 写一个字节 */
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) ; // 启动温度转换
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 /* 数据转换与温度显示 */
221 /*******************************************************************/
222 Disp_Temperature()
223 {
224 1 display[4]=temp_data[0]&0x0f ;
225 1 display[0]=ditab[display[4]]+0x30 ; //查表得小数位的值
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]) ; //百位数显示
C51 COMPILER V7.50 TEMPER 05/14/2007 21:37:30 PAGE 5
242 1 lcd_pos(0x49) ;
243 1 lcd_wdat(display[2]) ; //十位数显示
244 1 lcd_pos(0x4a) ;
245 1 lcd_wdat(display[1]) ; //个位数显示
246 1 lcd_pos(0x4c) ;
247 1 lcd_wdat(display[0]) ; //小数位数显示
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 ; //关闭蜂鸣器
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) ; //设置显示位置为第一行的第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) ; //设置显示位置为第二行第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) ; //设置显示位置为第一行的第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) ; //设置显示位置为第二行第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 /* 主函数 */
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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -