📄 18b20.lst
字号:
C51 COMPILER V7.50 18B20 07/17/2008 13:04:26 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE 18B20
OBJECT MODULE PLACED IN 18b20.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE 18b20.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "reg52.h"
2
3 #include"intrins.h"
4 #define uch unsigned char //给unsigned char起别名 uch
5
6 #define NOP() _nop_ ()
7 bit read_flag=0;
8 sbit BEEP=P1^3;
9 sbit relay=P1^2;
10 sbit clk=P1^0;
11 sbit din=P1^1;
12 sbit DQ=P2^0;
13 unsigned char code ledcode[]={0x11,0x7D,0x23,0x29,0x4D, 0x89,0x81,0x3D,0x01,0x09,0x05,\
14 0xc1,0x8f,0x61,0x83,0x87}; //数码管段码
15
16
17 //实验目的:熟悉DS18B20的使用
18 //4位数码管显示温度结果,其中整数部分2位,小数部分2位
19 //每次按下RB0键后进行一次温度转换。
20 //硬件要求:把DS18B20插在18B20插座上
21 // 拨码开关S10第1位置ON,其他位置OFF
22 // 拨码开关S5、S6全部置ON,其他拨码开关全部置OFF
23
24
25
26
27 unsigned char TLV=0 ; //采集到的温度高8位
28 unsigned char THV=0; //采集到的温度低8位
29 unsigned char TZ=0; //转换后的温度值整数部分
30 unsigned char TX=0; //转换后的温度值小数部分
31 unsigned int wd; //转换后的温度值BCD码形式
32
33 unsigned char shi; //整数十位
34 unsigned char ge; //整数个位
35 unsigned char shifen; //十分位
36 unsigned char baifen; //百分位
37 unsigned char qianfen; //千分位
38 unsigned char wanfen; //万分位
39
40 //------------------------------------------------
41 //延时函数
42 void delay(char x,char y)
43 {
44 1 char z;
45 1 do{
46 2 z=y;
47 2 do{;}while(--z);
48 2 }while(--x);
49 1 }
50 //其指令时间为:7+(3*(Y-1)+7)*(X-1)如果再加上函数调用的call 指令、页面设定、传递参数花掉的7 个指令。
51 //则是:14+(3*(Y-1)+7)*(X-1)。
52
53 //--------------------------------------------------
54 //结果显示函数
55
C51 COMPILER V7.50 18B20 07/17/2008 13:04:26 PAGE 2
56 //系统初始化函数
57 void leddisp(unsigned char num)
58 {
59 1 unsigned char i,k;
60 1 k=ledcode[num];
61 1 for(i=0;i<8;i++)
62 1 {
63 2 if((k&0x01)==0x01)
64 2 din=1;
65 2 else
66 2 din=0;
67 2 clk=0;
68 2 clk=1;
69 2 k>>=1;
70 2
71 2 }
72 1
73 1 }
74
75 //-----------------------------------------------
76 //复位DS18B20函数
77 void reset(void)
78 {
79 1 bit presence=1;
80 1
81 1
82 1 while(presence==1)
83 1 {
84 2 DQ=0 ; //主机拉至低电平
85 2 delay(2,70); //延时503us
86 2 DQ=1; //释放总线等电阻拉高总线,并保持15~60us
87 2 delay(2,7); //延时70us
88 2 if(DQ==1) presence=1; //没有接收到应答信号,继续复位
89 2 else presence=0; //接收到应答信号
90 2 //delay(2,60); //延时430us
91 2 delay(2,60);
92 2 }
93 1 BEEP=1;
94 1 }
95
96 //-----------------------------------------------
97 //写18b20写字节函数
98 void write_byte(uch val)
99 {
100 1 uch i;
101 1 uch temp;
102 1 for(i=8;i>0;i--)
103 1 {
104 2 temp=val&0x01; //最低位移出
105 2 DQ=0;
106 2 NOP();
107 2 NOP();
108 2 NOP();
109 2 NOP();
110 2 NOP(); //从高拉至低电平,产生写时间隙
111 2 if(temp==1) DQ=1; //如果写1,拉高电平
112 2 delay(2,7); //延时63us
113 2 DQ=1;
114 2 NOP();
115 2 NOP();
116 2 val=val>>1; //右移一位
117 2 }
C51 COMPILER V7.50 18B20 07/17/2008 13:04:26 PAGE 3
118 1 }
119
120 //------------------------------------------------
121 //18b20读字节函数
122 uch read_byte(void)
123 {
124 1 uch i;
125 1 uch value=0; //读出温度
126 1 static bit j;
127 1 for(i=8;i>0;i--)
128 1 {
129 2 value>>=1;
130 2 DQ=0;
131 2 NOP();
132 2 NOP();
133 2 NOP();
134 2 NOP();
135 2 NOP();
136 2 NOP(); //6us
137 2 DQ=1; //拉至高电平
138 2 NOP();
139 2 NOP();
140 2 NOP();
141 2 NOP();
142 2 NOP(); //4us
143 2 j=DQ;
144 2 if(j) value|=0x80;
145 2 delay(2,7); //63us
146 2 }
147 1 return(value);
148 1 }
149
150 //-------------------------------------------------
151 //启动温度转换函数
152 void get_temp()
153 {
154 1 int i;
155 1 DQ=1;
156 1 reset(); //复位等待从机应答
157 1 write_byte(0XCC); //忽略ROM匹配
158 1 write_byte(0X44); //发送温度转化命令
159 1 for(i=50;i>0;i--)
160 1 {
161 2
162 2 // display(); //调用多次显示函数,确保温度转换完成所需要的时间
163 2 }
164 1 reset(); //再次复位,等待从机应答
165 1 write_byte(0XCC); //忽略ROM匹配
166 1 write_byte(0XBE); //发送读温度命令
167 1 TLV=read_byte(); //读出温度低8
168 1 THV=read_byte(); //读出温度高8位
169 1 DQ=1; //释放总线
170 1 TZ=(TLV>>4)|(THV<<4)&0X3f; //温度整数部分
171 1 TX=TLV<<4; //温度小数部分
172 1 if(TZ>100)TZ/100; //不显示百位
*** WARNING C275 IN LINE 172 OF 18B20.C: expression with possibly no effect
173 1 ge=TZ%10;//个位 //整数部分个位
174 1 shi=TZ/10;//十位 //整数十位
175 1 wd=0;
176 1 if (TX & 0x80) wd=wd+5000;
177 1 if (TX & 0x40) wd=wd+2500;
178 1 if (TX & 0x20) wd=wd+1250;
C51 COMPILER V7.50 18B20 07/17/2008 13:04:26 PAGE 4
179 1 if (TX & 0x10) wd=wd+625; //以上4条指令把小数部分转换为BCD码形式
180 1 shifen=wd/1000; //十分位
181 1 baifen=(wd%1000)/100; //百分位
182 1 qianfen=(wd%100)/10; //千分位
183 1 wanfen=wd%10; //万分位
184 1 NOP();
185 1 NOP();
186 1 }
187
188 //--------------------------------------------------
189 //主函数
190 void main()
191 {
192 1 while(1)
193 1 {
194 2 get_temp(); //调用温度转换函数
195 2 leddisp(shi); //调用结果显示函数 ,温度十位
196 2 leddisp(ge); //温度个位
197 2 leddisp(shifen);//温度十分位
198 2 leddisp(baifen);//温度百分位
199 2 delay(200,200); //调用延时函数
200 2 delay(200,200);
201 2 delay(200,200);
202 2 delay(200,200);
203 2 }
204 1 }
205
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 449 ----
CONSTANT SIZE = 16 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 12 ----
IDATA SIZE = ---- ----
BIT SIZE = 2 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -