ds18b20.lst
来自「使用PROTEUS仿真的智能温度计,使用DS18B20测温,C编写」· LST 代码 · 共 216 行
LST
216 行
C51 COMPILER V8.08 DS18B20 08/04/2008 18:57:57 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE DS18B20
NO OBJECT MODULE REQUESTED
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DS18B20.c BROWSE DEBUG OBJECTEXTEND SRC(.\DS18B20.SRC)
line level source
1 // *********************************************************************************** //
2 //
3 // Filename : DS18B20.c
4 // Title : DS18B20 test file
5 // Author : MO YAN
6 // Created Date : 2008.8.2
7 // Revisited Date : 2008.8.2
8 // Description : Provide Function to get the temprature from the DS18B20 at any three pins
9 // Version : 1.2
10 //
11 // Copyright (c) 2008, All rights reserved.
12 // *********************************************************************************** //
13 #include<regx51.h>
14 sbit rs=P3^4; //LCD pins
15 sbit rw=P3^5;
16 sbit en=P3^6;
17 sbit DQ=P3^7; //DS18B20 pin
18
19 unsigned char L_18B20,H_18B20;
20 unsigned int fg=0,zhengshu,xiaoshu_a;
21 char code number[]="0123456789";
22
23 /*--------LCD--------*/
24 void delay100us(void)
25 {
26 1 #pragma asm
27 1 MOV R5,#3
28 1 LOOP1: MOV R6,#7
29 1 LOOP2: NOP
30 1 NOP
31 1 DJNZ R6,LOOP2
32 1 DJNZ R5,LOOP1
33 1 #pragma endasm
34 1 }
35
36 void write_command(unsigned command)
37 {
38 1 rw=0;
39 1 rs=0;
40 1 en=1;
41 1 P2=command;
42 1 delay100us();
43 1 en=0;
44 1 rw=1;
45 1 }
46
47 void write_data(unsigned lcddata)
48 {
49 1 rw=0;
50 1 rs=1;
51 1 en=1;
52 1 P2=lcddata;
53 1 delay100us();
54 1 en=0;
55 1 rw=1;
C51 COMPILER V8.08 DS18B20 08/04/2008 18:57:57 PAGE 2
56 1 }
57
58 void display_string(unsigned x,unsigned y,char*p)
59 {
60 1 if(x==1)
61 1 write_command(128+y);
62 1 else
63 1 write_command(192+y);
64 1 while(*p)
65 1 {
66 2 write_data(*p);
67 2 p++;
68 2 }
69 1 }
70
71 /*void display_num(unsigned x,unsigned y,unsigned i)
72 {
73 if(x==1)
74 write_command(128+y);
75 else
76 write_command(192+y);
77 write_data(number[i]);
78 } */
79
80 /*------DS18B20------*/
81
82
83 void delay_18B20(unsigned int i)
84 {
85 1 while(i--);
86 1 }
87
88
89 /*DS18B20的复位脉冲 主机通过拉低单总线至少480us以产生复位脉冲
90 然后主机释放单总线并进入接收模式 此时单总线电平被拉高
91 DS18B20检测到上升沿后 延时15~60us,拉低总线60~240us产生应答脉冲 */
92 void Init_DS18B20(void)
93 {
94 1 unsigned char x=0;
95 1 DQ = 1; //DQ复位
96 1 delay_18B20(8); //稍做延时
97 1 DQ = 0; //单片机将DQ拉低
98 1 delay_18B20(80); //精确延时 大于 480us
99 1 DQ = 1; //拉高总线
100 1 delay_18B20(14);
101 1 x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
102 1 delay_18B20(20);
103 1 }
104
105 /*写时隙 主机在写1时隙向DS18B20写入1,在写0时隙向DS18B20写入0
106 所有写时隙至少需要60us,且在两次写时隙之间至少需要1us的恢复时间
107 两种写时隙均以主机拉低总线开始
108 产生写1时隙:主机拉低总线后,必须在15us内释放总线,由上拉电阻拉回至高电平
109 产生写0时隙:主机拉低总线后,必须整个时隙保持低电平 */
110 void WriteOneChar(unsigned char dat)
111 {
112 1 unsigned char i=0;
113 1 for (i=8; i>0; i--)
114 1 {
115 2 DQ = 0;
116 2 DQ = dat&0x01;
117 2 delay_18B20(5);
C51 COMPILER V8.08 DS18B20 08/04/2008 18:57:57 PAGE 3
118 2 DQ = 1;
119 2 dat>>=1;
120 2 }
121 1 }
122
123 /*所有读时隙至少60us 且两次独立的读时隙之间至少需要1us的恢复时间
124 每次读时隙由主机发起,拉低总线至少1us。
125 若传1,则保持总线高电平;若发送0,则拉低总线
126 传0时DS18B20在该时隙结束时释放总线,再拉回高电平状态,主机必须在读时隙开始后的15us内释放总线,并保持采样
-总线状态 */
127 unsigned char ReadOneChar(void)
128 {
129 1 unsigned char i=0;
130 1 unsigned char dat = 0;
131 1 for (i=8;i>0;i--)
132 1 {
133 2 DQ = 0; // 给脉冲信号
134 2 dat>>=1;
135 2 DQ = 1; // 给脉冲信号
136 2 if(DQ)
137 2 dat|=0x80;
138 2 delay_18B20(4);
139 2 }
140 1 return(dat);
141 1 }
142
143
144 void read_18B20(void)
145 {
146 1
147 1 Init_DS18B20();
148 1 WriteOneChar(0xCC); // 跳过读序号列号的操作
149 1 WriteOneChar(0x44); // 启动温度转换
150 1
151 1 delay_18B20(100); // this message is wery important
152 1
153 1 Init_DS18B20();
154 1 WriteOneChar(0xCC); //跳过读序号列号的操作
155 1 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
156 1
157 1 delay_18B20(100);
158 1
159 1 L_18B20=ReadOneChar(); //读取低八位数据
160 1 H_18B20=ReadOneChar(); //读取高八位数据
161 1
162 1 zhengshu=L_18B20/16+H_18B20*16; //整数部分
163 1 xiaoshu_a=(L_18B20&0x0f)*10/16; //小数第一位
164 1 }
165
166
167 /*------MAIN------*/
168 void main(void)
169 {
170 1 write_command(56);
171 1 write_command(12);
172 1 write_command(6);
173 1 write_command(1);
174 1 write_command(2);
175 1 display_string(1,0," Temprature:");
176 1 do{read_18B20();
177 2 write_command(192);
178 2 write_data((0x30|(zhengshu/10)));
C51 COMPILER V8.08 DS18B20 08/04/2008 18:57:57 PAGE 4
179 2 write_data((0x30|(zhengshu-(zhengshu/10)*10)));
180 2 write_data(0x2e);
181 2 write_data(0x30|xiaoshu_a);
182 2 }
183 1 while(1);
184 1 }
185
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 410 ----
CONSTANT SIZE = 24 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?