📄 two_ds1820_lcd.lst
字号:
C51 COMPILER V7.09 TWO_DS1820_LCD 05/01/2005 14:03:40 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE TWO_DS1820_LCD
OBJECT MODULE PLACED IN two_DS1820_LCD.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE two_DS1820_LCD.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.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 /*--------------------------------------------------------------------------
25 DS1820.H
26
27
28 --------------------------------------------------------------------------*/
29 sbit TSOR = P2^3;
30
31 static unsigned char MSB=0,LSB=0;//温度值的整数部分,小数部分
32
33 //**********************************************************************//
34 // 延时子程序 //
35 //**********************************************************************//
36 void delay(unsigned int d)
37 {
38 1 while(d--);
39 1 }
40
41 void delay100ms(void)
42 {
43 1 unsigned char i,j,k;
44 1 for(i=0;i<8;i++)
45 1 for(j=0;j<25;j++)
46 1 for(k=0;k<250;k++);
47 1 }
48
49 void delay15us(void)
50 {
51 1 unsigned char i;
52 1 for(i=0;i<8;i++);
53 1 }
54
55 void delay60us(void)
C51 COMPILER V7.09 TWO_DS1820_LCD 05/01/2005 14:03:40 PAGE 2
56 {
57 1 unsigned char i;
58 1 for(i=0;i<30;i++);
59 1 }
60
61 void write_0_DS(void)//写 bit 0
62 {//写数据位0:置总线为低电平并保持至少15us,
63 1 //然后保持低电平15us~45us等待从端对电平采样,最后拉高电平完成写操作
64 1 TSOR=1;
65 1 TSOR=0;
66 1 delay15us();
67 1 delay15us();
68 1 delay15us();
69 1 delay15us();
70 1 delay15us();
71 1
72 1 TSOR=1;
73 1
74 1 _nop_();
75 1 _nop_();
76 1 }
77
78 void write_1_DS(void)//写 bit 1
79 {//写数据位1:置总线为低电平并保持1us~15us,
80 1 //然后拉高电平并保持15us~45us等待从端对电平采样,最后完成写操作
81 1 TSOR=1;
82 1 TSOR=0;
83 1 _nop_();
84 1 _nop_();
85 1 _nop_();
86 1 _nop_();
87 1 _nop_();
88 1 _nop_();
89 1 _nop_();
90 1
91 1 TSOR=1;
92 1
93 1 _nop_();
94 1 _nop_();
95 1 _nop_();
96 1 _nop_();
97 1 _nop_();
98 1 _nop_();
99 1 _nop_();
100 1 delay15us();
101 1 delay15us();
102 1 }
103
104
105 bit read_DS(void)//读取数据位
106 {//读数据位:置总线为低电平并保持至少1us,然后拉高电平保持1us,
107 1 //在15us内采样总线电平获得数据,延时45us完成读操作
108 1 bit b;
109 1
110 1 TSOR=1;
111 1 TSOR=0;
112 1 _nop_();
113 1 _nop_();
114 1 _nop_();
115 1
116 1 TSOR=1;
117 1
C51 COMPILER V7.09 TWO_DS1820_LCD 05/01/2005 14:03:40 PAGE 3
118 1 _nop_();
119 1 _nop_();
120 1 _nop_();
121 1
122 1 b=TSOR;
123 1
124 1 delay15us();
125 1 delay15us();
126 1 delay15us();
127 1 _nop_();
128 1 _nop_();
129 1
130 1 return b;
131 1 }
132
133 void reset_DS(void)//复位总线
134 {//总线复位:置总线为低电平并保持480us,然后拉高电平,
135 1 //等待从端重新拉低电平作为响应,则总线复位完成
136 1 unsigned char i;
137 1
138 1 TSOR=1;
139 1 TSOR=0;
140 1 for(i=0;i<9;i++)
141 1 delay60us();
142 1 TSOR=1;
143 1
144 1 while(TSOR);//程序的关键,总线控制器发出(TX)一个复位脉冲(一个最少480us的
145 1 //低电平信号),然后释放总线,进入接收状态(RX)。单线总线由4.7K上拉电阻拉到
146 1 //到高电平。探测到I/0引脚上的上升沿后,DS182015等待15~60us,然后发出存在脉冲
147 1 //(一个60~240us的低电平信号。
148 1
149 1 for(i=0;i<3;i++)
150 1 delay60us();
151 1 }
152
153 void write_byte_DS(unsigned char byte)//写一个字节(byte)
154 {
155 1 unsigned char i;
156 1 for(i=0;i<8;i++)
157 1 {
158 2 if(byte & 0x01==0x01) //最低bit是否为0?
159 2 write_1_DS();
160 2 else
161 2 write_0_DS();
162 2 byte=byte>>1;
163 2 }
164 1 }
165
166 unsigned char read_byte_DS(void) //读一个字节(byte)
167 {
168 1 unsigned char i,j=0;
169 1 bit b;
170 1
171 1 for(i=0;i<8;i++)
172 1 {
173 2 b=read_DS(); //读取1bit
174 2 if(b) //为1否?
175 2 j+=1;
176 2 j=_cror_(j,1); //循环右移1位
177 2 }
178 1 return j;
179 1 }
C51 COMPILER V7.09 TWO_DS1820_LCD 05/01/2005 14:03:40 PAGE 4
180
181 void DS1820_system_Init(void)
182 {
183 1 reset_DS(); //复位总线
184 1 write_byte_DS(0xcc); //忽略ROM匹配操作
185 1 write_byte_DS(0x4e); //设置写模式
186 1 write_byte_DS(0x64); //写温度上限TH为100度
187 1 write_byte_DS(0x8a); //写温度下限为负10度
188 1 write_byte_DS(0x1f); //写温度计配置寄存器
189 1 }
190
191
192 int get_temperature_DS1820(void) //获得温度,2字节的数据分别放在MSB,LSB中
193 {
194 1 unsigned char i;
195 1 reset_DS(); //复位总线
196 1 write_byte_DS(0x55); //ROM匹配操作
197 1
198 1 write_byte_DS(0x28);
199 1 write_byte_DS(0x50);
200 1 write_byte_DS(0xe2);
201 1 write_byte_DS(0x84);
202 1 write_byte_DS(0x00);
203 1 write_byte_DS(0x00);
204 1 write_byte_DS(0x00);
205 1 write_byte_DS(0xbe);
206 1 /*
207 1 temp[0]=read_byte_DS(); //读取第1字节
208 1 temp[1]=read_byte_DS(); //读取第2字节
209 1 temp[2]=read_byte_DS(); //读取第3字节
210 1 temp[3]=read_byte_DS(); //读取第4字节
211 1 temp[4]=read_byte_DS(); //读取第5字节
212 1 temp[5]=read_byte_DS(); //读取第6字节
213 1 temp[6]=read_byte_DS(); //读取第7字节
214 1 temp[7]=read_byte_DS(); //读取第8字节
215 1 */
216 1 for(i=0;i<8;i++)
217 1 {
218 2 buffer[5]=disp_number[temp[i]/100];
219 2 buffer[6]=disp_number[temp[i]/10%10];
220 2 buffer[7]=disp_number[temp[i]%10];
221 2 buffer[0]=disp_number[i+1];
222 2
223 2 LCD_display(0,0,disp);
224 2 LCD_display(1,0,buffer);
225 2 delay(60000);
226 2 delay(60000);
227 2 delay(60000);
228 2
229 2 }
230 1 //return (MSB);
231 1 }
232
233
234 void main(void)
235 {
236 1
237 1 LCD_system_Init ();
238 1
239 1 DS1820_system_Init();
240 1
241 1 while(1)
C51 COMPILER V7.09 TWO_DS1820_LCD 05/01/2005 14:03:40 PAGE 5
242 1 {
243 2 get_temperature_DS1820();
244 2 }
245 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 579 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 60 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 + -