?? ds1820.lst
字號:
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 //功能 : 實時時鐘DS1820操作模塊
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 V8.08 DS1820 08/03/2007 13:39:32 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 V8.08 DS1820 08/03/2007 13:39:32 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 + -