📄 ds18b20.lst
字号:
C51 COMPILER V8.09 DS18B20 11/29/2008 09:47:17 PAGE 1
C51 COMPILER V8.09, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN ds18b20.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\KC51.EXE ds18b20.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h>
2 #include<intrins.h>
3
4 #define uchar unsigned char
5 #define uint unsigned int
6
7 void lcd_wrcmd(uchar lcdcmd);
8 void lcd_moveto(uchar position);
9 void lcd_wrdata(uchar lcddata);
10 void lcd_string(uchar position,uchar count,uchar *strpoint);
11 void lcd_init() ;
12 void lcd_cls() ;
13
14 sbit DQ =P4^2;
15 sbit LED1 =P4^3;
16
17 uchar Temp_data[4];
18
19 void Delay1us(uchar us) //延时1us
20 {
21 1 while(us)
22 1 {
23 2 _nop_();
24 2 --us;
25 2
26 2 }
27 1 }
28
29 //延时1ms
30 void Delay1ms(uchar ms)
31 {
32 1 Delay1us(1000);
33 1 }
*** WARNING C280 IN LINE 30 OF DS18B20.C: 'ms': unreferenced local variable
34
35 //ds18b20复位,返回0,设备正常,返回1,没有设备或设备不正常
36 bit resetpulse(void)
37 {
38 1 unsigned char i;
39 1 bit RstFlag;
40 1 RstFlag=1;
41 1 DQ=0;
42 1 for(i=0;i<40;i++)//480us延时
43 1 {
44 2 Delay1us(15);
45 2 }
46 1 DQ=1;
47 1 for(i=0;i<4;i++)//15~60us延时
48 1 {
49 2 Delay1us(15);
50 2 }
51 1 for(i=0;i<16;i++)//60~240us延时
52 1 {
53 2 Delay1us(15);
54 2 if(DQ==0)
C51 COMPILER V8.09 DS18B20 11/29/2008 09:47:17 PAGE 2
55 2 RstFlag=0;
56 2 }
57 1 for(i=0;i<16;i++)
58 1 {
59 2 Delay1us(15);
60 2 }
61 1 return(RstFlag);
62 1 }
63
64 //ds18b20写命令
65 void writecommandtods18b20(uchar command)
66 {
67 1 uchar i;
68 1 DQ=1;
69 1 Delay1us(1);
70 1 for(i=0;i<8;i++)
71 1 {
72 2 DQ=0;
73 2 Delay1us(15);
74 2 DQ=command&0x1;//低位在先
75 2 Delay1us(15);
76 2 Delay1us(15);
77 2 Delay1us(15);
78 2 DQ=1;
79 2 command=command>>1;
80 2 Delay1us(1);
81 2 }
82 1 }
83
84 //ds18b20读命令
85 unsigned char readdatafromds18b20(void)
86 {
87 1 uchar i;
88 1 uchar temp;
89 1 temp=0;
90 1
91 1 DQ=1;
92 1 Delay1us(1);
93 1 for(i=0;i<8;i++)
94 1 {
95 2 DQ=0;
96 2 Delay1us(15);
97 2 DQ=1;
98 2 Delay1us(2);
99 2 temp=temp>>1;
100 2 if(DQ==1)
101 2 {
102 3 temp=temp+0x80;//先读到最高位,再依次右移
103 3 }
104 2 Delay1us(15);
105 2 Delay1us(15);
106 2 Delay1us(15);
107 2 }
108 1
109 1 return(temp);
110 1 }
111
112 //跳过读序号列号的操作
113 void SkipRomCode(void)
114 {
115 1 resetpulse(); //复位
116 1 writecommandtods18b20(0xCC);// 跳过读序号列号的操作
C51 COMPILER V8.09 DS18B20 11/29/2008 09:47:17 PAGE 3
117 1 }
118
119 //启动转换
120 void StartADC(void)
121 {
122 1 resetpulse(); //复位
123 1 writecommandtods18b20(0xCC);//广播
124 1 writecommandtods18b20(0x44);//启动温度转换,12位,需时700ms
125 1 }
126
127 unsigned int GetTempValue(void)
128 {
129 1 unsigned i,j;
130 1 unsigned int T;
131 1 SkipRomCode();
132 1 writecommandtods18b20(0xBE);//读取温度值的命令
133 1 i=readdatafromds18b20(); //温度低八位
134 1 j=readdatafromds18b20(); //温度高八位
135 1
136 1 StartADC();
137 1
138 1 T=i+j*256;
139 1 if(T==0xFFFF) return 0xFFFF;
140 1 if(T>0x8000) //温度为负
141 1 {
142 2 T=~T+1;
143 2 return(0x8000+T*5/8);
144 2 }
145 1 else //温度位正
146 1 {
147 2 return(T*5/8);
148 2 }
149 1 }
150
151 void main(void)
152 {
153 1 uint w;
154 1 P4SW=0x70;
155 1 Delay1ms(10);
156 1 lcd_init();
157 1 Delay1ms(10);
158 1 SkipRomCode(); //主机发布跳过读序号列号的操作
159 1 writecommandtods18b20(0x44);//启动温度转换
160 1 lcd_string(4, 8,"NOW TEMP");
161 1 lcd_string(25,6," C");
162 1 while(1)
163 1 {
164 2 Delay1ms(700); //延时700ms
165 2 w=GetTempValue();
166 2 Temp_data[0] = (w%1000)/100+0x30;// 十位
167 2 Temp_data[1] = (w%100)/10+0x30;//个位
168 2 Temp_data[2] = 0x2e;
169 2 Temp_data[3] = w%10+0x30;//小数位
170 2 Temp_data[4] = 0xdf;
171 2 lcd_string(25,5,&Temp_data[0]);
172 2 }
173 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 460 ----
CONSTANT SIZE = 16 ----
C51 COMPILER V8.09 DS18B20 11/29/2008 09:47:17 PAGE 4
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 5
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
PA51 中文汇编系统
Version 8.2 (C) Copyright 2007.7
登陆 http://pa51.cn 了解更多咨询
技术论坛 http://bbs.pa51.cn
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -