📄 w014.lst
字号:
C51 COMPILER V8.02 W014 06/07/2007 21:46:16 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE W014
OBJECT MODULE PLACED IN w014.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE w014.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************************
2 * 实验名称: 多功能数字温度表(DS18B20) *
3 ********************************************************************************
4 * 实验描述: 多功能数字温度表具有测温、预设温度上下限、声光报警等功能 *
- *
5 * 实验说明: 各功能键如下: *
6 * S1 温度上下限设置及确认键 *
7 * S2 温度上(下)限加1键 *
8 * S3 温度上(下)限减1键 *
9 * BELL 声音报警 *
10 * D04 光报警 *
11 * *
12 * 温度上下限设置过程: *
13 * (1)按S1进入温度上限设置界面,然后按S2或S3设置温度上限值, *
14 * 最后按S1确认,自动进入温度下限设置界面。 *
15 * (2)按S2或S3设置温度下限值,按S1确认,自动进入温度测量状态 *
16 * *
17 * 当温度超过上下限时,会发出声光报警,并显示相关信息 *
18 *******************************************************************************/
19
20 #include <reg52.h>
21 #include <intrins.h>
22
23 #define uchar unsigned char
24 #define uint unsigned int
25
26
27 sbit DQ = P3^7 ; //定义DS18B20端口DQ
28 sbit BEEP = P1^4 ; //定义蜂鸣器端口
29 sbit RED_Light = P1^3 ; //报警灯
30
31 sbit LCD_RS = P2^3;
32 sbit LCD_RW = P2^4;
33
34 sbit HC138_A = P2^5;
35 sbit HC138_B = P2^6;
36 sbit HC138_C = P2^7;
37
38 #define SELECT_LCD() HC138_A=0; HC138_B=1; HC138_C=0
39 #define NOSELECT_LCD() HC138_A=1; HC138_B=1; HC138_C=1
40
41 sbit S1 = P1^5 ; //设置键和确认键
42 sbit S2 = P1^6 ; //加1键
43 sbit S3 = P1^7 ; //减1键
44
45 bit presence ;
46
47 uchar TH=30; //初始温度上限值
48 uchar TL=25; //初始温度下限值
49
50 uchar Keyset_Flag = 0; //S1键扫描标志位
51 uchar BEEP_Flag = 0; //蜂鸣器报警标志位
52
53 uchar code dis_code1[ ] = {" DS18B20 OK "} ;
54 uchar code dis_code2[ ] = {" TEMP: . C "} ;
C51 COMPILER V8.02 W014 06/07/2007 21:46:16 PAGE 2
55 uchar code dis_code3[ ] = {" DS18B20 ERR0R "} ;
56 uchar code dis_code4[ ] = {" PLEASE CHECK "} ;
57
58 uchar data temp_data[2] = {0x00,0x00} ; //温度数据缓存
59 uchar data display_TH[2] = {0x00,0x00} ; //温度上限值十位个位
60 uchar data display_TL[2] = {0x00,0x00} ; //温度下限值十位个位
61
62 uchar data dis_data[5] = {0x00,0x00,0x00,0x00,0x00} ; //温度值百十个小数位及一个数据缓存
63
64 /*温度小数部分查表*/
65 uchar code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
66 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
67
68 /*自定义字符*/
69 uchar code mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ; //度的符号
70
71
72
73 /*******************************************************************/
74 /* */
75 /* us级延时函数 */
76 /* */
77 /*******************************************************************/
78 void Delay(unsigned int num)
79 {
80 1 while( --num ) ;
81 1 }
82
83 /*******************************************************************/
84 /* */
85 /* ms级延时函数 */
86 /* */
87 /*******************************************************************/
88 void Delayms(unsigned char ms)
89 {
90 1 unsigned char i;
91 1 while(ms--)
92 1 {
93 2 for(i = 0; i < 120; i++);
94 2 }
95 1 }
96
97 /*******************************************************************/
98 /* */
99 /* 检测LCD的忙碌状态 */
100 /* */
101 /*******************************************************************/
102 bit LCD_Busy()
103 {
104 1 bit result;
105 1 LCD_RS = 0;
106 1 LCD_RW = 1;
107 1 SELECT_LCD();
108 1 _nop_();
109 1 _nop_();
110 1 _nop_();
111 1 _nop_();
112 1 result = (bit)(P0 & 0x80); //检查LCD的DB7的值 1为忙 0为空闲,可写指令与数据
113 1 NOSELECT_LCD();
114 1 return result;
115 1 }
116
C51 COMPILER V8.02 W014 06/07/2007 21:46:16 PAGE 3
117 /*******************************************************************/
118 /* */
119 /* 写指令数据到LCD */
120 /* */
121 /*******************************************************************/
122 LCD_WriteCommand(uchar cmd)
123 {
124 1 while(LCD_Busy());
125 1 LCD_RS = 0;
126 1 LCD_RW = 0;
127 1 NOSELECT_LCD();
128 1 _nop_();
129 1 _nop_();
130 1 P0 = cmd;
131 1 _nop_();
132 1 _nop_();
133 1 _nop_();
134 1 _nop_();
135 1 SELECT_LCD();
136 1 _nop_();
137 1 _nop_();
138 1 _nop_();
139 1 _nop_();
140 1 NOSELECT_LCD();
141 1 }
142
143 /*******************************************************************/
144 /* */
145 /* 写显示数据到LCD */
146 /* */
147 /*******************************************************************/
148 LCD_WriteDate(uchar dat)
149 {
150 1 while(LCD_Busy());
151 1 LCD_RS = 1;
152 1 LCD_RW = 0;
153 1 NOSELECT_LCD();
154 1 P0 = dat;
155 1 _nop_();
156 1 _nop_();
157 1 _nop_();
158 1 _nop_();
159 1 SELECT_LCD();
160 1 _nop_();
161 1 _nop_();
162 1 _nop_();
163 1 _nop_();
164 1 NOSELECT_LCD();
165 1 }
166
167 /*******************************************************************/
168 /* */
169 /* 设定字符在LCD上显示的位置 */
170 /* */
171 /*******************************************************************/
172 LCD_DisplayPosit(uchar pos)
173 {
174 1 LCD_WriteCommand(pos | 0x80);
175 1 }
176
177 /*******************************************************************/
178 /* */
C51 COMPILER V8.02 W014 06/07/2007 21:46:16 PAGE 4
179 /* LCD初始化 */
180 /* */
181 /*******************************************************************/
182 LCD_Init()
183 {
184 1 LCD_WriteCommand(0x38);
185 1 Delay(5);
186 1 LCD_WriteCommand(0x0c);
187 1 Delay(5);
188 1 LCD_WriteCommand(0x06);
189 1 Delay(5);
190 1 LCD_WriteCommand(0x01);
191 1 Delay(5);
192 1 }
193
194 /*******************************************************************/
195 /* */
196 /* 自定义字符写入CGRAM函数 */
197 /* */
198 /*******************************************************************/
199 void LCD_WriteMytab()
200 {
201 1 unsigned char i ;
202 1 LCD_WriteCommand(0x40) ; //写CGRAM
203 1 for (i = 0 ; i< 8 ; i++)
204 1 LCD_WriteDate(mytab[ i ]) ;
205 1 }
206
207 /*******************************************************************/
208 /* */
209 /* LCD上显示两行字符函数 */
210 /* */
211 /*******************************************************************/
212 void LCD_DisplayLine(uchar a[ ],uchar b[ ])
213 {
214 1 uchar m ;
215 1 LCD_Init() ;
216 1
217 1 LCD_DisplayPosit(0) ; //设置显示位置为第一行的第1个字符
218 1 m = 0 ;
219 1 while(a[m] != '\0')
220 1 { //显示第一行字符
221 2 LCD_WriteDate(a[m]) ;
222 2 m++ ;
223 2 }
224 1
225 1 LCD_DisplayPosit(0x40) ; //设置显示位置为第二行第1个字符
226 1 m = 0 ;
227 1 while(b[m] != '\0')
228 1 {
229 2 LCD_WriteDate(b[m]) ; //显示第二行字符
230 2 m++ ;
231 2 }
232 1 }
233
234 /*******************************************************************/
235 /* */
236 /* DS18B20初始化 */
237 /* */
238 /*******************************************************************/
239 DS18B20_Init(void)
240 {
C51 COMPILER V8.02 W014 06/07/2007 21:46:16 PAGE 5
241 1 DQ = 1 ; //DQ复位
242 1 Delay(8) ; //延时
243 1
244 1 DQ = 0 ; //将DQ拉低
245 1 Delay(90) ; //精确延时 大于 480us
246 1
247 1 DQ = 1 ; //拉高总线
248 1 Delay(8) ;
249 1
250 1 presence = DQ ; //如果 presence=0则初始化成功 presence=1则初始化失败
251 1 Delay(100) ;
252 1 DQ = 1 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -