?? 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 //*************** 函數(shù)聲明 *********************
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(); //初始化函數(shù)
25 void TEMP_COV(); //溫度轉(zhuǎn)換函數(shù)
26 void WRITE_1820(unsigned char datax); //寫DS18B20函數(shù)
27 void READ_1820(); //讀DS18B20函數(shù)
28 void DELAY60US();
29 void DELAY80US();
30 void DELAY300US();
31 void DELAY();
32 unsigned char FLAG1;
33 //*************** 主函數(shù) *********************
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是小數(shù)的二進制數(shù)
40 1 unsigned long int h=0,f,ff;
41 1 //P1=0xff;
42 1 while(1)
43 1 {
44 2 GET_TEMPER(); //采集溫度函數(shù)(數(shù)據(jù)在temp[0]、temp[1]中)
45 2 TEMP_COV(); //將12位精度的數(shù)值轉(zhuǎn)換成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】變?yōu)樽址a
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; //數(shù)據(jù)取反后送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不存在返回繼續(xù)
94 1 DELAY80US(); //存在時延時
95 1 i=0xcc; //寫ROM命令(跳過序列號)
96 1 WRITE_1820(i);
97 1 i=0x44; //發(fā)送溫度轉(zhuǎn)換命令
98 1 WRITE_1820(i);
99 1 DELAY(); //延時等待轉(zhuǎn)換
100 1 CBA:INIT_1820(); //對DS18B20初始化
101 1 if(FLAG1!=1)
102 1 goto CBA; //如果18B20不存在返回繼續(xù)
103 1 DELAY80US(); //存在時延時
104 1 i=0xcc; //寫ROM命令(跳過序列號)
105 1 WRITE_1820(i);
106 1 i=0xbe; //發(fā)出讀溫度命令
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之內(nèi)就應(yīng)當把數(shù)據(jù)發(fā)送到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; //根據(jù)datax 組裝發(fā)送位DQ
138 2 else DQ=0; //或者使用 DQ=datax&0x01;
139 2 datax=datax>>1;
140 2 DELAY60US(); //DS18B20在DQ=0的15-60us內(nèi)采樣DQ
141 2 DQ=1;
142 2 _nop_();
143 2 }
144 1 }
145
146 void READ_1820() //從DS18B20中連續(xù)讀出兩個字節(jié)溫度值
147 { unsigned char i,j; //數(shù)據(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內(nèi)主控器必須完成采樣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位數(shù)職去掉低4位(小數(shù))
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 + -