📄 ds18b20.lst
字号:
C51 COMPILER V7.50 DS18B20 01/09/2006 16:57:59 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN DS18B20.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\Bin\c51.exe DS18B20.c DB SB OE ROM(LARGE) SMALL OT(6,SPEED) WL(2) RB(0)
line level source
1 #include<reg52.h>
2 #include<absacc.h>
3 #include<intrins.h>
4
5 #define unit unsigned int
6 #define uchar unsigned char
7 #define FALSE 0
8 #define TRUE 1
9 #define DS18B20MAX 10
10
11 sbit LED=P1^6;
12 sbit DQ=P1^7;
13
14 uchar ROMID[DS18B20MAX][8]; // 该DS18B20的ROMID是 28 CB 81 C2 00 00 00 41
15 uchar scratchPad[9];
16 uchar TH=0x64; // 温度监测系统设定的温度报警上限值
17 // 0 1100100 设为100摄氏度
18 uchar TL=0xd8; // 温度监测系统设定的温度报警下限值
19 // 1 1011000 设为零下40摄氏度
20 uchar confgReg=0x3f; // 温度监测系统设定的配置寄存器数据值
21 // 0 01 111111 分辨率为10位,最大转换时间187.5秒
22 void initial(void)
23 {
24 1 IE=0x00;
25 1 TMOD=0x20;
26 1 PCON=0x00;
27 1 SCON=0x40;
28 1 TH1=0xfd;
29 1 TL1=0xfd;
30 1 LED=1;
31 1
32 1
33 1 }
34
35
36 void delay_1s(void)
37 {
38 1 unsigned char i;
39 1 unsigned int j;
40 1 for(i=0;i<250;i++)
41 1 for(j=0;j<672;j++);
42 1 }
43
44
45 void delay(int time) // 延时子程序
46 { // 系统采用的是11.059MHz的晶振,所以该延时程序产生16*time+24μs 的延时
47 1 int i;
48 1 for(i=0;i<time;i++);
49 1 }
50
51
52 bit bus_reset(void) // 产生单总线系统的总线复位信号,并返回总线上是否存在单总线器件信息
53 { // 若返回0表明总线上存在单总线器件,若返回1表明总线上不存在单总线器件
54 1 bit presence;
55 1 DQ=0; // 拉低DQ总线开始复位
C51 COMPILER V7.50 DS18B20 01/09/2006 16:57:59 PAGE 2
56 1 delay(28); // 保持DQ低480μs
57 1 DQ=1; // 释放DQ
58 1 delay(5); // 等待大于60us,等待从设备将总线拉低,如果有从设备就拉低,否则就是高电平
59 1 presence=DQ; // 获取应答信号
60 1 delay(25); // 等待总线初始化过程结束
61 1 return(presence); // 返回应答信号,有芯片应答presence=0
62 1 // 无芯片应答presence=1
63 1 }
64
65
66 bit read_bit(void) // 从总线上读取一个数据位
67 {
68 1 DQ=0; // 将总线DQ拉低启动读时隙
69 1 DQ=1; // 释放DQ信号线,等待从机返回数据位
70 1 _nop_(); // 延时4μs再读数据
71 1 _nop_();
72 1 _nop_();
73 1 _nop_();
74 1 return DQ;
75 1
76 1 }
77
78
79 uchar read_byte(void) // 从单总线上读取一个字节
80 {
81 1 uchar i;
82 1 uchar value=0; // 将返回值初始化为0
83 1 for(i=0;i<8;i++)
84 1 {
85 2 if(read_bit())
86 2 value|=0x01<<i; // 读一字节数据,一个读时序中读一位,并做移位处理
87 2
88 2 delay(3); // 延时60μs以完成此次读时序,之后再读下一位数据
89 2 }
90 1 return(value);
91 1 }
92
93
94 void write_bit(uchar bitval) // 向单总线上写一个数据位
95 {
96 1 DQ=0; // 拉低DQ以开始一个写时序
97 1 if(bitval==1)
98 1 DQ=1; // 如要写"1"则将总线置高
99 1 delay(3); // 延时60μs供DS18B20采样
100 1 DQ=1; // 释放DQ总线
101 1
102 1 }
103
104
105 void write_byte(uchar val) // 向单总线上写一个数据字节
106 {
107 1 uchar i;
108 1 uchar temp=0; // 将返回值初始化为0
109 1 for(i=0;i<8;i++) // 写一字节数据,一次写一位
110 1 {
111 2 temp=val>>i; // 移位操作,将本次要写的位移到最低位
112 2 temp&=0x01;
113 2 write_bit(temp); // 向总线写该位
114 2 }
115 1 delay(5); // 等待时隙结束
116 1 }
117
C51 COMPILER V7.50 DS18B20 01/09/2006 16:57:59 PAGE 3
118
119 /*uchar send_matchRom(uchar DS18B20No) // 系统主机向总线发出匹配ROM命令
120 { // ROM ID是编号为DS18B20No的温度传感器的ROM序列号
121 uchar i;
122 if(bus_reset()) return FALSE; // 如果总线上没有器件,返回FALSE
123 write_byte(0x55); // 向总线写匹配命令0x55
124 for(i=0;i<8;i++) // 连续写入8个字节的ROMID
125 {
126 write_byte(ROMID[DS18B20No][i]); // 向总线写ROMID的第i个字节
127 }
128 return TRUE;
129 }
130
131
132 void read_scratchPad(uchar DTNo) // 系统主机从指定的DS18B20中读取便笺存储器的所有字节
133 { // 读取的结果放到全局变量scratchPad[9]中
134 uchar i;
135 send_matchRom(DTNo); // 向总线发出匹配ROM命令,使编号为DTNo的器件处于选中状态
136 write_byte(0xBE); // 向总线发出读便笺存储器命令
137 for(i=0;i<9;i++) // 连续读入9个字节的便笺存储器单元
138 {
139 scratchPad[i]=read_byte(); // 从总线读取1个字节存入scratchPad[i]
140 }
141
142 }
143
144
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -