📄 w013.lst
字号:
C51 COMPILER V8.08 W013 04/02/2008 20:53:36 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE W013
OBJECT MODULE PLACED IN w013.OBJ
COMPILER INVOKED BY: D:\program files\Keil 3\C51\BIN\C51.EXE w013.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************************
2 * 实验名称: 数字温度表(DS18B20)LCD1620显示 *
3 ********************************************************************************
4 * 实验描述: LCD1620显示测量的温度 *
5 * 实验说明: DS18B20正常时,显示“DS18B20 OK”及温度值 *
6 * DS18B20没有安装时,显示“DS18B20 ERR0R PLEASE CHECK” *
7 * 实验前要在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^0;
20 sbit LCD_RW = P2^1;
21
22 sbit SELECT_LCD=P2^2;
23
24
25 sbit DQ = P3^7 ; //定义DS18B20端口DQ
26 bit presence ; //DS18B20初始化成功标志位
27
28 uchar data temp_data[2] = {0x00,0x00} ; //温度数据缓存
29 uchar data dis_data[5]={0,0,0,0,0}; //温度值百十个小数位及一个数据缓存
30
31 uchar code dis_code1[ ] = {" DS18B20 OK "} ;
32 uchar code dis_code2[ ] = {" TEMP: . C "} ;
33 uchar code dis_code3[ ] = {" DS18B20 ERR0R "} ;
34 uchar code dis_code4[ ] = {" PLEASE CHECK "} ;
35
36
37 /*温度小数部分查表*/
38 unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
39 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
40
41
42 /*自定义字符*/
43 unsigned char code mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ; //度的符号
44
45
46 void Delay(unsigned int num) //us级延时函数
47 {
48 1 while( --num ) ;
49 1 }
50
51 bit LCD_Busy() //LCD忙碌状态检测
52 {
53 1 bit result;
54 1 LCD_RS = 0;
55 1 LCD_RW = 1;
C51 COMPILER V8.08 W013 04/02/2008 20:53:36 PAGE 2
56 1 SELECT_LCD=1;
57 1 _nop_();
58 1 _nop_();
59 1 _nop_();
60 1 _nop_();
61 1 result = (bit)(P0 & 0x80);
62 1 SELECT_LCD=0;
63 1 return result;
64 1 }
65
66 LCD_WriteCommand(uchar cmd) //写指令数据到LCD
67 {
68 1 while(LCD_Busy());
69 1 LCD_RS = 0;
70 1 LCD_RW = 0;
71 1 SELECT_LCD=0;
72 1 _nop_();
73 1 _nop_();
74 1 P0 = cmd;
75 1 _nop_();
76 1 _nop_();
77 1 _nop_();
78 1 _nop_();
79 1 SELECT_LCD=1;
80 1 _nop_();
81 1 _nop_();
82 1 _nop_();
83 1 _nop_();
84 1 SELECT_LCD=0;
85 1 }
86
87 LCD_WriteDate(uchar dat) //写字符显示数据到LCD
88 {
89 1 while(LCD_Busy());
90 1 LCD_RS = 1;
91 1 LCD_RW = 0;
92 1 SELECT_LCD=0;
93 1 P0 = dat;
94 1 _nop_();
95 1 _nop_();
96 1 _nop_();
97 1 _nop_();
98 1 SELECT_LCD=1;
99 1 _nop_();
100 1 _nop_();
101 1 _nop_();
102 1 _nop_();
103 1 SELECT_LCD=0;
104 1 }
105
106 LCD_DisplayPosit(uchar pos) //设定字符在LCD上显示的位置
107 {
108 1 LCD_WriteCommand(pos | 0x80);
109 1 }
110
111 LCD_Init() //LCD初始化
112 {
113 1 LCD_WriteCommand(0x38);
114 1 Delay(5);
115 1 LCD_WriteCommand(0x0c);
116 1 Delay(5);
117 1 LCD_WriteCommand(0x06);
C51 COMPILER V8.08 W013 04/02/2008 20:53:36 PAGE 3
118 1 Delay(5);
119 1 LCD_WriteCommand(0x01);
120 1 Delay(5);
121 1 }
122
123 void LCD_WriteMytab() //自定义字符写入CGRAM函数
124 {
125 1 unsigned char i ;
126 1 LCD_WriteCommand(0x40) ; //写CGRAM
127 1 for (i = 0 ; i< 8 ; i++)
128 1 LCD_WriteDate(mytab[ i ]) ;
129 1 }
130
131 void LCD_DisplayLine(uchar a[ ],uchar b[ ]) //LCD1620显示两行字符函数
132 {
133 1 uchar m ;
134 1 LCD_Init() ; //初始化LCD
135 1
136 1 LCD_DisplayPosit(0) ; //设置显示位置为第一行的第1个字符
137 1 m = 0 ;
138 1 while(a[m] != '\0')
139 1 { //显示第一行字符
140 2 LCD_WriteDate(a[m]) ;
141 2 m++ ;
142 2 }
143 1
144 1 LCD_DisplayPosit(0x40) ; //设置显示位置为第二行第1个字符
145 1 m = 0 ;
146 1 while(b[m] != '\0')
147 1 {
148 2 LCD_WriteDate(b[m]) ; //显示第二行字符
149 2 m++ ;
150 2 }
151 1 }
152
153 DS18B20_Init(void) //DS18B20初始化函数
154 {
155 1 DQ = 1 ; //DQ复位
156 1 Delay(8) ; //延时
157 1
158 1 DQ = 0 ; //单片机将DQ拉低
159 1 Delay(90) ; //延时 大于 480us
160 1
161 1 DQ = 1 ; //拉高总线
162 1 Delay(8) ;
163 1
164 1 presence = DQ ; //如果 presence=0则初始化成功 presence=1则初始化失败
165 1 Delay(100) ;
166 1 DQ = 1 ;
167 1
168 1 return(presence) ; // 返回信号,0=presence,1= no presence
169 1 }
170
171 ReadOneChar(void) //读一个字节数据函数
172 {
173 1 unsigned char i = 0 ;
174 1 unsigned char dat = 0 ;
175 1
176 1 for (i = 8 ; i > 0 ; i--)
177 1 {
178 2 DQ = 0 ;
179 2 dat >>= 1 ;
C51 COMPILER V8.08 W013 04/02/2008 20:53:36 PAGE 4
180 2 DQ = 1 ;
181 2
182 2 if(DQ)
183 2 dat |= 0x80 ;
184 2 Delay(4) ; XXX
185 2 }
*** ERROR C202 IN LINE 185 OF W013.C: 'XXX': undefined identifier
*** ERROR C141 IN LINE 185 OF W013.C: syntax error near '}'
186 1
187 1 return (dat) ;
188 1 }
189
190
191 WriteOneChar(unsigned char dat) //写一个字节数据函数
192 {
193 1 unsigned char i = 0 ;
194 1 for (i = 8 ; i > 0 ; i--)
195 1 {
196 2 DQ = 0 ;
197 2 DQ = dat&0x01 ;
198 2 Delay(5) ;
199 2
200 2 DQ = 1 ;
201 2 dat>>=1 ;
202 2 }
203 1 }
204
205 ReadTemperature(void) //读取温度函数
206 {
207 1 DS18B20_Init() ;
208 1
209 1 WriteOneChar(0xCC) ; //跳过读序号列号的操作
210 1 WriteOneChar(0x44) ; //启动温度转换
211 1
212 1 DS18B20_Init() ;
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 TemperatureDisplay() //温度数据转换和显示函数
221 {
222 1 dis_data[4]=temp_data[0]&0x0f ; //temp_data[0]低4为有效
223 1 dis_data[3]=ditab[dis_data[4]]+0x30; //查表得小数位的值
224 1
225 1 dis_data[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
226 1 dis_data[2]=dis_data[4]%10+0x30; //个位
227 1 dis_data[1]=(dis_data[4]/10)%10+0x30; //十位
228 1 dis_data[0]=dis_data[4]/100+0x30; //百位
229 1
230 1 if(dis_data[0]==0x30) //百位为0,不显示
231 1 {
232 2 dis_data[0]=0x20;
233 2
234 2 if(dis_data[1]==0x30) //十位为0,不显示
235 2 dis_data[1]=0x20 ;
236 2 }
237 1
238 1 LCD_DisplayPosit(0x48) ;
239 1 LCD_WriteDate(dis_data[0]) ; //百位数显示
C51 COMPILER V8.08 W013 04/02/2008 20:53:36 PAGE 5
240 1 LCD_DisplayPosit(0x49) ;
241 1 LCD_WriteDate(dis_data[1]) ; //十位数显示
242 1 LCD_DisplayPosit(0x4a) ;
243 1 LCD_WriteDate(dis_data[2]) ; //个位数显示
244 1 LCD_DisplayPosit(0x4c) ;
245 1 LCD_WriteDate(dis_data[3]) ; //小数位数显示
246 1 LCD_WriteMytab() ; //自定义字符(度的符号)写入CGRAM
247 1 Delay(5) ;
248 1 LCD_DisplayPosit(0x4d) ;
249 1 LCD_WriteDate(0x00) ; //显示自定义字符(度的符号)
250 1
251 1 }
252
253 void DS18B20_OkMenu () //DS18B20 OK 菜单显示函数
254 {
255 1 LCD_DisplayLine(dis_code1,dis_code2);
256 1 }
257
258 void DS18B20_ErrorMenu () //DS18B20 ERROR 菜单显示函数
259 {
260 1 LCD_DisplayLine(dis_code3,dis_code4);
261 1 }
262
263 void main() //主函数
264 {
265 1 DS18B20_OkMenu () ;
266 1
267 1 do
268 1 {
269 2 ReadTemperature() ;
270 2 TemperatureDisplay() ;
271 2 }
272 1 while(!presence) ;
273 1
274 1 DS18B20_ErrorMenu () ;
275 1
276 1 do
277 1 {
278 2 DS18B20_Init() ;
279 2 }
280 1 while(presence) ;
281 1 }
C51 COMPILATION COMPLETE. 0 WARNING(S), 2 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -