?? 溫度器(已成功顯示).lst
字號:
C51 COMPILER V8.02 溫度芲(_殉曬ο允_) 06/01/2007 22:24:04 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 溫度芲(_殉曬ο允_)
OBJECT MODULE PLACED IN 溫度器(已成功顯示).OBJ
COMPILER INVOKED BY: G:\8.02\C51\BIN\C51.EXE 溫度器(已成功顯示).c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <AT89X52.H>
2 #include <INTRINS.h>
3 unsigned char code Tab[]={0xff,0Xfd,0xff,0xfe,0xff,0xf7,0xff,0xfb,0xff,0xdf,0xff,0xef,0xff,0x7f,0xff,0xbf
-,
4 0Xfd,0xff,0xfe,0xff,0xf7,0xff,0xfb,0xff,0xdf,0xff,0xef,0xff,0x7f,0xff,0xbf,0xff
-};
5 unsigned char code codedisplay[]={0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xDB,0xE7,0
-xFF,0xFF,/*"0",0*/
6 0xFF,0xFF,0xFF,0xEF,0x8F,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0x83,0
-xFF,0xFF,/*"1",1*/
7 0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xFB,0xFB,0xF7,0xEF,0xDF,0xBD,0x81,0
-xFF,0xFF,/*"2",2*/
8 0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xFB,0xE7,0xFB,0xFD,0xFD,0xBD,0xBB,0xC7,0xFF,0xFF,/*"3",3*/
9 0xFF,0xFF,0xFF,0xFB,0xF3,0xEB,0xDB,0xDB,0xBB,0xBB,0x81,0xFB,0xFB,0xE1,0
-xFF,0xFF,/*"4",4*/
10 0xFF,0xFF,0xFF,0x81,0xBF,0xBF,0xBF,0xA7,0x9B,0xFD,0xFD,0xBD,0xBB,0xC7,0
-xFF,0xFF,/*"5",5*/
11 0xFF,0xFF,0xFF,0xE3,0xDB,0xBF,0xBF,0xA7,0x9B,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,/*"6",6*/
12 0xFF,0xFF,0xFF,0x81,0xBB,0xBB,0xF7,0xF7,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,/*"7",7*/
13 0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xDB,0xE7,0xDB,0xBD,0xBD,0xBD,0xC3,0xFF,0xFF,/*"8",8*/
14 0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xD9,0xE5,0xFD,0xFD,0xDB,0xC7,0xFF,0xFF};/*"9",9*/
15
16
17
18 unsigned char m;
19 unsigned int result,count=0;
20 void delay(void)
21 { unsigned char i,j;
22 1 for(i=0;i<15;i++){ for(j=0;j<50;j++) ; }
23 1 }
24
25 unsigned char displaycount,x;
26 unsigned char displaybuf[8]={0,0,0,0,0,0,0,0};
27 unsigned char timecount;
28 unsigned char readdata[8];
29 unsigned long a,aa,bb;
30 sbit DQ=P2^6; //選P3.7口與DS18B20的數字信號輸出端DQ相連
31 bit sflag;
32
33 bit resetpulse(void) //DS18B20初始化實現對DS18B20的復位
34 { unsigned char pre;
35 1 unsigned char i;
36 1 DQ=0; //發出復位脈沖,將數據線下拉480μS-960μS
37 1 for(i=220;i>0;i--); //(改!!!!!!!!!!!!!!!!!!!!)
38 1 DQ=1; //DS18B20等待15μS-60μS
39 1 for(i=60;i>0;i--);
40 1 pre=DQ;
41 1 for(i=150;i>0;i--);
42 1 return(pre); // DS18B20返回60μS-240μS存在低脈沖,判斷是否準備好接受或發送數據
43 1 }
44
45 void writecommandtods18b20(unsigned char command) //寫時序
46 {
47 1 unsigned char i;
48 1 unsigned char j;
C51 COMPILER V8.02 溫度芲(_殉曬ο允_) 06/01/2007 22:24:04 PAGE 2
49 1
50 1 for(i=0;i<8;i++)
51 1 {
52 2 if((command & 0x01)==0) //寫0時序
53 2 {
54 3 DQ=0; //拉低單總線至少60μS,保證DS18B20在15μS-45μS時可以正確地采樣I/O總線上的低電平
55 3 for(j=35;j>0;j--);
56 3 DQ=1;
57 3 }
58 2 else //寫1時序
59 2 {
60 3 DQ=0; //拉低單總線后,在15us之內就得釋放
61 3 for(j=2;j>0;j--);
62 3 DQ=1;
63 3 for(j=33;j>0;j--);
64 3 }
65 2 command=_cror_(command,1);
66 2 }
67 1 }
68
69 unsigned char readdatafromds18b20(void) //讀時序
70 {
71 1 unsigned char i;
72 1 unsigned char j;
73 1 unsigned char temp;
74 1
75 1 temp=0;
76 1 for(i=0;i<8;i++)
77 1 {
78 2 temp=_cror_(temp,1);
79 2 DQ=0; //單總線拉低后,讀時序開始
80 2 _nop_();
81 2 _nop_();
82 2 DQ=1; //停止將數據線拉低,以讀取數據
83 2 for(j=10;j>0;j--);
84 2 if(DQ==1)
85 2 {
86 3 temp=temp | 0x80;
87 3 }
88 2 else
89 2 {
90 3 temp=temp | 0x00;
91 3 }
92 2 for(j=20;j>0;j--); ////////////////////(改!!!!!!!!!!!!)
93 2 }
94 1 return(temp);
95 1 }
96
97
98
99 void main(void)
100 { SCON=0; P1=0;
101 1 //while(resetpulse()); //寫前調用初始化程序對DS18B20復位
102 1 //writecommandtods18b20(0xcc); //單片DS18B20工作,跳過讀ROM中64位地址的過程
103 1 //writecommandtods18b20(0x44); //啟動DS18B20進行溫度轉化,將結果存入內部RAM中
104 1 while(1)
105 1 {
106 2 for(m=0;m<16;m++)
107 2 { SBUF=codedisplay[displaybuf[0]*16+m]; while(!TI) ; TI=0;
108 3 SBUF=codedisplay[displaybuf[1]*16+m]; while(!TI) ; TI=0;
109 3 SBUF=codedisplay[displaybuf[2]*16+m]; while(!TI) ; TI=0;
110 3 SBUF=codedisplay[displaybuf[3]*16+m]; while(!TI) ; TI=0;
C51 COMPILER V8.02 溫度芲(_殉曬ο允_) 06/01/2007 22:24:04 PAGE 3
111 3 SBUF=codedisplay[displaybuf[4]*16+m]; while(!TI) ; TI=0;
112 3 SBUF=codedisplay[displaybuf[5]*16+m]; while(!TI) ; TI=0;
113 3 SBUF=codedisplay[displaybuf[6]*16+m]; while(!TI) ; TI=0;
114 3 SBUF=codedisplay[displaybuf[7]*16+m]; while(!TI) ; TI=0;
115 3 //P2_0=0;P2_1=0;P2_1=1;P2_1=0;P2_0=1;
116 3 SBUF=Tab[2*m]; while(!TI) ; TI=0;
117 3 SBUF=Tab[2*m+1];while(!TI) ; TI=0;
118 3
119 3 P3_4=0;P3_4=1; P3_4=0;
120 3 delay();
121 3 count++;
122 3 if(count==600)
123 3 { count=0;
124 4 while(resetpulse()); //寫前調用初始化程序對DS18B20復位
125 4 writecommandtods18b20(0xcc); //單片DS18B20工作,跳過讀ROM中64位地址的過程
126 4 writecommandtods18b20(0xbe); // 讀DS18B20RAM中溫度數據
127 4 readdata[0]=readdatafromds18b20(); //溫度數據低8位賦值
128 4 readdata[1]=readdatafromds18b20(); //溫度數據高8位賦值
129 4 sflag=0;
130 4 if((readdata[1] & 0xf8)!=0x00) //溫度數據高5位為1時,溫度為負值
131 4 {
132 5 sflag=1;
133 5 readdata[1]=~readdata[1]; //對負溫度值進行取反加1操作
134 5 readdata[0]=~readdata[0];
135 5 result=readdata[0]+1;
136 5 readdata[0]=result;
137 5 if(result>255)
138 5 {
139 6 readdata[1]++;
140 6 }
141 5 }
142 4 readdata[1]=readdata[1]&0x07; //將代表符號的高5位數屏蔽
143 4 aa=625;bb=(readdata[1]*256+readdata[0]);
144 4 a=bb*aa; //計算實際溫度值
145 4
146 4
147 4
148 4 displaybuf[0]=a/100000; //給各顯示位賦溫度值
149 4 displaybuf[1]=a%100000/10000;
150 4 displaybuf[2]=a%10000/1000;
151 4 displaybuf[3]=a%1000/100;
152 4 displaybuf[4]=a%100/10;
153 4 displaybuf[5]=a%10;
154 4 while(resetpulse());
155 4 writecommandtods18b20(0xcc);
156 4 writecommandtods18b20(0x44);
157 4 }
158 3 }}}
159
160
161
162
163
164
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 838 ----
CONSTANT SIZE = 192 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 36 ----
C51 COMPILER V8.02 溫度芲(_殉曬ο允_) 06/01/2007 22:24:04 PAGE 4
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -