📄 ds18b20.lst
字号:
C51 COMPILER V6.12 DS18B20 02/06/2007 20:26:34 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN .\ds18b20.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\ds18b20.c DEBUG OBJECTEXTEND
stmt level source
1 #include <reg52.h>
2 #include <absacc.h>
3 #include <intrins.h>
4 #define uint unsigned int
5 #define uchar unsigned char
6
7 sbit DQ=P3^4;
8 bit sflag;
9 uchar readdata[2]={0,0};
10 uchar code decimal[17]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
11 uchar code asccode[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
12 uchar textreal[2][16];
13 void LCDdisplay(uchar textvar[2][16]);
14 sbit rs=P3^7;
15 sbit rw=P3^6;
16 sbit e=P3^5;
17 sbit busy=P1^7;
18 void enable(void);
19 void delay(void);
20
21
22 bit resetpulse(void)
23 {
24 1 uchar i;
25 1 DQ=0;
26 1 for(i=255;i>0;i--){;}
27 1 DQ=1;
28 1 for(i=60;i>0;i--){;}
29 1 return(DQ);
30 1 for(i=200;i>0;i--){;}
31 1 }
32
33
34 void writecommandtods18b20(uchar command)
35 {
36 1 uchar i,j;
37 1
38 1 for(i=0;i<8;i++)
39 1 {
40 2 if((command & 0x01)==0)
41 2 {
42 3 DQ=0;
43 3 for(j=35;j>0;j--);
44 3 DQ=1;
45 3 }
46 2 else
47 2 {
48 3 DQ=0;
49 3 for(j=2;j>0;j--);
50 3 DQ=1;
51 3 for(j=33;j>0;j--);
52 3 }
53 2 command=_cror_(command,1); //循环右移库函数,在intrins.h中定义
54 2 }
55 1 }
C51 COMPILER V6.12 DS18B20 02/06/2007 20:26:34 PAGE 2
56
57
58 uchar readdatafromds18b20(void)
59 {
60 1 uchar i,j,temp;
61 1
62 1 temp=0;
63 1 for(i=0;i<8;i++)
64 1 {
65 2 temp=_cror_(temp,1);
66 2 DQ=0;
67 2 _nop_(); // nop指令
68 2 _nop_();
69 2 DQ=1;
70 2 for(j=10;j>0;j--);
71 2 if(DQ==1)
72 2 {
73 3 temp=temp | 0x80;
74 3 }
75 2 else
76 2 {
77 3 temp=temp | 0x00;
78 3 }
79 2 for(j=200;j>0;j--);
80 2 }
81 1 return(temp);
82 1 }
83
84
85 void main(void)
86 {
87 1 TMOD=0x01;
88 1 TH0=(65536-60000)/256;
89 1 TL0=(65536-60000)%256;
90 1 ET0=1;
91 1 EA=1;
92 1
93 1 while(resetpulse());
94 1 writecommandtods18b20(0xcc);
95 1 writecommandtods18b20(0x44);
96 1 TR0=1;
97 1 while(1){;}
98 1 }
99
100
101 void t0(void) interrupt 1 using 0
102 {
103 1 uchar i,j,convert0,convert1,decimaldata,a,b,c;
104 1 uint result;
105 1
106 1 TH0=(65536-60000)/256;
107 1 TL0=(65536-60000)%256;
108 1
109 1 while(resetpulse());
110 1 writecommandtods18b20(0xcc);
111 1 writecommandtods18b20(0xbe);
112 1 readdata[0]=readdatafromds18b20();
113 1 readdata[1]=readdatafromds18b20();
114 1 if((readdata[1] & 0xf8)!=0x00)
115 1 {
116 2 sflag=1;
117 2 readdata[1]=~readdata[1];
C51 COMPILER V6.12 DS18B20 02/06/2007 20:26:34 PAGE 3
118 2 readdata[0]=~readdata[0];
119 2 result=readdata[0]+1;
120 2 readdata[0]=result;
121 2 }
122 1 readdata[1]=readdata[1]<<4;
123 1 readdata[1]=readdata[1] & 0x70;
124 1 readdata[0]=readdata[0]>>4;
125 1 readdata[0]=readdata[0]&0x0f;
126 1 readdata[1]=readdata[1]|readdata[0];
127 1 result=readdata[1];
128 1 convert1=readdata[1]>>4;
129 1 i=convert1;
130 1 convert0=readdata[0];
131 1 j=convert0;
132 1 decimaldata=decimal[i]*16+decimal[j];
133 1 a=decimaldata/100;
134 1 b=(decimaldata%100)/10;
135 1 c=(decimaldata%100)%10;
136 1
137 1 textreal[0][0]=asccode[a];
138 1 textreal[0][1]=asccode[b];
139 1 textreal[0][2]=asccode[c];
140 1 LCDdisplay(textreal);
141 1 while(resetpulse());
142 1 writecommandtods18b20(0xcc);
143 1 writecommandtods18b20(0x44);
144 1 }
145
146
147 void LCDdisplay(uchar textvar[2][16])
148 {
149 1 uchar i,j,adress=0x80;
150 1 P1=0x01; //清显示
151 1 enable();
152 1 P1=0x38;
153 1 enable();
154 1 P1=0x0f;
155 1 enable();
156 1 P1=0x06;
157 1 enable();
158 1 for(i=0;i<2;i++)
159 1 {
160 2 for(j=0;j<16;j++)
161 2 {
162 3 P1=adress;
163 3 enable();
164 3 if(textvar[i][j]==0x00)//判断如果数组中的内容为空则填补空格
165 3 {
166 4 textvar[i][j]=' ';
167 4 }
168 3 P1=textvar[i][j];
169 3 rs=1;
170 3 rw=0;
171 3 e=0;
172 3 delay();
173 3 e=1;
174 3 adress++;
175 3 }
176 2 adress=0xc0;
177 2
178 2 }
179 1 adress=0x80;
C51 COMPILER V6.12 DS18B20 02/06/2007 20:26:34 PAGE 4
180 1 }
181
182 void enable(void)
183 {
184 1 rs=0;
185 1 rw=0;
186 1 e=0;
187 1 delay();
188 1 e=1;
189 1 }
190
191 void delay(void) //判断液晶是否为忙
192 {
193 1 do //注意do while和while的区别
194 1 {
195 2 P1=0xff; //读数前首先发高点电平,将CMOS截止
196 2 rs=0;
197 2 rw=1;
198 2 e=0;
199 2 e=1;
200 2 }while(busy==1);
201 1 }
202
203
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 489 ----
CONSTANT SIZE = 27 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 34 8
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 + -