?? w013.lst
字號(hào):
C51 COMPILER V8.02 W013 06/07/2007 21:45:36 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE W013
OBJECT MODULE PLACED IN w013.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE w013.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************************
2 * 實(shí)驗(yàn)名稱: 數(shù)字溫度表(DS18B20)LCD1620顯示 *
3 ********************************************************************************
4 * 實(shí)驗(yàn)描述: LCD1620顯示測量的溫度 *
5 * 實(shí)驗(yàn)說明: DS18B20正常時(shí),顯示“DS18B20 OK”及溫度值 *
6 * DS18B20沒有安裝時(shí),顯示“DS18B20 ERR0R PLEASE CHECK” *
7 * 實(shí)驗(yàn)前要在J7上安裝DS18B20 *
8 * 1:接DS18B20的GND端 *
9 * 2:接DS18B20的DQ端 *
10 * 3:接DS18B20的VDD端 *
11 *******************************************************************************/
12
13 #include <reg51.h>
14 #include <intrins.h>
15
16 #define uchar unsigned char
17 #define uint unsigned int
18
19 sbit LCD_RS = P2^3;
20 sbit LCD_RW = P2^4;
21
22 sbit HC138_A = P2^5;
23 sbit HC138_B = P2^6;
24 sbit HC138_C = P2^7;
25
26 #define SELECT_LCD() HC138_A=0; HC138_B=1; HC138_C=0
27 #define NOSELECT_LCD() HC138_A=1; HC138_B=1; HC138_C=1
28
29 sbit DQ = P3^7 ; //定義DS18B20端口DQ
30 bit presence ; //DS18B20初始化成功標(biāo)志位
31
32 uchar data temp_data[2] = {0x00,0x00} ; //溫度數(shù)據(jù)緩存
33 uchar data dis_data[5]={0,0,0,0,0}; //溫度值百十個(gè)小數(shù)位及一個(gè)數(shù)據(jù)緩存
34
35 uchar code dis_code1[ ] = {" DS18B20 OK "} ;
36 uchar code dis_code2[ ] = {" TEMP: . C "} ;
37 uchar code dis_code3[ ] = {" DS18B20 ERR0R "} ;
38 uchar code dis_code4[ ] = {" PLEASE CHECK "} ;
39
40
41 /*溫度小數(shù)部分查表*/
42 unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
43 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
44
45
46 /*自定義字符*/
47 unsigned char code mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ; //度的符號(hào)
48
49
50 void Delay(unsigned int num) //us級(jí)延時(shí)函數(shù)
51 {
52 1 while( --num ) ;
53 1 }
54
55 bit LCD_Busy() //LCD忙碌狀態(tài)檢測
C51 COMPILER V8.02 W013 06/07/2007 21:45:36 PAGE 2
56 {
57 1 bit result;
58 1 LCD_RS = 0;
59 1 LCD_RW = 1;
60 1 SELECT_LCD();
61 1 _nop_();
62 1 _nop_();
63 1 _nop_();
64 1 _nop_();
65 1 result = (bit)(P0 & 0x80);
66 1 NOSELECT_LCD();
67 1 return result;
68 1 }
69
70 LCD_WriteCommand(uchar cmd) //寫指令數(shù)據(jù)到LCD
71 {
72 1 while(LCD_Busy());
73 1 LCD_RS = 0;
74 1 LCD_RW = 0;
75 1 NOSELECT_LCD();
76 1 _nop_();
77 1 _nop_();
78 1 P0 = cmd;
79 1 _nop_();
80 1 _nop_();
81 1 _nop_();
82 1 _nop_();
83 1 SELECT_LCD();
84 1 _nop_();
85 1 _nop_();
86 1 _nop_();
87 1 _nop_();
88 1 NOSELECT_LCD();
89 1 }
90
91 LCD_WriteDate(uchar dat) //寫字符顯示數(shù)據(jù)到LCD
92 {
93 1 while(LCD_Busy());
94 1 LCD_RS = 1;
95 1 LCD_RW = 0;
96 1 NOSELECT_LCD();
97 1 P0 = dat;
98 1 _nop_();
99 1 _nop_();
100 1 _nop_();
101 1 _nop_();
102 1 SELECT_LCD();
103 1 _nop_();
104 1 _nop_();
105 1 _nop_();
106 1 _nop_();
107 1 NOSELECT_LCD();
108 1 }
109
110 LCD_DisplayPosit(uchar pos) //設(shè)定字符在LCD上顯示的位置
111 {
112 1 LCD_WriteCommand(pos | 0x80);
113 1 }
114
115 LCD_Init() //LCD初始化
116 {
117 1 LCD_WriteCommand(0x38);
C51 COMPILER V8.02 W013 06/07/2007 21:45:36 PAGE 3
118 1 Delay(5);
119 1 LCD_WriteCommand(0x0c);
120 1 Delay(5);
121 1 LCD_WriteCommand(0x06);
122 1 Delay(5);
123 1 LCD_WriteCommand(0x01);
124 1 Delay(5);
125 1 }
126
127 void LCD_WriteMytab() //自定義字符寫入CGRAM函數(shù)
128 {
129 1 unsigned char i ;
130 1 LCD_WriteCommand(0x40) ; //寫CGRAM
131 1 for (i = 0 ; i< 8 ; i++)
132 1 LCD_WriteDate(mytab[ i ]) ;
133 1 }
134
135 void LCD_DisplayLine(uchar a[ ],uchar b[ ]) //LCD1620顯示兩行字符函數(shù)
136 {
137 1 uchar m ;
138 1 LCD_Init() ; //初始化LCD
139 1
140 1 LCD_DisplayPosit(0) ; //設(shè)置顯示位置為第一行的第1個(gè)字符
141 1 m = 0 ;
142 1 while(a[m] != '\0')
143 1 { //顯示第一行字符
144 2 LCD_WriteDate(a[m]) ;
145 2 m++ ;
146 2 }
147 1
148 1 LCD_DisplayPosit(0x40) ; //設(shè)置顯示位置為第二行第1個(gè)字符
149 1 m = 0 ;
150 1 while(b[m] != '\0')
151 1 {
152 2 LCD_WriteDate(b[m]) ; //顯示第二行字符
153 2 m++ ;
154 2 }
155 1 }
156
157 DS18B20_Init(void) //DS18B20初始化函數(shù)
158 {
159 1 DQ = 1 ; //DQ復(fù)位
160 1 Delay(8) ; //延時(shí)
161 1
162 1 DQ = 0 ; //單片機(jī)將DQ拉低
163 1 Delay(90) ; //延時(shí) 大于 480us
164 1
165 1 DQ = 1 ; //拉高總線
166 1 Delay(8) ;
167 1
168 1 presence = DQ ; //如果 presence=0則初始化成功 presence=1則初始化失敗
169 1 Delay(100) ;
170 1 DQ = 1 ;
171 1
172 1 return(presence) ; // 返回信號(hào),0=presence,1= no presence
173 1 }
174
175 ReadOneChar(void) //讀一個(gè)字節(jié)數(shù)據(jù)函數(shù)
176 {
177 1 unsigned char i = 0 ;
178 1 unsigned char dat = 0 ;
179 1
C51 COMPILER V8.02 W013 06/07/2007 21:45:36 PAGE 4
180 1 for (i = 8 ; i > 0 ; i--)
181 1 {
182 2 DQ = 0 ;
183 2 dat >>= 1 ;
184 2 DQ = 1 ;
185 2
186 2 if(DQ)
187 2 dat |= 0x80 ;
188 2 Delay(4) ;
189 2 }
190 1
191 1 return (dat) ;
192 1 }
193
194
195 WriteOneChar(unsigned char dat) //寫一個(gè)字節(jié)數(shù)據(jù)函數(shù)
196 {
197 1 unsigned char i = 0 ;
198 1 for (i = 8 ; i > 0 ; i--)
199 1 {
200 2 DQ = 0 ;
201 2 DQ = dat&0x01 ;
202 2 Delay(5) ;
203 2
204 2 DQ = 1 ;
205 2 dat>>=1 ;
206 2 }
207 1 }
208
209 ReadTemperature(void) //讀取溫度函數(shù)
210 {
211 1 DS18B20_Init() ;
212 1
213 1 WriteOneChar(0xCC) ; //跳過讀序號(hào)列號(hào)的操作
214 1 WriteOneChar(0x44) ; //啟動(dòng)溫度轉(zhuǎn)換
215 1
216 1 DS18B20_Init() ;
217 1 WriteOneChar(0xCC) ; //跳過讀序號(hào)列號(hào)的操作
218 1 WriteOneChar(0xBE) ; //讀取溫度寄存器
219 1
220 1 temp_data[0] = ReadOneChar() ; //讀溫度低8位
221 1 temp_data[1] = ReadOneChar() ; //讀溫度高8位
222 1 }
223
224 TemperatureDisplay() //溫度數(shù)據(jù)轉(zhuǎn)換和顯示函數(shù)
225 {
226 1 dis_data[4]=temp_data[0]&0x0f ; //temp_data[0]低4為有效
227 1 dis_data[3]=ditab[dis_data[4]]+0x30; //查表得小數(shù)位的值
228 1
229 1 dis_data[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
230 1 dis_data[2]=dis_data[4]%10+0x30; //個(gè)位
231 1 dis_data[1]=(dis_data[4]/10)%10+0x30; //十位
232 1 dis_data[0]=dis_data[4]/100+0x30; //百位
233 1
234 1 if(dis_data[0]==0x30) //百位為0,不顯示
235 1 {
236 2 dis_data[0]=0x20;
237 2
238 2 if(dis_data[1]==0x30) //十位為0,不顯示
239 2 dis_data[1]=0x20 ;
240 2 }
241 1
C51 COMPILER V8.02 W013 06/07/2007 21:45:36 PAGE 5
242 1 LCD_DisplayPosit(0x48) ;
243 1 LCD_WriteDate(dis_data[0]) ; //百位數(shù)顯示
244 1 LCD_DisplayPosit(0x49) ;
245 1 LCD_WriteDate(dis_data[1]) ; //十位數(shù)顯示
246 1 LCD_DisplayPosit(0x4a) ;
247 1 LCD_WriteDate(dis_data[2]) ; //個(gè)位數(shù)顯示
248 1 LCD_DisplayPosit(0x4c) ;
249 1 LCD_WriteDate(dis_data[3]) ; //小數(shù)位數(shù)顯示
250 1 LCD_WriteMytab() ; //自定義字符(度的符號(hào))寫入CGRAM
251 1 Delay(5) ;
252 1 LCD_DisplayPosit(0x4d) ;
253 1 LCD_WriteDate(0x00) ; //顯示自定義字符(度的符號(hào))
254 1
255 1 }
256
257 void DS18B20_OkMenu () //DS18B20 OK 菜單顯示函數(shù)
258 {
259 1 LCD_DisplayLine(dis_code1,dis_code2);
260 1 }
261
262 void DS18B20_ErrorMenu () //DS18B20 ERROR 菜單顯示函數(shù)
263 {
264 1 LCD_DisplayLine(dis_code3,dis_code4);
265 1 }
266
267 void main() //主函數(shù)
268 {
269 1 DS18B20_OkMenu () ;
270 1
271 1 do
272 1 {
273 2 ReadTemperature() ;
274 2 TemperatureDisplay() ;
275 2 }
276 1 while(!presence) ;
277 1
278 1 DS18B20_ErrorMenu () ;
279 1
280 1 do
281 1 {
282 2 DS18B20_Init() ;
283 2 }
284 1 while(presence) ;
285 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 592 ----
CONSTANT SIZE = 92 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 6
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
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -