?? ds1820.lst
字號(hào):
C51 COMPILER V8.08 DS1820 08/03/2007 13:39:32 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE DS1820
OBJECT MODULE PLACED IN ds1820.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ds1820.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //**********************************************************************
2 //功能 : 實(shí)時(shí)時(shí)鐘DS1820操作模塊
3 //作者 : lihj
4 //創(chuàng)建日期 : 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; //根據(jù)實(shí)實(shí)際情況設(shè)定
13
14 //函數(shù)功能:延時(shí)(12MHz晶振)
15 //輸入?yún)?shù):<count>延時(shí)時(shí)間長(zhǎng)度,單位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 //函數(shù)功能:復(fù)位芯片(至少480us長(zhǎng)的低電平信號(hào))
28 void ResetChip (void)
29 {
30 1 U16 i;
31 1
32 1 TMDAT = 0; //480us~960us長(zhǎng)低電平:復(fù)位
33 1 i = 150;
34 1 while (i--); //延時(shí)約900 uS(12Mhz時(shí))
35 1 TMDAT = 1;
36 1 i = 5;
37 1 while (i--); //DS1820檢測(cè)到上升沿后,過(guò)15~60us后輸出“存在”信號(hào)
38 1 }
39
40 //函數(shù)功能: 判斷DS1820是否存在
41 //返回參數(shù): TRUE:芯片存在
42 // FALSE:芯片不存在
43 U8 ChipPresenceCheck(void)
44 {
45 1 U16 i;
46 1
47 1 ResetChip();
48 1
49 1 //等待70us,應(yīng)該檢測(cè)到低電平
50 1 i = 11;
51 1 while(i--);
52 1 if(TMDAT)
53 1 {
54 2 return FALSE;
55 2 }
C51 COMPILER V8.08 DS1820 08/03/2007 13:39:32 PAGE 2
56 1
57 1 //等待400us,應(yīng)檢測(cè)到高電平,低電平信號(hào)保持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 //函數(shù)功能:從總線上讀取1位信號(hào)
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++; //微量延時(shí)(既作輸入又作輸出的I/O腳,讀數(shù)據(jù)時(shí),先拉高電平)
77 1
78 1 b0 = TMDAT;
79 1 i = 9;
80 1 while (i--); //延時(shí)60us
81 1 return (b0);
82 1 }
83
84 //函數(shù)功能:從總線上讀取1個(gè)字節(jié)信號(hào)
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 //函數(shù)功能:向總線上寫(xiě)一位數(shù)據(jù)
99 void WrBit(bit b0)
100 {
101 1 U8 i;
102 1
103 1 if (b0)
104 1 {
105 2 TMDAT = 0; //產(chǎn)生一個(gè)下降沿,低電平至少保持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; // 寫(xiě)0
113 2 i = 9; while (i--); //低電平保持60us //
114 2 TMDAT = 1;
115 2 i++; i++;
116 2 }
117 1 }
C51 COMPILER V8.08 DS1820 08/03/2007 13:39:32 PAGE 3
118
119 //向總線上寫(xiě)一個(gè)字節(jié)
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 //函數(shù)功能 :寫(xiě)1-Wire協(xié)議頭操作(復(fù)位芯片、選擇芯片、寫(xiě)命令碼)
133 //輸入?yún)?shù) :<pSN>芯片序號(hào)
134 // : <byCommand>命令碼
135 void SendHeaderData(U8 *pSN, U8 byCommand)
136 {
137 1 U8 i;
138 1
139 1 ResetChip(); //復(fù)位
140 1 Delay_ms(1); //延時(shí)
141 1
142 1 //***********************
143 1 //如果總線上只有一個(gè)設(shè)備,不需要選擇芯片操作
144 1 #if (CHIP_NUM_IN_WIRE == 1)
WrByte(0xcc); //總線上只有一個(gè)設(shè)備,跳過(guò)芯片匹配步驟
#else
147 1 WrByte(0x55); //發(fā)送ROM匹配命令
148 1 for(i=0;i<8;i++)
149 1 {
150 2 WrByte(*pSN++); //發(fā)送64位序列號(hào)
151 2 }
152 1 #endif
153 1
154 1 WrByte(byCommand); //發(fā)送讀取中間寄存器命令
155 1 }
156
157 //函數(shù)功能 : 讀溫度芯片中間寄存器(從偏移地址0開(kāi)始)
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -