📄 18b20shu.lst
字号:
C51 COMPILER V8.02 18B20SHU 05/13/2009 13:23:37 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 18B20SHU
OBJECT MODULE PLACED IN 18B20SHU.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 18B20SHU.C BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "reg51.H"
2 #include "intrins.h"
3 #define DELAY5US _nop_();
4
5 sbit SDA=P1^0;
6 sbit SCL=P1^1;
7 sbit P1_7=P1^7;
8 #define WSLA1 0x70
9 #define RSLA1 0x71
10
11
12
13 sbit DQ=P3^3;
14 //*************** 函数声明 *********************
15 void STA(void);
16 void STOP(void);
17 void CACK(void);
18 void WRBYT(unsigned char *p);
19 void WRNBYT(unsigned char *R3,unsigned char *R2,unsigned char *R0,unsigned char n);
20 unsigned b[20]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe4,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0xfa,0x1e,
-0x12,0x00};
21
22 unsigned char GET_TEMPER();
23 unsigned char temp[2],temp_num;
24 void INIT_1820(); //初始化函数
25 void TEMP_COV(); //温度转换函数
26 void WRITE_1820(unsigned char datax); //写DS18B20函数
27 void READ_1820(); //读DS18B20函数
28 void DELAY60US();
29 void DELAY80US();
30 void DELAY300US();
31 void DELAY();
32 unsigned char FLAG1;
33 //*************** 主函数 *********************
34 main()
35 {
36 1 //unsigned char datay;
37 1
38 1 unsigned char a[8]={0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc};
39 1 unsigned char shu,n,*c,*y,*x,wai=0x10,WSLA=WSLA1,f4,ffh,ffl,xiaoh,xiaol;//f4是小数的二进制数
40 1 unsigned long int h=0,f,ff;
41 1 //P1=0xff;
42 1 while(1)
43 1 {
44 2 GET_TEMPER(); //采集温度函数(数据在temp[0]、temp[1]中)
45 2 TEMP_COV(); //将12位精度的数值转换成8位温度值在temp_num中
46 2 h=(unsigned long int)temp_num;
47 2 f4=temp[0]&0x0f;
48 2 f=(unsigned long int)f4;
49 2 ff=f*10000/16;
50 2 xiaoh=ff/100;
51 2 xiaol=ff%100;
52 2
53 2 shu=(unsigned char)h;
54 2 a[4]=shu%10;//a[0]为个位
C51 COMPILER V8.02 18B20SHU 05/13/2009 13:23:37 PAGE 2
55 2 a[4]=b[a[4]]+1;//将a【0】变为字符码
56 2 a[5]=shu%100;
57 2 a[5]=a[5]/10;
58 2 a[5]=b[a[5]];
59 2 a[6]=shu/100;
60 2 a[6]=b[a[6]];
61 2
62 2 ffh=(unsigned char)xiaoh;
63 2 a[2]=ffh%10;
64 2 a[2]=b[a[2]];
65 2 a[3]=ffh/10;
66 2 a[3]=b[a[3]];
67 2
68 2 ffl=(unsigned char)xiaol;
69 2 a[0]=ffl%10;
70 2 a[0]=b[a[0]];
71 2 a[1]=ffl/10;
72 2 a[1]=b[a[1]];
73 2
74 2 x=&WSLA;
75 2 c=&wai;
76 2 y=a;
77 2 n=8;
78 2 WRNBYT(x,c,y,n);
79 2 DELAY();
80 2
81 2 //datay=temp_num; //缓冲
82 2 //P1=~datay; //数据取反后送P1口输出
83 2 }
84 1 }
85
86
87
88 unsigned char GET_TEMPER()
89 { unsigned char i;
90 1 DQ=1;
91 1 BCD:INIT_1820(); //对DS18B20初始化
92 1 if(FLAG1!=1)
93 1 goto BCD; //如果18B20不存在返回继续
94 1 DELAY80US(); //存在时延时
95 1 i=0xcc; //写ROM命令(跳过序列号)
96 1 WRITE_1820(i);
97 1 i=0x44; //发送温度转换命令
98 1 WRITE_1820(i);
99 1 DELAY(); //延时等待转换
100 1 CBA:INIT_1820(); //对DS18B20初始化
101 1 if(FLAG1!=1)
102 1 goto CBA; //如果18B20不存在返回继续
103 1 DELAY80US(); //存在时延时
104 1 i=0xcc; //写ROM命令(跳过序列号)
105 1 WRITE_1820(i);
106 1 i=0xbe; //发出读温度命令
107 1 WRITE_1820(i);
108 1 READ_1820(); //READ_1820
109 1
110 1 }
*** WARNING C173 IN LINE 110 OF 18B20SHU.C: missing return-expression
111
112 void INIT_1820()
113 { DQ=1;
114 1 _nop_();
115 1 DQ=0;
C51 COMPILER V8.02 18B20SHU 05/13/2009 13:23:37 PAGE 3
116 1 DELAY300US();
117 1 DQ=1;
118 1 DELAY80US();
119 1 if(DQ!=0x01) FLAG1=0x01; //建立标志
120 1 else FLAG1=0x00;
121 1 DELAY300US();
122 1 DQ=1; //释放总线
123 1 }
124
125 void WRITE_1820(unsigned char datax)
126 { unsigned char i;
127 1 for(i=0;i<8;i++)
128 1 { //DQ=0后15US之内就应当把数据发送到DQ上
129 2 DQ=0;
130 2 _nop_();
131 2 _nop_();
132 2 _nop_();
133 2 _nop_();
134 2 _nop_();
135 2 _nop_();
136 2 _nop_();
137 2 if(datax & 0x01)DQ=1; //根据datax 组装发送位DQ
138 2 else DQ=0; //或者使用 DQ=datax&0x01;
139 2 datax=datax>>1;
140 2 DELAY60US(); //DS18B20在DQ=0的15-60us内采样DQ
141 2 DQ=1;
142 2 _nop_();
143 2 }
144 1 }
145
146 void READ_1820() //从DS18B20中连续读出两个字节温度值
147 { unsigned char i,j; //数据送temp[2]中,其中temp[0]为低8位,temp[1]为高四位
148 1 for(i=0;i<2;i++)
149 1 { temp[i]=0xff;
150 2 for(j=0;j<8;j++)
151 2 {
152 3 DQ=1;
153 3 _nop_();
154 3 DQ=0; //拉低DQ
155 3 _nop_(); //维持1US
156 3 DQ=1; //释放
157 3 _nop_(); //DQ=0后15US内主控器必须完成采样DQ
158 3 temp[i]=temp[i]>>1;
159 3 if(DQ==1) temp[i]=temp[i]|0x80;
160 3 else temp[i]=temp[i]&0x7f;
161 3 DELAY60US(); //>60US 后释放DQ
162 3 }
163 2 }
164 1 }
165
166 void TEMP_COV() //将temp[0]、temp[1]中的12位数职去掉低4位(小数)
167 {unsigned char i,j; //合并到 temp_num中
168 1 i=temp[0]&0xf0;
169 1 i=i>>4;
170 1 j=temp[1]<<4;
171 1 temp_num=i|j;
172 1 }
173
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -