📄 ds18b20.lst
字号:
C51 COMPILER V7.08 DS18B20 04/28/2007 19:06:47 PAGE 1
C51 COMPILER V7.08, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN DS18B20.OBJ
COMPILER INVOKED BY: D:\工具安装目录二\Keil C51\C51\BIN\C51.EXE DS18B20.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <absacc.h>
2 #include <ctype.h>
3 #include <math.h>
4 #include <stdio.h>
5 #include <string.h>
6 #include <reg52.h>
7 /******************************************
8 #XtalFreq (11.0592M)
9 /******************************************/
10 #define FALSE 0
11 #define TRUE 1
12 sbit DQ = P3^4; //定义DQ引脚为P3.4
13
14 /***********************延时函数***************************
15 *功能:在11.0592M晶振条件下调用本函数用时33us,然后每次计数用时10us
16 ***********************************************************/
17 void delay(int seconds)
18 {
19 1 while(seconds--);
20 1 }
21
22 /*********************复位函数******************************
23 *功能:完成单总线的复位操作
24 *复位时间为480us,因此调用延时函数次数为(480-33)/10=45,时间只能超过,不能小于
25 *经过70us之后检测存在脉冲,因此调用延时函数次数为(70-33)/10=4
26 *******************************************************************/
27 unsigned char ow_reset(void)
28 {
29 1 unsigned char presence;
30 1 DQ=0; /*将DQ线拉低*/
31 1 delay(45); /*保持480us*/
32 1 DQ=1; /*DQ返回高电平*/
33 1 delay(4); /*等待存在脉冲*/
34 1 presence=DQ; //获得存在信号
35 1 delay(40); //等待时间隙结束
36 1 return(presence); //返回存在信号,0表示器件存在,1表示无器件
37 1 }
38
39 /*********************位写入函数******************************
40 *功能:向单总线写入1位数据
41 *************************************************************/
42 void write_bit(char bitval)
43 {
44 1 DQ=0; //将DQ接低,开始写时间隙
45 1 if(bitval==1) //如果写1,
46 1 DQ=1; //DQ返回高电平
47 1 delay(8); //在时间隙内保持电平值不变,用时104us
48 1 DQ=1;
49 1 }
50
51 /*******************字节写入函数****************************
52 *功能:向单总线写入一个字节
53 ***********************************************************/
54 void write_byte(char val)
55 {
C51 COMPILER V7.08 DS18B20 04/28/2007 19:06:47 PAGE 2
56 1 unsigned char i;
57 1 unsigned char temp;
58 1 for(i=0;i<8;i++) //每次写入一位
59 1 {
60 2 temp=val>>=i;
61 2 temp&=0x01;
62 2 write_bit(temp);
63 2 }
64 1 delay(8); //延时104us
65 1 }
66
67 /*******************位读取函数****************************
68 *功能:从单总线上读取一位,延时15us,无法调用delay()延时程序
69 * 这里采用一个for()循环来实现延时
70 *********************************************************/
71 unsigned char read_bit(void)
72 {
73 1 unsigned char i;
74 1 DQ=0; //将DQ拉抵,开始读时间隙
75 1 DQ=1; //再将其拉高
76 1 for(i=0;i<4;i++); //延时15us
77 1 return(DQ); //返回DQ线上的电平值
78 1 }
79
80 /*****************字节读取函数*************************
81 *功能:从单总线读取一个字节的数据
82 ******************************************************/
83 unsigned char read_byte(void)
84 {
85 1 unsigned char i;
86 1 unsigned char value=0;
87 1 for(i=0;i<8;i++)
88 1 { //每次读取一位
89 2 if(read_bit()) //如果读入位为1
90 2 value=(value|0x01);
91 2 value=value<<i;//左移i位,存入value;为0则不用存,
92 2
93 2 //value中相应位原本就是0
94 2 delay(9); //延时120us,准备读取下一位
95 2 }
96 1 return(value);
97 1 }
98
99 /*****************读取温度转换值函数*********************
100 *功能:如果单总线上只用一个器件则可以直接调用本函数,
101 如果节点上有多个器件,为了避免冲突,应使用Match ROM函数
102 来选中特定的器件
103 *注明:本函数是根据DS18B20温度数据格式编写的,此器件是分辩率可调的
104 在9-12位可选,出厂设置时是12位,DS1820是9位的,不可调
105 ********************************************************/
106
107 unsigned char TempBuffer[7];////显示缓冲区,用于存放处理好的各位数值
108 void Read_Temperature(void)
109 {
110 1 extern char t[]; //全局变量,用于存放两个字节的温度值
111 1 ow_reset(); //复位初始化,并检测存在信号
112 1 write_byte(0xcc); //写入"跳过ROM"命令
113 1 write_byte(0x44); //启动温度转换
114 1 delay(8); //延时104us
115 1 ow_reset(); //复位初始化,并检测存在信号
116 1 write_byte(0xcc); //写入"跳过ROM"命令
117 1 write_byte(0xbe); //写入"读暂存器"命令
C51 COMPILER V7.08 DS18B20 04/28/2007 19:06:47 PAGE 3
118 1 t[0]=read_byte(); //读入温度值的低字节
119 1 t[1]=read_byte(); //读放温度值的高字节
120 1 }
121
122
123
124
125
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 194 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -