📄 db18b20.lst
字号:
C51 COMPILER V8.08 DB18B20 12/18/2007 20:49:08 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE DB18B20
OBJECT MODULE PLACED IN db18b20.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE db18b20.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /* MCU:89C4051 P1.0,P1.1接10K左右上拉电阻,晶振11.0592M
2
3
4 /* sbit DQ=P3^7; 89C4051的11脚接DS18B20 */
5
6 #include <reg52.h>
7 #include <stdio.h>
8 #include <intrins.h>
9
10 #define uchar unsigned char
11 #define uint unsigned int
12 #define _Nop() _nop_();
13 #define Disdata P1 //段码输出口
14 #define Discan P3 //扫描口
15
16 uint h;
17
18
19 uint temp;
20 sbit DQ=P3^7;
21 sbit DIN=P1^7;
22
23 //********温度小数部分用查表法*******//
24 uchar code ditab[16]=
25 {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
26
27 uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
28 ////*共阳LED段码表 0 1 2 3 4 5 6 7 8 9 不亮 - */
29 uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; //列扫描控制字
30 uchar data temp_data[2]={0x00,0x00}; //读出温度暂放
31 uchar display[5]={0x08,0x08,0x08,0x0b,0x00};//显示单元数据,共4个数据,一个运算暂存用
32
33 /***************11us延时函数******************/
34 //--------------------------------------------------------------------------------------------------
35 // 函数名称: delay
36 // 入口参数: N
37 // 函数功能:延时子程序,实现(16*N+24)us的延时
38 // 系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动
39 //--------------------------------------------------------------------------------------------------
40 void delay(uint t)
41 {
42 1 int i;
43 1 for(i=0;i<t;i++);
44 1 }
45
46 /******************显示扫描函数******************/
47 scan()
48 {
49 1 char k;
50 1 for(k=0;k<4;k++) //4位LED扫描控制
51 1 {
52 2 Disdata=dis_7[display[k]];
53 2 if(k==1) {DIN=0;}
54 2 Discan=scan_con[k];delay(120);Discan=0xff;
55 2 }
C51 COMPILER V8.08 DB18B20 12/18/2007 20:49:08 PAGE 2
56 1 }
57 /*************DS18B20复位函数*****************/
58
59 uchar ow_reset(void)
60 {
61 1
62 1 uchar deceive_ready;
63 1 DQ=0; //拉低DQ线
64 1 delay(35); //延时至少480us~960us(471uS)
65 1 DQ=1; //将DQ线设置位逻辑高
66 1 delay(3); //延时等待deceive_ready响应 (54uS)
67 1 deceive_ready=DQ; //采样deceive_ready信号
68 1 delay(25); //等待时序结束 (340uS)
69 1 return(deceive_ready); //有deceive_ready信号时返回0,否则返回1
70 1 }
71
72 /************DS18B20写命令函数******************/
73 //--------------------------------------------------------------------------------------------------
74 // 函数名称: write_bit
75 // 入口参数: bitval
76 // 函数功能:写一个bit子程序
77 //--------------------------------------------------------------------------------------------------
78 void write_bit(unsigned char bitval)
79 {
80 1 DQ=0; //拉低DQ线开始时序
81 1 if(bitval==1)
82 1 DQ=1; //如果写逻辑为高
83 1 delay(5); //延时 (80uS)
84 1 DQ=1; //升高DQ线
85 1 }
86 //向1-WIRE总线上写1个字节
87
88 void write_byte(uchar val)
89 {
90 1 uchar i,temp;
91 1 for(i=0;i<8;i++)
92 1 {
93 2 temp=val>>i; //将val位右移i位赋值给比temp
94 2 temp=temp&0x01; //取temp最低位
95 2 write_bit(temp);
96 2 delay(5); //延时至时序结束 (80uS)
97 2 }
98 1 }
99
100
101 /************DS18B20读命令函数******************/
102 //--------------------------------------------------------------------------------------------------
103 // 函数名称:read_bit
104 // 入口参数: 无
105 // 返回接收的数据
106 // 函数功能:读一个bit子程序
107 //--------------------------------------------------------------------------------------------------
108 unsigned char read_bit(void)
109 {
110 1 unsigned char i;
111 1 DQ=0; //拉低DQ线开始时序
112 1 DQ=1; //升高DQ线
113 1 for(i=0;i<3;i++); //延时至时序开始15us
114 1 return(DQ); //返回DQ值
115 1 }
116 //--------------------------------------------------------------------------------------------------
117 // 函数名称: read_byte
C51 COMPILER V8.08 DB18B20 12/18/2007 20:49:08 PAGE 3
118 // 返回接收的数据 value
119 // 函数功能:读一个byte子程序
120 //--------------------------------------------------------------------------------------------------
121 unsigned char read_byte(void)
122 {unsigned char i,m,receive_data;
123 1 m=1;receive_data=0; //初始化
124 1 for(i=0;i<8;i++)
125 1 {
126 2 if(read_bit())
127 2 {
128 3 receive_data=receive_data+(m<<i);
129 3 } //每读一位数据据,左移一位
130 2 delay(6); //延时至时序结束 (93uS)
131 2 }
132 1 return(receive_data); //返回value
133 1 }
134
135 /*******************读出温度函数******************/
136
137 read_temp()
138 {
139 1 ow_reset(); //总线复位
140 1 write_byte(0xCC); //发出跳过ROM命令
141 1 write_byte(0xBE); //发读命令
142 1 temp_data[0]=read_byte(); //温度低8位
143 1 temp_data[1]=read_byte(); //温度高8位
144 1 ow_reset(); //总线复位 */
145 1 write_byte(0xCC); //发出跳过ROM命令
146 1 write_byte(0x44); //发转换命令
147 1 }
148
149 /*****************温度处理函数******************/
150
151 work_temp()
152 {
153 1 uchar n=0;
154 1 if(temp_data[1]>127)
155 1 {temp_data[1]=(~temp_data[1]);temp_data[0]=((~temp_data[0])+1);n=1;}
156 1 //temp_data[0]=0x91; temp_data[1]=0x01; */
157 1 //temp=temp_data[0]&0x0f; //作为暂存
158 1 //display[0]=ditab[temp]; //小数部分查表法
159 1 //temp=((temp_data[0]>>4)|((temp_data[1]&0x07)<<4));
160 1 temp=(temp_data[0]>>4)|((temp_data[1]&0x07)<<4);
161 1 display[3]=temp/100; //百位
162 1 display[2]=temp%100/10; //十位
163 1 display[1]=temp%10; //个位
164 1 temp=(temp_data[0]&0x0f)*625;
165 1 display[0]=temp/1000; //小数
166 1
167 1
168 1 if(n) //温度为负数
169 1 {
170 2 if(!display[2]) //十位为0
171 2 {
172 3 display[3]=0x0a; //百位不显示
173 3 display[2]=0x0b; // 十位显示负号
174 3 }
175 2 else
176 2 display[3]=0x0b; //否则百位上显负号
177 2 }
178 1 else //温度为正数
179 1 {
C51 COMPILER V8.08 DB18B20 12/18/2007 20:49:08 PAGE 4
180 2 if(!display[3]) //百位为0
181 2 {
182 3 display[3]=0x0a; //dis_7[display[3]]=dis_7[10]=0xFF,为不显示
183 3 if(!display[2]) //十位为0
184 3 {
185 4 display[2]=0x0a; //十位不显示
186 4 }
187 3 }
188 2 }
189 1 }
190
191 /**************************************/
192 /* 主函数 */
193 /**************************************/
194
195 main()
196 {
197 1 Disdata=0xff;
198 1 Discan=0xff;
199 1
200 1 ow_reset(); //开机复位
201 1 write_byte(0xCC); //跳过ROM
202 1 write_byte(0x44); //发出转换命令
203 1
204 1 for(h=0;h<150;h++) //开机显示2秒的“8888”
205 1 {
206 2 scan();
207 2 }
208 1
209 1 while(1)
210 1 {
211 2 read_temp(); //读出DS18B20温度数据
212 2 work_temp(); //处理温度数据
213 2 scan(); //调用显示子程序
214 2 }
215 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 438 ----
CONSTANT SIZE = 32 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 11 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -