📄 ds18b20温度计.lst
字号:
C51 COMPILER V7.10 DS18B20温度计 07/14/2008 16:08:41 PAGE 1
C51 COMPILER V7.10, COMPILATION OF MODULE DS18B20温度计
OBJECT MODULE PLACED IN DS18B20温度计.OBJ
COMPILER INVOKED BY: C:\Keil\C51\Bin\c51.exe DS18B20温度计.C DB SB OE ROM(LARGE) SMALL OT(6,SPEED) WL(2) RB(0)
line level source
1 //DS18B20温度计
2 #include "reg51.h"
3 #include "intrins.h"
4 #define Disdata P1
5 #define discan P3
6 #define uchar unsigned char
7 #define uint unsigned int
8 sbit DQ=P3^7;
9 sbit DIN=P1^7;
10 uint h;
11 //温度小数部分查表
12 uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
13 uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
14 uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7};
15 uchar data temp_data[2]={0x00,0x00};
16 uchar data display[5]={0x00,0x00,0x00,0x00,0x00};
17 //11US延时函数
18 void delay(uint t)
19 {
20 1 for(;t>0;t--);
21 1 }
22 //显示扫描函数
23 scan()
24 {
25 1 char k;
26 1 for(k=0;k<4;k++)
27 1 {
28 2 Disdata=dis_7[display[k]];
29 2 if(k==1){DIN=0;}
30 2 discan=scan_con[k];
31 2 delay(90);
32 2 discan=0xff;
33 2 }
34 1 }
35 //DS18B20复位函数
36 ow_reset(void)
37 {
38 1 char presence=1;
39 1 while(presence)
40 1 {
41 2 while(presence)
42 2 {
43 3 DQ=1;_nop_();_nop_();
44 3 DQ=0;
45 3 delay(50);
46 3 DQ=1;
47 3 delay(6);
48 3 presence=DQ;
49 3 }
50 2 delay(45);
51 2 presence=~DQ;
52 2 }
53 1 DQ=1;
54 1 }
55 //DS18B20写命令函数
C51 COMPILER V7.10 DS18B20温度计 07/14/2008 16:08:41 PAGE 2
56 void write_byte(uchar val)
57 {
58 1 uchar i;
59 1 for(i=8;i>0;i--)
60 1 {
61 2 DQ=1;_nop_();_nop_();
62 2 DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();
63 2 DQ=val&0x01;
64 2 delay(6);
65 2 val=val/2;
66 2 }
67 1 DQ=1;
68 1 delay(1);
69 1 }
70 //DS18B20读1字节函数
71 uchar read_byte(void)
72 {
73 1 uchar i;
74 1 uchar value=0;
75 1 for(i=8;i>0;i--)
76 1 {
77 2 DQ=1;_nop_();_nop_();
78 2 value>>=1;
79 2 DQ=0;
80 2 _nop_();_nop_();_nop_();_nop_();
81 2 DQ=1;_nop_();_nop_();_nop_();_nop_();
82 2 if(DQ)value|=0x80;
83 2 delay(6);
84 2 }
85 1 DQ=1;
86 1 return(value);
87 1 }
88 //
89 read_temp()
90 {
91 1 ow_reset();
92 1 write_byte(0xcc);
93 1 write_byte(0xbe);
94 1 temp_data[0]=read_byte();
95 1 temp_data[1]=read_byte();
96 1 ow_reset();
97 1 write_byte(0xcc);
98 1 write_byte(0x44);
99 1 }
100 //温度数据处理函数
101 work_temp()
102 {
103 1 uchar n=0;
104 1 if(temp_data[1]>127)
105 1 {temp_data[1]=(256-temp_data[1]);
106 2 temp_data[0]=(256-temp_data[0]);n=1;}
107 1 display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]];
108 1 display[4]=((temp_data[0]&0xf0) >> 4)|((temp_data[1]&0x0f)<<4);
109 1 display[3]=display[4] / 100;
110 1 display[1]=display[4] % 100;
111 1 display[2]=display[1] / 10;
112 1 display[1]=display[1] % 10;
113 1 if(!display[3]){display[3]=0x0a;if(!display[2]){display[2]=0x0a;}}
114 1 if(n){display[3]=0x0b;}
115 1 }
116 //主函数
117 main()
C51 COMPILER V7.10 DS18B20温度计 07/14/2008 16:08:41 PAGE 3
118 {
119 1 Disdata=0xff;
120 1 discan=0xff;
121 1 for(h=0;h<4;h++){display[h]=8;}
122 1 ow_reset();
123 1 write_byte(0xcc);
124 1 write_byte(0x44);
125 1 for(h=0;h<500;h++)
126 1 {scan();}
127 1 while(1)
128 1 {
129 2 read_temp();
130 2 work_temp();
131 2 for(h=0;h<500;h++)
132 2 {scan();}
133 2 }
134 1 }
135 //结束
C51 COMPILER V7.10 DS18B20温度计 07/14/2008 16:08:41 PAGE 4
NAME CLASS MSPACE TYPE OFFSET SIZE
==== ===== ====== ==== ====== ====
P1 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0090H 1
P3 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00B0H 1
ditab. . . . . . . . . . . . . . . . . PUBLIC CODE ARRAY 0000H 16
DQ . . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 00B7H 1
_write_byte. . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
val. . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0005H 1
i. . . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0003H 1
main . . . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
scan . . . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
k. . . . . . . . . . . . . . . . . . * REG * DATA CHAR 0005H 1
read_byte. . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
i. . . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0004H 1
value. . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0005H 1
temp_data. . . . . . . . . . . . . . . PUBLIC DATA ARRAY 0000H 2
read_temp. . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
scan_con . . . . . . . . . . . . . . . PUBLIC CODE ARRAY 001CH 4
dis_7. . . . . . . . . . . . . . . . . PUBLIC CODE ARRAY 0010H 12
DIN. . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 0097H 1
work_temp. . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
n. . . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0007H 1
h. . . . . . . . . . . . . . . . . . . PUBLIC DATA U_INT 0002H 2
ow_reset . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
presence . . . . . . . . . . . . . . * REG * DATA CHAR 0005H 1
_delay . . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
t. . . . . . . . . . . . . . . . . . * REG * DATA U_INT 0006H 2
display. . . . . . . . . . . . . . . . PUBLIC DATA ARRAY 0004H 5
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 459 ----
CONSTANT SIZE = 32 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 9 ----
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 + -