📄 ds18b20-lcd1602-c51.lst
字号:
C51 COMPILER V8.05a DS18B20_LCD1602_C51 11/20/2006 21:44:00 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE DS18B20_LCD1602_C51
OBJECT MODULE PLACED IN DS18B20-LCD1602-C51.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DS18B20-LCD1602-C51.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************/
2 /* */
3 /* ME500单片机开发系统演示程序 - DS18B20温度显示 */
4 /* */
5 /* LCD1602显示 */
6 /* */
7 /* 版本: V1.0 (2006/11/20) */
8 /* 作者: gguoqing (Email: gguoqing@willar.com) */
9 /* 网站: www.willar.com(伟纳电子) www.mcusj.com(伟纳单片机世界) */
10 /* 时间: 2006/09/20 */
11 /* */
12 /*【版权】Copyright(C)伟纳电子 www.willar.com All Rights Reserved */
13 /*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! */
14 /* */
15 /*******************************************************************/
16
17 #include <reg51.h>
18 #include <intrins.h>
19
20 #define uchar unsigned char
21 #define uint unsigned int
22
23 sbit DQ = P3^3; //定义DS18B20端口DQ
24 sbit BEEP=P3^7 ; //蜂鸣器驱动线
25
26 bit presence,flag;
27 bit compare_th,compare_tl,alarm_on_off=0,temp_th,temp_tl;
28
29 sbit LCD_RS = P2^0;
30 sbit LCD_RW = P2^1;
31 sbit LCD_EN = P2^2;
32
33 sbit K1 = P1^4;
34 sbit K2 = P1^5;
35 sbit K3 = P1^6;
36 sbit K4 = P1^7;
37
38 uchar code cdis1[ ] = {" READ_ROMCORD "};
39 uchar code cdis2[ ] = {" "};
40 uchar code cdis3[ ] = {" DS18B20 ERR0R "};
41 uchar code cdis4[ ] = {" PLEASE CHECK "};
42 uchar code cdis5[ ] = {" TEMP: "};
43 uchar code cdis6[ ] = {"TH: TL: "};
44
45 unsigned char data temp_data[2] = {0x00,0x00};
46 unsigned char data temp_alarm[2] = {0x00,0x00};
47 unsigned char data display[5] = {0x00,0x00,0x00,0x00,0x00}; //温度值显示
48 unsigned char data display1[3] = {0x00,0x00,0x00}; //温度报警值显示
49 //unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
50 // 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
51
52 unsigned char data RomCode[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
53
54 unsigned char code mytab1[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};
55 unsigned char code mytab2[8] = {0x01,0x1b,0x1d,0x19,0x1d,0x1b,0x01,0x00};//小喇叭
C51 COMPILER V8.05a DS18B20_LCD1602_C51 11/20/2006 21:44:00 PAGE 2
56 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
57
58 unsigned char Temp,temp_comp,timecount,count;
59 unsigned char crc;
60 void Disp_Temp_alarm(uchar addr,uchar num);
61 void spk(uchar addr);
62 void set_temp_alarm();
63 void temp_compare();
64 void beep();
65 /*******************************************************************/
66 void delay1(int ms)
67 {
68 1 unsigned char y;
69 1 while(ms--)
70 1 {
71 2 for(y = 0; y<250; y++)
72 2 {
73 3 _nop_();
74 3 _nop_();
75 3 _nop_();
76 3 _nop_();
77 3 }
78 2 }
79 1 }
80
81 /******************************************************************/
82 /* */
83 /*检查LCD忙状态 */
84 /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
85 /* */
86 /******************************************************************/
87
88 bit lcd_busy()
89 {
90 1 bit result;
91 1 LCD_RS = 0;
92 1 LCD_RW = 1;
93 1 LCD_EN = 1;
94 1 delayNOP();
95 1 result = (bit)(P0&0x80);
96 1 LCD_EN = 0;
97 1 return(result);
98 1 }
99
100 /*******************************************************************/
101 /* */
102 /*写指令数据到LCD */
103 /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
104 /* */
105 /*******************************************************************/
106 void lcd_wcmd(uchar cmd)
107 {
108 1 while(lcd_busy());
109 1 LCD_RS = 0;
110 1 LCD_RW = 0;
111 1 LCD_EN = 0;
112 1 _nop_();
113 1 _nop_();
114 1 P0 = cmd;
115 1 delayNOP();
116 1 LCD_EN = 1;
117 1 delayNOP();
C51 COMPILER V8.05a DS18B20_LCD1602_C51 11/20/2006 21:44:00 PAGE 3
118 1 LCD_EN = 0;
119 1 }
120
121 /*******************************************************************/
122 /* */
123 /*写显示数据到LCD */
124 /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
125 /* */
126 /*******************************************************************/
127 void lcd_wdat(uchar dat)
128 {
129 1 while(lcd_busy());
130 1 LCD_RS = 1;
131 1 LCD_RW = 0;
132 1 LCD_EN = 0;
133 1 P0 = dat;
134 1 delayNOP();
135 1 LCD_EN = 1;
136 1 delayNOP();
137 1 LCD_EN = 0;
138 1 }
139
140 /*******************************************************************/
141 /* */
142 /*自定义字符写入CGRAM */
143 /* */
144 /*******************************************************************/
145 void writetab()
146 {
147 1 unsigned char i;
148 1 lcd_wcmd(0x40); //写CGRAM
149 1 for (i = 0; i< 8; i++)
150 1 lcd_wdat(mytab1[i]);
151 1 for (i = 0; i< 8; i++)
152 1 lcd_wdat(mytab2[i]);
153 1 }
154
155 /*******************************************************************/
156 /* */
157 /* LCD初始化设定 */
158 /* */
159 /*******************************************************************/
160 void lcd_init()
161 {
162 1 delay1(15);
163 1 lcd_wcmd(0x01); //清除LCD的显示内容
164 1 lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
165 1 delay1(5);
166 1 lcd_wcmd(0x38);
167 1 delay1(5);
168 1 lcd_wcmd(0x38);
169 1 delay1(5);
170 1
171 1 lcd_wcmd(0x0c); //显示开,关光标
172 1 delay1(5);
173 1 lcd_wcmd(0x06); //移动光标
174 1 delay1(5);
175 1 lcd_wcmd(0x01); //清除LCD的显示内容
176 1 delay1(5);
177 1
178 1 writetab(); //自定义字符写入CGRAM
179 1 }
C51 COMPILER V8.05a DS18B20_LCD1602_C51 11/20/2006 21:44:00 PAGE 4
180
181 /*******************************************************************/
182 /* */
183 /* 设定显示位置 */
184 /* */
185 /*******************************************************************/
186
187 void lcd_pos(uchar pos)
188 {
189 1 lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
190 1 }
191
192 /*******************************************************************/
193 /* */
194 /*us级延时函数 */
195 /* */
196 /*******************************************************************/
197
198 void Delay(unsigned int num)
199 {
200 1 while( --num );
201 1 }
202
203 /*******************************************************************/
204 /* */
205 /*初始化ds1820 */
206 /* */
207 /*******************************************************************/
208 Init_DS18B20(void)
209 {
210 1 DQ = 1; //DQ复位
211 1 Delay(8); //稍做延时
212 1
213 1 DQ = 0; //单片机将DQ拉低
214 1 Delay(90); //精确延时 大于 480us
215 1
216 1 DQ = 1; //拉高总线
217 1 Delay(8);
218 1
219 1 presence = DQ; //如果=0则初始化成功 =1则初始化失败
220 1 Delay(100);
221 1 DQ = 1;
222 1
223 1 return(presence); //返回信号,0=presence,1= no presence
224 1 }
225
226 /*******************************************************************/
227 /* */
228 /* 读一个字节 */
229 /* */
230 /*******************************************************************/
231 ReadOneChar(void)
232 {
233 1 unsigned char i = 0;
234 1 unsigned char dat = 0;
235 1
236 1 for (i = 8; i > 0; i--)
237 1 {
238 2 DQ = 0; // 给脉冲信号
239 2 dat >>= 1;
240 2 DQ = 1; // 给脉冲信号
241 2
C51 COMPILER V8.05a DS18B20_LCD1602_C51 11/20/2006 21:44:00 PAGE 5
242 2 if(DQ)
243 2 dat |= 0x80;
244 2 Delay(4);
245 2 }
246 1 return (dat);
247 1 }
248
249 /*******************************************************************/
250 /* */
251 /* 写一个字节 */
252 /* */
253 /*******************************************************************/
254 WriteOneChar(unsigned char dat)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -