?? ds18b20.lst
字號:
C51 COMPILER V8.02 DS18B20 04/24/2007 17:29:57 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN ds18b20.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE ds18b20.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "main.h"
2 //#include "reg52.h"
3
4 unsigned char Temperature_Lsm;
5 unsigned char Temperature_Msm;
6 sbit P1_0=P1^0;
7 float Temperature_Buffer; // 溫度值的變量;
8 unsigned char Flag=0; // 結(jié)果為負和正的標志位。
9
10
11
12 void Delay (unsigned int count)
13 {
14 1 unsigned int i;
15 1 while (count)
16 1 {
17 2 i =200;
18 2 while (i>0)
19 2 i--;
20 2 count--;
21 2 }
22 1 }
23
24
25
26 float Data_Process(unsigned char H_Temperature,unsigned char L_Temperature)
27 {
28 1 unsigned char i;
29 1 unsigned char Temper;
30 1 float Buffer_Float=0.0;
31 1
32 1 Flag=H_Temperature&0x08; //若最高位為1則為負溫
33 1 if(Flag)
34 1 {
35 2 H_Temperature=~H_Temperature+1; //如果為負溫則取原碼 /*采集的數(shù)據(jù)是用補碼表示的*/
36 2 L_Temperature=~L_Temperature+1; //如果為負溫則取原碼 /*采集的數(shù)據(jù)是用補碼表示的*/
37 2 }
38 1 else
39 1 {
40 2 H_Temperature=H_Temperature; //如果為正溫則保持
41 2 L_Temperature=L_Temperature; //如果為正溫則保持
42 2 }
43 1 Temper=L_Temperature;
44 1
45 1 for(i=0;i<4;i++)
46 1 {
47 2 if(Temper&0x01)
48 2 {
49 3 Buffer_Float=Buffer_Float+(1.0/(1<<(4-i))); //計算小數(shù)值
50 3 Temper>>=1;
51 3 }
52 2 else
53 2 Temper>>=1;
54 2
55 2 }
C51 COMPILER V8.02 DS18B20 04/24/2007 17:29:57 PAGE 2
56 1 L_Temperature>>=4; //高四位的值移道小數(shù)位去
57 1 H_Temperature=((H_Temperature<<4)&0x7f); //高字節(jié)的數(shù)據(jù)作移四位并把符號位清零
58 1 //以便與低字節(jié)的數(shù)據(jù)進行或操作
59 1 Buffer_Float=(H_Temperature|L_Temperature)+Buffer_Float; //最后的溫度值
60 1
61 1 return (Buffer_Float);
62 1
63 1 }
64
65
66 void Temperature_Reset(void) // 發(fā)送復(fù)位和初始化
67 {
68 1 unsigned int i;
69 1 P1_0 = 0;
70 1 i = 103;
71 1 while (i>0)
72 1 i--; // 延時
73 1 P1_0 = 1;
74 1 i = 4;
75 1 while (i>0)
76 1 i--;
77 1 }
78
79 bit Temperature_Readbit(void) // 讀取數(shù)據(jù)的一位
80 {
81 1 unsigned int i;
82 1 bit dat;
83 1 P1_0 = 0;
84 1 i++;
85 1 P1_0 = 1;
86 1 i++;
87 1 i++; //延時
88 1 dat = P1_0;
89 1 i = 8;
90 1 while (i>0)
91 1 i--; // 延時
92 1 return (dat);
93 1 }
94
95 unsigned char Temperature_Readchar(void) //讀一個字節(jié)
96 {
97 1 unsigned char i,j,dat;
98 1 dat = 0;
99 1 for (i=1;i<=8;i++)
100 1 {
101 2 j =Temperature_Readbit();
102 2 dat = (j << 7) | (dat >> 1);
103 2 }
104 1 return (dat);
105 1 }
106
107 void Temperature_Write(unsigned char dat) //寫一個字節(jié)
108 {
109 1 unsigned int i;
110 1 unsigned char j;
111 1 bit testb;
112 1 for (j=1;j<=8;j++)
113 1 {
114 2 testb = dat & 0x01;
115 2 dat = dat >> 1;
116 2 if (testb)
117 2 {
C51 COMPILER V8.02 DS18B20 04/24/2007 17:29:57 PAGE 3
118 3 P1_0 = 0; // 寫0
119 3 i++;
120 3 i++;
121 3 P1_0 = 1;
122 3 i = 8;
123 3 while (i>0)
124 3 i--;
125 3 }
126 2 else
127 2 {
128 3 P1_0 = 0; // 寫0
129 3 i = 8;
130 3 while (i>0)
131 3 i--;
132 3 P1_0 = 1;
133 3 i++;
134 3 i++;
135 3 }
136 2 }
137 1 }
138
139 void Temperature_Change(void) // ds1820 開始轉(zhuǎn)換
140 {
141 1 Temperature_Reset(); // 復(fù)位
142 1 //tmpre (); // 等待存在脈沖
143 1 Delay (1); // 延時
144 1 Temperature_Write(0xcc); // 跳過序列號命令
145 1 Temperature_Write(0x44); // 發(fā)轉(zhuǎn)換命令 44H,
146 1 }
147
148 void Read_Temperature(void) // 讀取溫度
149 {
150 1 Temperature_Reset(); // 復(fù)位
151 1 Delay (1); // 延時
152 1 Temperature_Write(0xcc); // 跳過序列號命令
153 1 Temperature_Write(0xbe); // 發(fā)送讀取命令
154 1 Temperature_Lsm= Temperature_Readchar(); // 讀取低位溫度
155 1 Temperature_Msm= Temperature_Readchar(); //讀取高位溫度
156 1 Temperature_Buffer=Data_Process(Temperature_Msm,Temperature_Lsm); //進行整數(shù)和小數(shù)的處理
157 1 }
158
159
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 435 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 8
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -