📄 w013.lst
字号:
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 * 实验名称: 数字温度表(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^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初始化成功标志位
31
32 uchar data temp_data[2] = {0x00,0x00} ; //温度数据缓存
33 uchar data dis_data[5]={0,0,0,0,0}; //温度值百十个小数位及一个数据缓存
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 /*温度小数部分查表*/
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} ; //度的符号
48
49
50 void Delay(unsigned int num) //us级延时函数
51 {
52 1 while( --num ) ;
53 1 }
54
55 bit LCD_Busy() //LCD忙碌状态检测
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) //写指令数据到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) //写字符显示数据到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) //设定字符在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函数
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显示两行字符函数
136 {
137 1 uchar m ;
138 1 LCD_Init() ; //初始化LCD
139 1
140 1 LCD_DisplayPosit(0) ; //设置显示位置为第一行的第1个字符
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) ; //设置显示位置为第二行第1个字符
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初始化函数
158 {
159 1 DQ = 1 ; //DQ复位
160 1 Delay(8) ; //延时
161 1
162 1 DQ = 0 ; //单片机将DQ拉低
163 1 Delay(90) ; //延时 大于 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) ; // 返回信号,0=presence,1= no presence
173 1 }
174
175 ReadOneChar(void) //读一个字节数据函数
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) //写一个字节数据函数
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) //读取温度函数
210 {
211 1 DS18B20_Init() ;
212 1
213 1 WriteOneChar(0xCC) ; //跳过读序号列号的操作
214 1 WriteOneChar(0x44) ; //启动温度转换
215 1
216 1 DS18B20_Init() ;
217 1 WriteOneChar(0xCC) ; //跳过读序号列号的操作
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() //温度数据转换和显示函数
225 {
226 1 dis_data[4]=temp_data[0]&0x0f ; //temp_data[0]低4为有效
227 1 dis_data[3]=ditab[dis_data[4]]+0x30; //查表得小数位的值
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; //个位
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]) ; //百位数显示
244 1 LCD_DisplayPosit(0x49) ;
245 1 LCD_WriteDate(dis_data[1]) ; //十位数显示
246 1 LCD_DisplayPosit(0x4a) ;
247 1 LCD_WriteDate(dis_data[2]) ; //个位数显示
248 1 LCD_DisplayPosit(0x4c) ;
249 1 LCD_WriteDate(dis_data[3]) ; //小数位数显示
250 1 LCD_WriteMytab() ; //自定义字符(度的符号)写入CGRAM
251 1 Delay(5) ;
252 1 LCD_DisplayPosit(0x4d) ;
253 1 LCD_WriteDate(0x00) ; //显示自定义字符(度的符号)
254 1
255 1 }
256
257 void DS18B20_OkMenu () //DS18B20 OK 菜单显示函数
258 {
259 1 LCD_DisplayLine(dis_code1,dis_code2);
260 1 }
261
262 void DS18B20_ErrorMenu () //DS18B20 ERROR 菜单显示函数
263 {
264 1 LCD_DisplayLine(dis_code3,dis_code4);
265 1 }
266
267 void main() //主函数
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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -