📄 9 ds18b20.lst
字号:
C51 COMPILER V8.08 9_DS18B20 10/28/2008 12:22:28 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE 9_DS18B20
OBJECT MODULE PLACED IN 9 DS18B20.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 9 DS18B20.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //安装目录下的 EXE 文件,通过串口线连接计算机与实验板,打开
2 //软件后可在软件界面上显示当前温度值。
3 #include <reg52.h>
4 #define uchar unsigned char
5 #define uint unsigned int
6 sbit DS=P2^2; //define interface 定义 DS18B20 接口
7 uint temp; // variable of temperature
8 uchar flag1; // sign of the result positive or negative
9 sbit dula=P2^6;
10 sbit wela=P2^7;
11 unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
12 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//不带小数点编码。
13 unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
14 0x87,0xff,0xef}; // 带小数点编码。
15 void delay(uint count) //延时子函数
16 {
17 1 uint i;
18 1 while(count)
19 1 {
20 2 i=200;
21 2 while(i>0)
22 2 i--;
23 2 count--;
24 2 }
25 1 }
26 ///////功能:串口初始化,波特率 9600,方式 1///////
27 void Init_Com(void)
28 {
29 1 TMOD = 0x20;
30 1 PCON = 0x00;
31 1 SCON = 0x50;
32 1 TH1 = 0xFd;
33 1 TL1 = 0xFd;
34 1 TR1 = 1;
35 1 }
36
37 void dsreset(void) //发送初始化及复位信号
38 {
39 1 uint i; //DS18B20 初始化
40 1 DS=0;
41 1 i=103;
42 1 while(i>0)i--;
43 1 DS=1;
44 1 i=4;
45 1 while(i>0)i--;
46 1 }
47
48 bit tmpreadbit(void) //read a bit 读一位
49 {
50 1 uint i;
51 1 bit dat;
52 1 DS=0;i++; //i++ for delay 小延时一下
53 1 DS=1;i++;i++;
54 1 dat=DS;
55 1 i=8;while(i>0)i--;
C51 COMPILER V8.08 9_DS18B20 10/28/2008 12:22:28 PAGE 2
56 1 return (dat);
57 1 }
58
59 uchar tmpread(void) //read a byte date 读一个字节
60 {
61 1 uchar i,j,dat;
62 1 dat=0;
63 1 for(i=1;i<=8;i++)
64 1 {
65 2 j=tmpreadbit();
66 2 dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好//一个字节在 DAT 里
67 2 }
68 1 return(dat); //将一个字节数据返回
69 1 }
70
71 void tmpwritebyte(uchar dat) //write a byte to ds18b20
72 { //写一个字节到 DS18B20 里
73 1 uint i;
74 1 uchar j;
75 1 bit testb;
76 1 for(j=1;j<=8;j++)
77 1 {
78 2 testb=dat&0x01;
79 2 dat=dat>>1;
80 2 if(testb) //write 1 写 1 部分
81 2 {
82 3 DS=0;
83 3 i++;i++;
84 3 DS=1;
85 3 i=8;while(i>0)i--;
86 3 }
87 2 else
88 2 {
89 3 DS=0; //write 0 写 0 部分
90 3 i=8;while(i>0)i--;
91 3 DS=1;
92 3 i++;i++;
93 3 }
94 2 }
95 1 }
96
97 void tmpchange(void) //DS18B20 begin change 发送温度转换命令
98 {
99 1 dsreset(); //初始化 DS18B20
100 1 delay(1); //延时
101 1 tmpwritebyte(0xcc); // 跳过序列号命令
102 1 tmpwritebyte(0x44); //发送温度转换命令
103 1 }
104 uint tmp() //get the temperature 获得温度
105 {
106 1 float tt;
107 1 uchar a,b;
108 1 dsreset();
109 1 delay(1);
110 1 tmpwritebyte(0xcc);
111 1 tmpwritebyte(0xbe); //发送读取数据命令
112 1 a=tmpread(); //连续读两个字节数据
113 1 b=tmpread();
114 1 temp=b;
115 1 temp<<=8; //two byte compose a int variable
116 1 temp=temp|a; //两字节合成一个整型变量。
117 1 tt=temp*0.0625; //得到真实十进制温度值,因为 DS18B20
C51 COMPILER V8.08 9_DS18B20 10/28/2008 12:22:28 PAGE 3
118 1 //可以精确到 0.0625 度,所以读回数据的最低位代表的是
119 1 //0.0625 度。
120 1 temp=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位
121 1 //也转换为可显示数字,同时进行一个四舍五入操作。
122 1 return temp; //返回温度值
123 1 }
124 /*
125 void readrom() //read the serial 读取温度传感器的序列号
126 { //本程序中没有用到此函数
127 uchar sn1,sn2;
128 dsreset();
129 delay(1);
130 tmpwritebyte(0x33);
131 sn1=tmpread();
132 sn2=tmpread();
133 }
134 */
135 void display(uint temp) //显示程序
136 {
137 1 uchar A1,A2,A2t,A3,ser;
138 1 ser=temp/10; //分离出三位要显示的数字
139 1 SBUF=ser;
140 1 A1=temp/100;
141 1 A2t=temp%100;
142 1 A2=A2t/10;
143 1 A3=A2t%10;
144 1 dula=0;
145 1
146 1 P0=table[A1]; //显示百位
147 1 dula=1;
148 1 dula=0;
149 1 wela=0;
150 1 P0=0x7e;
151 1 wela=1;
152 1 wela=0;
153 1 delay(2);
154 1
155 1 P0=0; //------------
156 1 dula=1; //该部分仿真必须要。
157 1 dula=0; //因为每次下一位的段选打开后,码值会先赋值给上一位,
158 1 P0=0x7e; //从而改变上一位的显示。然后再打开下一位的位选。
159 1 wela=1; //
160 1 wela=0; //------------
161 1
162 1 //dula=0;
163 1 P0=table1[A2]; //显示十位 带小数点的
164 1 dula=1;
165 1 dula=0;
166 1 wela=0;
167 1 P0=0x7d;
168 1 wela=1;
169 1 wela=0;
170 1 delay(2); //延时改为2 仿真需要
171 1
172 1 P0=0; //------------
173 1 dula=1; //该部分仿真需要
174 1 dula=0; //
175 1 P0=0x7d; //
176 1 wela=1; //
177 1 wela=0; //-------------
178 1
179 1 P0=table[A3]; //显示个位
C51 COMPILER V8.08 9_DS18B20 10/28/2008 12:22:28 PAGE 4
180 1 dula=1;
181 1 dula=0;
182 1 P0=0x7b;
183 1 wela=1;
184 1 wela=0;
185 1 delay(2);
186 1
187 1 P0=0; //------------
188 1 dula=1; //该部分仿真需要
189 1 dula=0; //
190 1 P0=0x7b; //
191 1 wela=1; //
192 1 wela=0; //-------------
193 1 }
194 void main() //主函数
195 {
196 1 uchar a;
197 1 Init_Com(); //初始化串口
198 1 do
199 1 {
200 2 tmpchange(); //温度转换
201 2 for(a=20;a>0;a--)
202 2 {
203 3 display(tmp()); //显示十次
204 3 }
205 2 }
206 1 while(1);
207 1 }
208
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 516 ----
CONSTANT SIZE = 26 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 6
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -