?? 18b20.lst
字號(hào):
C51 COMPILER V7.06 18B20 10/25/2006 16:41:27 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE 18B20
OBJECT MODULE PLACED IN 18b20.OBJ
COMPILER INVOKED BY: D:\keil\C51\BIN\C51.EXE 18b20.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1
2 #include <reg52.h> //DS18B20溫度傳感器程序
3 code unsigned char seg7code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
4 0x82,0xf8,0x80,0x90,0xff}; //不帶小數(shù)點(diǎn)的共陽數(shù)碼管段碼
5 code unsigned char seg7codeB[]={0x40,0x79,0x24,0x30,0x19,0x12,
6 0x02,0x78,0x00,0x10,0xff}; //帶小數(shù)點(diǎn)的共陽數(shù)碼管段碼
7
8 sbit DQ=P3^6; //數(shù)據(jù)傳輸線接單片機(jī)的相應(yīng)的引腳
9 unsigned char tempL=0; //設(shè)全局變量
10 unsigned char tempH=0;
11 unsigned int sdata;//測(cè)量到的溫度的整數(shù)部分
12 unsigned char xiaoshu1;//小數(shù)第一位
13 unsigned char xiaoshu2;//小數(shù)第二位
14 unsigned char xiaoshu;//兩位小數(shù)
15 bit fg=1; //溫度正負(fù)標(biāo)志
16
17
18
19 //******************延時(shí)子程序 *******************************
20
21 //這個(gè)延時(shí)程序的具體延時(shí)時(shí)間是time=i*8+10,適用于小于2ms的延時(shí)
22
23 //************************************************************
24 void delay(unsigned char i)
25 {
26 1 for(i;i>0;i--);
27 1 }
28
29
30 //***********************************************************
31
32 // 延時(shí)子程序
33
34 //************************************************************
35 void delay1ms()
36 {
37 1 unsigned char i;
38 1 for(i=124;i>0;i--); //延時(shí)124*8+10=1002us
39 1 }
40
41
42
43 //*****************************初始化程序 *********************************//
44
45 Init_DS18B20(void)
46 {
47 1 unsigned char x=0;
48 1 DQ=1; //DQ先置高
49 1 delay(8); //稍延時(shí)
50 1 DQ=0; //發(fā)送復(fù)位脈沖
51 1 delay(80); //延時(shí)(>480us)
52 1 DQ=1; //拉高數(shù)據(jù)線
53 1 delay(5); //等待(15~60us)
54 1 x=DQ; //用X的值來判斷初始化有沒有成功,18B20存在的話X=0,否則X=1
55 1 delay(20);
C51 COMPILER V7.06 18B20 10/25/2006 16:41:27 PAGE 2
56 1 }
57
58
59 //**********讀一個(gè)字節(jié)************//
60
61 ReadOneChar(void) //主機(jī)數(shù)據(jù)線先從高拉至低電平1us以上,再使數(shù)據(jù)線升為高電平,從而產(chǎn)生讀信號(hào)
62 {
63 1 unsigned char i=0; //每個(gè)讀周期最短的持續(xù)時(shí)間為60us,各個(gè)讀周期之間必須有1us以上的高電平恢復(fù)期
64 1 unsigned char dat=0;
65 1 for (i=8;i>0;i--) //一個(gè)字節(jié)有8位
66 1 {
67 2 DQ=1;
68 2 delay(1);
69 2 DQ=0;
70 2 dat>>=1;
71 2 DQ=1;
72 2 if(DQ)
73 2 dat|=0x80;
74 2 delay(4);
75 2 }
76 1 return(dat);
77 1 }
78
79
80
81 //*********************** **寫一個(gè)字節(jié)**************************//
82
83 WriteOneChar(unsigned char dat)
84 {
85 1 unsigned char i=0; //數(shù)據(jù)線從高電平拉至低電平,產(chǎn)生寫起始信號(hào)。15us之內(nèi)將所需寫的位送到數(shù)據(jù)線上,
86 1 for(i=8;i>0;i--) //在15~60us之間對(duì)數(shù)據(jù)線進(jìn)行采樣,如果是高電平就寫1,低寫0發(fā)生。
87 1 {
88 2 DQ=0; //在開始另一個(gè)寫周期前必須有1us以上的高電平恢復(fù)期。
89 2 DQ=dat&0x01;
90 2 delay(5);
91 2 DQ=1;
92 2 dat>>=1;
93 2 }
94 1 delay(4);
95 1 }
96
97
98 //讀溫度值(低位放tempL;高位放tempH;)
99 ReadTemperature(void)
100 {
101 1 Init_DS18B20(); //初始化
102 1 WriteOneChar(0xcc); //跳過讀序列號(hào)的操作
103 1 WriteOneChar(0x44); //啟動(dòng)溫度轉(zhuǎn)換
104 1 delay(125); //轉(zhuǎn)換需要一點(diǎn)時(shí)間,延時(shí)
105 1 Init_DS18B20(); //初始化
106 1 WriteOneChar(0xcc); //跳過讀序列號(hào)的操作
107 1 WriteOneChar(0xbe); //讀溫度寄存器(頭兩個(gè)值分別為溫度的低位和高位)
108 1 tempL=ReadOneChar(); //讀出溫度的低位LSB
109 1 tempH=ReadOneChar(); //讀出溫度的高位MSB
110 1
111 1 if(tempH>0x7f) //最高位為1時(shí)溫度是負(fù)
112 1 {
113 2 tempL=~tempL; //補(bǔ)碼轉(zhuǎn)換,取反加一
114 2 tempH=~tempH+1;
115 2 fg=0; //讀取溫度為負(fù)時(shí)fg=0
116 2 }
117 1 sdata = tempL/16+tempH*16; //整數(shù)部分
C51 COMPILER V7.06 18B20 10/25/2006 16:41:27 PAGE 3
118 1 xiaoshu1 = (tempL&0x0f)*10/16; //小數(shù)第一位
119 1 xiaoshu2 = (tempL&0x0f)*100/16%10;//小數(shù)第二位
120 1 xiaoshu=xiaoshu1*10+xiaoshu2; //小數(shù)兩位
121 1 }
122
123
124 //********************顯示函數(shù)****************
125 void Led(unsigned int date)
126 {
127 1 if(fg==1)
128 1 {
129 2 P1=0xfe; //P1.0=0,選通第一位
130 2 P2=seg7code[date/10]; //十位數(shù),查表,輸出
131 2 delay1ms();
132 2 P2=0xff; //消隱
133 2
134 2 P1=0xfd; //P1.1=0,選通第二位,個(gè)位數(shù)
135 2 P2=seg7codeB[date%10];
136 2 delay1ms();
137 2 P2=0xff; //消隱
138 2
139 2 P1=0xfb; //P1.3=0,選通第三位,小數(shù)點(diǎn)第一位
140 2 P2=seg7code[xiaoshu1];
141 2 delay1ms();
142 2 P2=0xff; //消隱
143 2
144 2 P1=0xf7; //P1.3=0,選通第四位,小數(shù)點(diǎn)第二位
145 2 P2=seg7code[xiaoshu2];
146 2 delay1ms();
147 2 P2=0xff; //消隱
148 2 }
149 1
150 1 if(fg==0) //溫度為負(fù)時(shí)顯示的數(shù)據(jù)
151 1 {
152 2 P1=0xfe; //P1.0=0,選通第一位
153 2 P2=seg7code[11]; //顯示負(fù)號(hào)
154 2 delay1ms();
155 2 P2=0xff; //消隱
156 2
157 2 P1=0xfd; //P1.1=0,選通第二位,十位數(shù)
158 2 P2=seg7code[date/10];
159 2 delay1ms();
160 2 P2=0xff; //消隱
161 2
162 2 P1=0xfb; //P1.3=0,選通第三位,個(gè)位數(shù)
163 2 P2=seg7codeB[date%10];
164 2 delay1ms();
165 2 P2=0xff; //消隱
166 2
167 2 P1=0xf7; //P1.3=0,選通第四位,小數(shù)點(diǎn)第一位
168 2 P2=seg7code[xiaoshu1];
169 2 delay1ms();
170 2 P2=0xff; //消隱
171 2 }
172 1 }
173
174
175 //**************************** //主程序
176
177
178 main()
179 {
C51 COMPILER V7.06 18B20 10/25/2006 16:41:27 PAGE 4
180 1 while(1)
181 1 {
182 2 ReadTemperature();
183 2 Led(sdata);
184 2 }
185 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 414 ----
CONSTANT SIZE = 22 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 ----
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -