📄 0.lst
字号:
C51 COMPILER V8.02 0 06/29/2010 15:15:13 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 0
OBJECT MODULE PLACED IN 0.OBJ
COMPILER INVOKED BY: D:\处理软件\keil\C51\BIN\C51.EXE 0.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************/
2 /* */
3 /* TX-51STAR单片机开发系统演示程序 - DS18B20-64位序列码读取程序 */
4 /* *
5 * LCD1602显示 *
6 * *
7 * 工作芯片:STC89C516 晶振频率:11.0592MHz *
8 * *
9 * 版本: V1.0 (2009/1/2) *
10 * 作者: 郭天祥 (Email: txmcu@163.com) *
11 * 网站: www.tx-power.com(天祥电子) *
12 * 邮箱: txmcu@163.com *
13 * *
14 *【版权】Copyright(C)天祥电子 www.tx-power.com All Rights Reserved *
15 *【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! *
16 * *
17 /*******************************************************************/
18 /*读取DS18B20的64位序列码并显示在1602液晶上,如果读取正确结果,则在
19 液晶第一行显示DS18B20 OK,第二行显示序列码,如果读取失败,则在液晶上
20 显示DS18B20 ERR0R PLEASE CHECK ,用户可通过更改18B20接口自己外接。 */
21 #include <reg51.h>
22 #include <intrins.h>
23
24 #define uchar unsigned char
25 #define uint unsigned int
26
27 sbit DQ = P2^2; //定义DS18B20端口DQ
28 sbit BEEP=P2^3 ; //蜂鸣器驱动线
29
30 bit presence ;
31
32 sbit LCD_RS = P3^5;
33 //sbit LCD_RW = P2^1;
34 sbit LCD_EN = P3^4;
35
36 uchar code cdis1[ ] = {" DS18B20 OK "};
37 uchar code cdis2[ ] = {" "};
38 uchar code cdis3[ ] = {" DS18B20 ERR0R "};
39 uchar code cdis4[ ] = {" PLEASE CHECK "};
40
41 unsigned char data display[2] = {0x00,0x00};
42
43 unsigned char data RomCode[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
44
45 unsigned char Temp;
46 unsigned char crc;
47
48 void beep();
49
50 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
51
52 /*******************************************************************/
53 void delay1(int ms)
54 {
55 1 unsigned char y;
C51 COMPILER V8.02 0 06/29/2010 15:15:13 PAGE 2
56 1 while(ms--)
57 1 {
58 2 for(y = 0; y<250; y++)
59 2 {
60 3 _nop_();
61 3 _nop_();
62 3 _nop_();
63 3 _nop_();
64 3 }
65 2 }
66 1 }
67
68 /******************************************************************/
69 /* */
70 /*检查LCD忙状态 */
71 /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
72 /* */
73 /******************************************************************/
74
75 bit lcd_busy()
76 {
77 1 bit result;
78 1 LCD_RS = 0;
79 1 // LCD_RW = 1;
80 1 LCD_EN = 1;
81 1 delayNOP();
82 1 result = (bit)(P0&0x80);
83 1 LCD_EN = 0;
84 1 return(result);
85 1 }
86
87 /*******************************************************************/
88 /* */
89 /*写指令数据到LCD */
90 /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
91 /* */
92 /*******************************************************************/
93
94 void lcd_wcmd(uchar cmd)
95
96 {
97 1 // while(lcd_busy());
98 1 LCD_RS = 0;
99 1 // LCD_RW = 0;
100 1 LCD_EN = 0;
101 1 _nop_();
102 1 _nop_();
103 1 P0 = cmd;
104 1 delayNOP();
105 1 LCD_EN = 1;
106 1 delayNOP();
107 1 LCD_EN = 0;
108 1 delay1(5);
109 1 }
110
111 /*******************************************************************/
112 /* */
113 /*写显示数据到LCD */
114 /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
115 /* */
116 /*******************************************************************/
117
C51 COMPILER V8.02 0 06/29/2010 15:15:13 PAGE 3
118 void lcd_wdat(uchar dat)
119 {
120 1 // while(lcd_busy());
121 1 LCD_RS = 1;
122 1 // LCD_RW = 0;
123 1 LCD_EN = 0;
124 1 P0 = dat;
125 1 delayNOP();
126 1 LCD_EN = 1;
127 1 delayNOP();
128 1 LCD_EN = 0;
129 1 delay1(5);
130 1 }
131
132 /*******************************************************************/
133 /* */
134 /* LCD初始化设定 */
135 /* */
136 /*******************************************************************/
137
138 void lcd_init()
139 {
140 1 delay1(15);
141 1 lcd_wcmd(0x01); //清除LCD的显示内容
142 1
143 1 lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
144 1 delay1(5);
145 1 lcd_wcmd(0x38);
146 1 delay1(5);
147 1 lcd_wcmd(0x38);
148 1 delay1(5);
149 1
150 1 lcd_wcmd(0x0c); //显示开,关光标
151 1 delay1(5);
152 1 lcd_wcmd(0x06); //移动光标
153 1 delay1(5);
154 1 lcd_wcmd(0x01); //清除LCD的显示内容
155 1 delay1(5);
156 1 }
157
158 /*******************************************************************/
159 /* */
160 /* 设定显示位置 */
161 /* */
162 /*******************************************************************/
163
164 void lcd_pos(uchar pos)
165 {
166 1 lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
167 1 }
168
169 /*******************************************************************/
170 /* */
171 /*us级延时函数 */
172 /* */
173 /*******************************************************************/
174
175 void Delay(unsigned int num)
176 {
177 1 while( --num );
178 1 }
179
C51 COMPILER V8.02 0 06/29/2010 15:15:13 PAGE 4
180 /*******************************************************************/
181 /* */
182 /*初始化ds1820 */
183 /* */
184 /*******************************************************************/
185 Init_DS18B20(void)
186 {
187 1 DQ = 1; //DQ复位
188 1 Delay(8); //稍做延时
189 1
190 1 DQ = 0; //将DQ拉低
191 1 Delay(90); //精确延时 大于 480us
192 1
193 1 DQ = 1; //拉高总线
194 1 Delay(8);
195 1
196 1 presence = DQ; //读取存在信号
197 1 Delay(100);
198 1 DQ = 1;
199 1
200 1 return(presence); //返回信号,0=presence,1= no presence
201 1 }
202
203 /*******************************************************************/
204 /* */
205 /* 读一位(bit) */
206 /* */
207 /*******************************************************************/
208 uchar read_bit(void)
209 {
210 1 unsigned char i;
211 1 DQ = 0; //将DQ 拉低开始读时间隙
212 1 DQ = 1; // then return high
213 1 for (i=0; i<3; i++); // 延时15μs
214 1 return(DQ); // 返回 DQ 线上的电平值
215 1 }
216
217 /*******************************************************************/
218 /* */
219 /* 读一个字节 */
220 /* */
221 /*******************************************************************/
222 ReadOneChar(void)
223 {
224 1 unsigned char i = 0;
225 1 unsigned char dat = 0;
226 1
227 1 //for (i = 8; i > 0; i--)
228 1 // {
229 1 // read_bit();
230 1 // DQ = 0; // 给脉冲信号
231 1 // dat >>= 1;
232 1 // DQ = 1; // 给脉冲信号
233 1 for (i=0;i<8;i++)
234 1 { // 读取字节,每次读取一个字节
235 2 if(read_bit()) dat|=0x01<<i; // 然后将其左移
236 2
237 2 // if(DQ)
238 2 // dat |= 0x80;
239 2 Delay(4);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -