?? +
字號:
C51 COMPILER V7.50 18B20 05/16/2010 11:45:28 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE 18B20
OBJECT MODULE PLACED IN 18b20.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 18b20.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*-----------------------------------------------
2 名稱:18B20溫度傳感器
3 內容:18B20單線溫度檢測的應用樣例程序,請將18b20插緊,
4 然后在數碼管可以顯示XX.XC,C表示攝氏度,如顯示25.3C表示當前溫度25.3度
5 ------------------------------------------------*/
6 #include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
7 #include<math.h>
8 #include<INTRINS.H>
9
10 #define uchar unsigned char
11 #define uint unsigned int;
12 /******************************************************************/
13 /* 定義端口 */
14 /******************************************************************/
15 sbit seg1=P2^0;
16 sbit seg2=P2^1;
17 sbit seg3=P2^2;
18 sbit DQ=P1^3;//ds18b20 端口
19 sfr dataled=0x80;//顯示數據端口
20 /******************************************************************/
21 /* 全局變量 */
22 /******************************************************************/
23 uint temp;
24 uchar flag_get,count,num,minute,second;
25 uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
26 //7段數碼管段碼表共陽
27 uchar str[6];
28 /******************************************************************/
29 /* 函數聲明 */
30 /******************************************************************/
31 void delay1(uchar MS);
32 unsigned int ReadTemperature(void);
33 void Init_DS18B20(void);
34 unsigned char ReadOneChar(void);
35 void WriteOneChar(unsigned char dat);
36 void delay(unsigned int i);
37 /******************************************************************/
38 /* 主函數 */
39 /******************************************************************/
40 main()
41 {
42 1 unsigned char TempH,TempL;
43 1 TMOD|=0x01;//定時器設置
44 1 TH0=0xef;
45 1 TL0=0xf0;
46 1 IE=0x82;
47 1 TR0=1;
48 1 P2=0x00;
49 1 count=0;
50 1 while(1)
51 1 {
52 2 str[5]=0x39; //顯示C符號
53 2 str[1]=tab[TempH/100]; //十位溫度
54 2 str[2]=tab[(TempH%100)/10]; //十位溫度
55 2 str[3]=tab[(TempH%100)%10]|0x80; //個位溫度,帶小數點
C51 COMPILER V7.50 18B20 05/16/2010 11:45:28 PAGE 2
56 2 str[4]=tab[TempL];
57 2 if(flag_get==1) //定時讀取當前溫度
58 2 {
59 3 temp=ReadTemperature();
60 3 if(temp&0x8000)
61 3 {
62 4 str[0]=0x40;//負號標志
63 4 temp=~temp; // 取反加1
64 4 temp +=1;
65 4 }
66 3 else
67 3 str[0]=0;
68 3 TempH=temp>>4;
69 3 TempL=temp&0x0F;
70 3 TempL=TempL*6/10;//小數近似處理
71 3 flag_get=0;
72 3 }
73 2 }
74 1 }
75
76
77 /******************************************************************/
78 /* 定時器中斷 */
79 /******************************************************************/
80 void tim(void) interrupt 1 using 1//中斷,用于數碼管掃描和溫度檢測間隔
81 {
82 1 TH0=0xef;//定時器重裝值
83 1 TL0=0xf0;
84 1 num++;
85 1 if (num==50)
86 1 {num=0;
87 2 flag_get=1;//標志位有效
88 2 second++;
89 2 if(second>=60)
90 2 {second=0;
91 3 minute++;
92 3 }
93 2 }
94 1 count++;
95 1 if(count==1)
96 1 {P2=0;
97 2 dataled=str[0];}//數碼管掃描
98 1 if(count==2)
99 1 {P2=1;
100 2 dataled=str[1];}
101 1 if(count==3)
102 1 { P2=2;
103 2 dataled=str[2];
104 2 }
105 1 if(count==4)
106 1 { P2=3;
107 2 dataled=str[3];
108 2 }
109 1 if(count==5)
110 1 { P2=4;
111 2 dataled=str[4];
112 2 }
113 1 if(count==6)
114 1 { P2=5;
115 2 dataled=str[5];
116 2 count=0;}
117 1 }
C51 COMPILER V7.50 18B20 05/16/2010 11:45:28 PAGE 3
118 /******************************************************************/
119 /* 延時函數 */
120 /******************************************************************/
121 void delay(unsigned int i)//延時函數
122 {
123 1 while(i--);
124 1 }
125 /******************************************************************/
126 /* 初始化 */
127 /******************************************************************/
128 void Init_DS18B20(void)
129 {
130 1 unsigned char x=0;
131 1 DQ = 1; //DQ復位
132 1 delay(8); //稍做延時
133 1 DQ = 0; //單片機將DQ拉低
134 1 delay(80); //精確延時 大于 480us
135 1 DQ = 1; //拉高總線
136 1 delay(10);
137 1 x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
138 1 delay(5);
139 1 }
140
141 /******************************************************************/
142 /* 讀一個字節 */
143 /******************************************************************/
144 unsigned char ReadOneChar(void)
145 {
146 1 unsigned char i=0;
147 1 unsigned char dat = 0;
148 1 for (i=8;i>0;i--)
149 1 {
150 2 DQ = 0; // 給脈沖信號
151 2 dat>>=1;
152 2 DQ = 1; // 給脈沖信號
153 2 if(DQ)
154 2 dat|=0x80;
155 2 delay(5);
156 2 }
157 1 return(dat);
158 1 }
159
160 /******************************************************************/
161 /* 寫一個字節 */
162 /******************************************************************/
163 void WriteOneChar(unsigned char dat)
164 {
165 1 unsigned char i=0;
166 1 for (i=8; i>0; i--)
167 1 {
168 2 DQ = 0;
169 2 DQ = dat&0x01;
170 2 delay(5);
171 2 DQ = 1;
172 2 dat>>=1;
173 2 }
174 1 delay(5);
175 1 }
176
177 /******************************************************************/
178 /* 讀取溫度 */
179 /******************************************************************/
C51 COMPILER V7.50 18B20 05/16/2010 11:45:28 PAGE 4
180 unsigned int ReadTemperature(void)
181 {
182 1 unsigned char a=0;
183 1 unsigned int b=0;
184 1 unsigned int t=0;
185 1 Init_DS18B20();
186 1 WriteOneChar(0xCC); // 跳過讀序號列號的操作
187 1 WriteOneChar(0x44); // 啟動溫度轉換
188 1 delay(200);
189 1 Init_DS18B20();
190 1 WriteOneChar(0xCC); //跳過讀序號列號的操作
191 1 WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
192 1 a=ReadOneChar(); //低位
193 1 b=ReadOneChar(); //高位
194 1
195 1 b<<=8;
196 1 t=a+b;
197 1
198 1 return(t);
199 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 425 ----
CONSTANT SIZE = 10 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 13 2
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 + -