📄 two_ds1820_lcd_write.lst
字号:
C51 COMPILER V7.50 TWO_DS1820_LCD_WRITE 08/11/2005 20:24:45 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE TWO_DS1820_LCD_WRITE
OBJECT MODULE PLACED IN two_DS1820_LCD_write.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE two_DS1820_LCD_write.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2
3
4
5
6 //**********************************************************************//
7 // 头文件区 //
8 //**********************************************************************//
9
10 #include <reg52.h> /*单片机内部寄存器*/
11
12 #include <intrins.h> /*内部函数调用,如_nop_() 、_crol_()、cror();*/
13
14 #include <absacc.h> /*绝对地址访问,如XBYTE[0x0fff0]*/
15
16 #include <LCD1602_packet.h> /*LCD 的初始化*/
17
18 #define pot 10
19 unsigned char disp[17]="temperature is: ";
20 unsigned char disp_number[]="0123456789.";
21 unsigned char buffer[17]=" ";
22 //unsigned char temp[10];
23
24 unsigned char ROM_0_code[]={0x28,0x25,0xb3,0x84,0x00,0x00,0x00,0x95};
25 unsigned char ROM_1_code[]={0x28,0x50,0xe2,0x84,0x00,0x00,0x00,0xbe};
26
27 /*--------------------------------------------------------------------------
28 DS1820.H
29
30
31 --------------------------------------------------------------------------*/
32 sbit TSOR = P1^3;
33
34
35 //**********************************************************************//
36 // 延时子程序 //
37 //**********************************************************************//
38 /*void delay(unsigned int d)
39 {
40 while(d--);
41 }
42 */
43 void delay100ms(void)
44 {
45 1 unsigned char i,j,k;
46 1 for(i=0;i<8;i++)
47 1 for(j=0;j<25;j++)
48 1 for(k=0;k<250;k++);
49 1 }
50
51 void delay15us(void)
52 {
53 1 unsigned char i;
54 1 for(i=0;i<8;i++);
55 1 }
C51 COMPILER V7.50 TWO_DS1820_LCD_WRITE 08/11/2005 20:24:45 PAGE 2
56
57 void delay60us(void)
58 {
59 1 unsigned char i;
60 1 for(i=0;i<30;i++);
61 1 }
62
63 void write_0_DS(void)//写 bit 0
64 {//写数据位0:置总线为低电平并保持至少15us,
65 1 //然后保持低电平15us~45us等待从端对电平采样,最后拉高电平完成写操作
66 1 TSOR=1;
67 1 TSOR=0;
68 1 delay15us();
69 1 delay15us();
70 1 delay15us();
71 1 delay15us();
72 1 delay15us();
73 1
74 1 TSOR=1;
75 1
76 1 _nop_();
77 1 _nop_();
78 1 }
79
80 void write_1_DS(void)//写 bit 1
81 {//写数据位1:置总线为低电平并保持1us~15us,
82 1 //然后拉高电平并保持15us~45us等待从端对电平采样,最后完成写操作
83 1 TSOR=1;
84 1 TSOR=0;
85 1 _nop_();
86 1 _nop_();
87 1 _nop_();
88 1 _nop_();
89 1 _nop_();
90 1 _nop_();
91 1 _nop_();
92 1
93 1 TSOR=1;
94 1
95 1 _nop_();
96 1 _nop_();
97 1 _nop_();
98 1 _nop_();
99 1 _nop_();
100 1 _nop_();
101 1 _nop_();
102 1 delay15us();
103 1 delay15us();
104 1 }
105
106
107 bit read_DS(void)//读取数据位
108 {//读数据位:置总线为低电平并保持至少1us,然后拉高电平保持1us,
109 1 //在15us内采样总线电平获得数据,延时45us完成读操作
110 1 bit b;
111 1
112 1 TSOR=1;
113 1 TSOR=0;
114 1 _nop_();
115 1 _nop_();
116 1 _nop_();
117 1
C51 COMPILER V7.50 TWO_DS1820_LCD_WRITE 08/11/2005 20:24:45 PAGE 3
118 1 TSOR=1;
119 1
120 1 _nop_();
121 1 _nop_();
122 1 _nop_();
123 1
124 1 b=TSOR;
125 1
126 1 delay15us();
127 1 delay15us();
128 1 delay15us();
129 1 _nop_();
130 1 _nop_();
131 1
132 1 return b;
133 1 }
134
135 void reset_DS(void)//复位总线
136 {//总线复位:置总线为低电平并保持480us,然后拉高电平,
137 1 //等待从端重新拉低电平作为响应,则总线复位完成
138 1 unsigned char i;
139 1
140 1 TSOR=1;
141 1 TSOR=0;
142 1 for(i=0;i<9;i++)
143 1 delay60us();
144 1 TSOR=1;
145 1
146 1 while(TSOR);//程序的关键,总线控制器发出(TX)一个复位脉冲(一个最少480us的
147 1 //低电平信号),然后释放总线,进入接收状态(RX)。单线总线由4.7K上拉电阻拉到
148 1 //到高电平。探测到I/0引脚上的上升沿后,DS182015等待15~60us,然后发出存在脉冲
149 1 //(一个60~240us的低电平信号。
150 1
151 1 for(i=0;i<3;i++)
152 1 delay60us();
153 1 }
154
155 void write_byte_DS(unsigned char byte)//写一个字节(byte)
156 {
157 1 unsigned char i;
158 1 for(i=0;i<8;i++)
159 1 {
160 2 if(byte & 0x01==0x01) //最低bit是否为0?
161 2 write_1_DS();
162 2 else
163 2 write_0_DS();
164 2 byte=byte>>1;
165 2 }
166 1 }
167
168 unsigned char read_byte_DS(void) //读一个字节(byte)
169 {
170 1 unsigned char i,j=0;
171 1 bit b;
172 1
173 1 for(i=0;i<8;i++)
174 1 {
175 2 b=read_DS(); //读取1bit
176 2 if(b) //为1否?
177 2 j+=1;
178 2 j=_cror_(j,1); //循环右移1位
179 2 }
C51 COMPILER V7.50 TWO_DS1820_LCD_WRITE 08/11/2005 20:24:45 PAGE 4
180 1 return j;
181 1 }
182
183 void DS1820_system_Init(void)
184 {
185 1 reset_DS(); //复位总线
186 1 write_byte_DS(0xcc); //忽略ROM匹配操作
187 1 write_byte_DS(0x4e); //设置写模式
188 1 write_byte_DS(0x64); //写温度上限TH为100度
189 1 write_byte_DS(0x8a); //写温度下限为负10度
190 1 write_byte_DS(0x1f); //写温度计配置寄存器
191 1 }
192
193
194 int get_temperature_0_DS1820(void) //获得温度,2字节的数据分别放在MSB,LSB中
195 {
196 1 unsigned char i;
197 1 unsigned char MSB=0,LSB=0;//温度值的整数部分,小数部分
198 1
199 1 reset_DS(); //复位总线
200 1 write_byte_DS(0x55); //ROM匹配操作
201 1
202 1 for(i=0;i<8;i++)
203 1 {
204 2 write_byte_DS(ROM_0_code[i]);
205 2 }
206 1
207 1 write_byte_DS(0x44); //温度转换命令
208 1 delay100ms();
209 1
210 1 reset_DS(); //复位总线
211 1 write_byte_DS(0x55); //ROM匹配操作
212 1
213 1 for(i=0;i<8;i++)
214 1 {
215 2 write_byte_DS(ROM_0_code[i]);
216 2 }
217 1
218 1 write_byte_DS(0xbe); //读取寄存器
219 1
220 1 LSB=read_byte_DS(); //读取第1字节
221 1 MSB=read_byte_DS(); //读取第2字节
222 1 /* read_byte_DS(); //读取第3字节
223 1 read_byte_DS(); //读取第4字节
224 1 read_byte_DS(); //读取第5字节
225 1 read_byte_DS(); //读取第6字节
226 1 read_byte_DS(); //读取第7字节
227 1 read_byte_DS(); //读取第8字节
228 1 read_byte_DS(); //读取第9字节*/
229 1
230 1 MSB=MSB<<4;
231 1 MSB+=(LSB&0xf0)>>4; //获得温度值整数部分
232 1 LSB=(LSB&0x0f) ? 5:0; //获得温度值小数部分
233 1 return (MSB*10+LSB);
234 1 }
235
236 int get_temperature_1_DS1820(void) //获得温度,2字节的数据分别放在MSB,LSB中
237 {
238 1 unsigned char i;
239 1 unsigned char MSB=0,LSB=0;//温度值的整数部分,小数部分
240 1
241 1 reset_DS(); //复位总线
C51 COMPILER V7.50 TWO_DS1820_LCD_WRITE 08/11/2005 20:24:45 PAGE 5
242 1 write_byte_DS(0x55); //ROM匹配操作
243 1
244 1 for(i=0;i<8;i++)
245 1 {
246 2 write_byte_DS(ROM_1_code[i]);
247 2 }
248 1
249 1 write_byte_DS(0x44); //温度转换命令
250 1 delay100ms();
251 1
252 1 reset_DS(); //复位总线
253 1 write_byte_DS(0x55); //ROM匹配操作
254 1
255 1 for(i=0;i<8;i++)
256 1 {
257 2 write_byte_DS(ROM_1_code[i]);
258 2 }
259 1
260 1 write_byte_DS(0xbe); //读取寄存器
261 1
262 1 LSB=read_byte_DS(); //读取第1字节
263 1 MSB=read_byte_DS(); //读取第2字节
264 1 /* read_byte_DS(); //读取第3字节
265 1 read_byte_DS(); //读取第4字节
266 1 read_byte_DS(); //读取第5字节
267 1 read_byte_DS(); //读取第6字节
268 1 read_byte_DS(); //读取第7字节
269 1 read_byte_DS(); //读取第8字节
270 1 read_byte_DS(); //读取第9字节
271 1 */
272 1 MSB=MSB<<4;
273 1 MSB+=(LSB&0xf0)>>4; //获得温度值整数部分
274 1 LSB=(LSB&0x0f) ? 5:0; //获得温度值小数部分
275 1 return (MSB*10+LSB);
276 1 }
277
278
279 void main(void)
280 {
281 1
282 1 LCD_system_Init ();
283 1
284 1 DS1820_system_Init();
285 1
286 1 while(1)
287 1 {
288 2 buffer[0]=disp_number[get_temperature_0_DS1820()/100];
289 2 buffer[1]=disp_number[get_temperature_0_DS1820()/10%10];
290 2 buffer[2]=disp_number[pot];
291 2 buffer[3]=disp_number[get_temperature_0_DS1820()%10];
292 2
293 2 buffer[7]=disp_number[get_temperature_1_DS1820()/100];
294 2 buffer[8]=disp_number[get_temperature_1_DS1820()/10%10];
295 2 buffer[9]=disp_number[pot];
296 2 buffer[10]=disp_number[get_temperature_1_DS1820()%10];
297 2
298 2
299 2
300 2 LCD_display(0,0,disp);
301 2 LCD_display(1,2,buffer);
302 2 }
303 1 }
C51 COMPILER V7.50 TWO_DS1820_LCD_WRITE 08/11/2005 20:24:45 PAGE 6
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 765 ----
CONSTANT SIZE = 173 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 64 4
IDATA SIZE = ---- ----
BIT SIZE = ---- 3
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -