📄 ds1820.lst
字号:
C51 COMPILER V7.01 DS1820 07/11/2004 16:17:48 PAGE 1
C51 COMPILER V7.01, COMPILATION OF MODULE DS1820
OBJECT MODULE PLACED IN ds1820.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE ds1820.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //**********************************************************************
2 //功能 : 实时时钟DS1302操作模块
3 //作者 : lihj
4 //创建日期 : 2004-07-10
5 //版本 : V1.0
6 //修改记录 :
7 //***********************************************************************
8 #include <reg51.h>
9 #include <std.h>
10 #include <ds1820.h>
11
12 sbit TMDAT = P3^4; //根据实实际情况设定
13
14 //函数功能:延时(12MHz晶振)
15 //输入参数:<count>延时时间长度,单位1ms
16 void Delay_ms (U16 count)
17 {
18 1 U16 i;
19 1 while (count)
20 1 {
21 2 i = 123;
22 2 while (i>0) i--;
23 2 count--;
24 2 }
25 1 }
26
27 //函数功能:复位芯片(至少480us长的低电平信号)
28 void ResetChip (void)
29 {
30 1 U16 i;
31 1
32 1 TMDAT = 0; //480us~960us长低电平:复位
33 1 i = 150;
34 1 while (i--); //延时约900 uS(12Mhz时)
35 1 TMDAT = 1;
36 1 i = 5;
37 1 while (i--); //DS1820检测到上升沿后,过15~60us后输出“存在”信号
38 1 }
39
40 //函数功能: 判断DS1820是否存在
41 //返回参数: TRUE:芯片存在
42 // FALSE:芯片不存在
43 U8 ChipPresenceCheck(void)
44 {
45 1 U16 i;
46 1
47 1 ResetChip();
48 1
49 1 //等待70us,应该检测到低电平
50 1 i = 11;
51 1 while(i--);
52 1 if(TMDAT)
53 1 {
54 2 return FALSE;
55 2 }
C51 COMPILER V7.01 DS1820 07/11/2004 16:17:48 PAGE 2
56 1
57 1 //等待400us,应检测到高电平,低电平信号保持60~240us
58 1 i = 65;
59 1 while (i--);
60 1 if(TMDAT)
61 1 {
62 2 return TRUE;
63 2 }
64 1 else
65 1 {
66 2 return FALSE;
67 2 }
68 1 }
69
70 //函数功能:从总线上读取1位信号
71 bit RdBit (void)
72 {
73 1 U16 i;
74 1 bit b0;
75 1 TMDAT = 0; i++; //下降沿之后,保持低电平至少1us //
76 1 TMDAT = 1; i++; i++; //微量延时(既作输入又作输出的I/O脚,读数据时,先拉高电平)
77 1
78 1 b0 = TMDAT;
79 1 i = 9;
80 1 while (i--); //延时60us
81 1 return (b0);
82 1 }
83
84 //函数功能:从总线上读取1个字节信号
85 U8 RdByte (void)
86 {
87 1 U8 i,j,byRdData=0;
88 1
89 1 for (i=0;i<8;i++)
90 1 {
91 2 j = RdBit ();
92 2 byRdData >>= 1;
93 2 byRdData = (j << 7) | byRdData;
94 2 }
95 1 return (byRdData);
96 1 }
97
98 //函数功能:向总线上写一位数据
99 void WrBit(bit b0)
100 {
101 1 U8 i;
102 1
103 1 if (b0)
104 1 {
105 2 TMDAT = 0; //产生一个下降沿,低电平至少保持1us //
106 2 i++; i++;
107 2 TMDAT = 1; //输出1
108 2 i = 9; while (i--); //高电平保持60us //
109 2 }
110 1 else
111 1 {
112 2 TMDAT = 0; // 写0
113 2 i = 9; while (i--); //低电平保持60us //
114 2 TMDAT = 1;
115 2 i++; i++;
116 2 }
117 1 }
C51 COMPILER V7.01 DS1820 07/11/2004 16:17:48 PAGE 3
118
119 //向总线上写一个字节
120 void WrByte (U8 dat)
121 {
122 1 U8 i;
123 1 bit testb;
124 1 for (i=0;i<8;i++)
125 1 {
126 2 testb = dat & 0x01;
127 2 dat = dat >> 1;
128 2 WrBit(testb);
129 2 }
130 1 }
131
132 //函数功能 :写1-Wire协议头操作(复位芯片、选择芯片、写命令码)
133 //输入参数 :<pSN>芯片序号
134 // : <byCommand>命令码
135 void SendHeaderData(U8 *pSN, U8 byCommand)
136 {
137 1 U8 i;
138 1
139 1 ResetChip(); //复位
140 1 Delay_ms(1); //延时
141 1
142 1 //***********************
143 1 //如果总线上只有一个设备,不需要选择芯片操作
144 1 #if (CHIP_NUM_IN_WIRE == 1)
WrByte(0xcc); //总线上只有一个设备,跳过芯片匹配步骤
#else
147 1 WrByte(0x55); //发送ROM匹配命令
148 1 for(i=0;i<8;i++)
149 1 {
150 2 WrByte(*pSN++); //发送64位序列号
151 2 }
152 1 #endif
153 1
154 1 WrByte(byCommand); //发送读取中间寄存器命令
155 1 }
156
157 //函数功能 : 读温度芯片中间寄存器(从偏移地址0开始)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -