📄 18b20.lst
字号:
C51 COMPILER V9.00 18B20 08/23/2011 20:26:37 PAGE 1
C51 COMPILER V9.00, COMPILATION OF MODULE 18B20
OBJECT MODULE PLACED IN 18b20.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 18b20.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg52.h>
2 #include <intrins.h>
3 #define uint unsigned int
4 #define uchar unsigned char
5 sbit DS=P3^4;
6 sbit a=P1^0;
7 sbit b=P1^1;
8 sbit c=P1^2;
9 int temp;
10 uchar code t[]={0x3f,0x06,0x5b,0x4f,0x66,
11 0x6d,0x7d,0x07,0x7f,0x6f,0x39};
12 uchar code t1[]={0xbf,0x86,0xdb,0xcf,0xe6,
13 0xed,0xfd,0x87,0xff,0xef};
14 void delayb(uchar z)
15 {
16 1 uint i;
17 1 while(z)
18 1 {
19 2 i=200;
20 2 while(i>0)i--;
21 2 z--;
22 2 }
23 1
24 1 }
25 void delay(uint k)
26 {
27 1 uint i;
28 1 for(;k>0;k--)
29 1 for(i=110;i>0;i--);
30 1 }
31 void dsreset(void) //DS18B20初始化
32 {
33 1 uint i;
34 1 DS=0;
35 1 i=103;
36 1 while(i>0)i--;
37 1 DS=1;
38 1 i=4;
39 1 while(i>0)i--;
40 1 }
41 bit tmpreadbit(void) // 读一位
42 {
43 1 uint i;
44 1 bit dat;
45 1 DS=0;i++; //小延时一下
46 1 DS=1;i++;i++;
47 1 dat=DS;
48 1 i=8;while(i>0)i--;
49 1 return (dat);
50 1 }
51 uchar tmpread(void) //读一个字节
52 {
53 1 uchar i,j,dat;
54 1 dat=0;
55 1 for(i=1;i<=8;i++)
C51 COMPILER V9.00 18B20 08/23/2011 20:26:37 PAGE 2
56 1 {
57 2 j=tmpreadbit();
58 2 dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT
59 2 }
60 1 return(dat); //将一个字节数据返回
61 1 }
62 void tmpwritebyte(uchar dat)
63 { //写一个字节到DS18B20里
64 1 uint i;
65 1 uchar j;
66 1 bit testb;
67 1 for(j=1;j<=8;j++)
68 1 {
69 2 testb=dat&0x01;
70 2 dat=dat>>1;
71 2 if(testb) // 写1部分
72 2 {
73 3 DS=0;
74 3 i++;i++;
75 3 DS=1;
76 3 i=8;while(i>0)i--;
77 3 }
78 2 else
79 2 {
80 3 DS=0; //写0部分
81 3 i=8;while(i>0)i--;
82 3 DS=1;
83 3 i++;i++;
84 3 }
85 2 }
86 1 }
87 void tmpchange(void) //发送温度转换命令
88 {
89 1 dsreset(); //初始化DS18B20
90 1 delayb(1); //延时
91 1 tmpwritebyte(0xcc); // 跳过序列号命令
92 1 tmpwritebyte(0x44); //发送温度转换命令
93 1 }
94 int tmp() //获得温度
95 {
96 1 float tt;
97 1 uchar a,b;
98 1 dsreset();
99 1 delayb(1);
100 1 tmpwritebyte(0xcc);
101 1 tmpwritebyte(0xbe); //发送读取数据命令
102 1 a=tmpread(); //连续读两个字节数据
103 1 b=tmpread();
104 1 temp=b;
105 1 temp<<=8;
106 1 temp=temp|a; //两字节合成一个整型变量。
107 1 tt=temp*0.0625; //得到真实十进制温度值,因为DS18B20
108 1 //可以精确到0.0625度,所以读回数据的最低位代表的是
109 1 temp=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位
110 1 //也转换为可显示数字,同时进行一个四舍五入操作。
111 1 return temp; //返回温度值
112 1 }
113 void HC138(uchar i)
114 {
115 1 a=i&0x01;
116 1 b=i&0x02;
117 1 c=i&0x04;
C51 COMPILER V9.00 18B20 08/23/2011 20:26:37 PAGE 3
118 1 }
119 void display(uint num)
120 {
121 1 uchar ge,shi,bai;
122 1 bai=num/100;
123 1 shi=num%100/10;
124 1 ge=num%10;
125 1 HC138(0);
126 1 P2=t[ge];
127 1 delay(3);
128 1 HC138(1);
129 1 P2=t1[shi];
130 1 delay(3);
131 1 HC138(2);
132 1 P2=t[bai];
133 1 delay(3);
134 1
135 1 }
136 void main()
137 {
138 1 int tem;
139 1 while(1)
140 1 {
141 2 tmpchange();
142 2 tem=tmp();
143 2 display(tem);
144 2 }
145 1 }
146
147
148
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 463 ----
CONSTANT SIZE = 21 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 8
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 + -