?? clock.lst
字號:
C51 COMPILER V7.07 CLOCK 09/14/2005 15:20:46 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE CLOCK
OBJECT MODULE PLACED IN Clock.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Clock.c LARGE OPTIMIZE(9,SPEED) BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //
2 // I2C操作函數庫
3 // I2C有關概念參見《MCS-51系列單片機應用及接口技術》P289
4 //
5 // idata=14
6
7 #include "Global.h"
8
9 ///////////////////////////////////////////////////////////////////////////////
10 // 內部存儲區變量 0~128字節 直接尋址
11 // 全局變量定義
12 extern data uchar cur_time[15]; // 系統當前時間顯示存儲區 XXXX年XX月XX日XX時XX分XX秒星期X
13 extern data uchar time[10]; // 讀取時鐘存儲區
14 extern bdata bit ack; // 時鐘I2C總線通信應答狀態
15
16 //
17 // 在I2C總線數據傳送過程中,定義了一種開始和結束信號(有時也稱啟動和停止信號),
18 // 開始和結束信號的定義在I2C協議中具有十分重要的意義。當SCL為高電平時,SDA發生
19 // 高到低跳變定義為開始信號;當SCL為高電平時,SDA發生低到高跳變定義為結束信號,
20 // 開始和結束信號的定義參見《MCS-51系列單片機應用及接口技術》P291所示。開始和
21 // 結束信號都是由主器件(這里是8051單片機)發出的。在開始信號以后,總線被認為
22 // 是忙的。在結束信號后過一定時間,總線被認為是空閑的。如果連接在總線上的器件
23 // 具有相應的硬件接口電路,開始和結束信號的檢測還比較容易,但是沒有這種硬件接
24 // 口電路的微處理器必須在一個時鐘周期內至少2次采樣,SDA才能檢測到這種跳變。
25 //
26
27
28 //
29 // 啟動I2C總線
30 // 函數原型:void Start_I2c8563();
31 // 功能:
32 // 啟動I2C時鐘8563總線,即發送I2C起始條件
33 //
34 void Start_I2c8563()
35 {
36 1 SDA=1; // SDA維持高電平,準備發送起始信號
37 1 SCL=1; // SCL為高電平,SDA由高變低,表明通信起始信號
38 1 Some_NOP; // SCL信號高電平維持至少4us,等待電平穩定
39 1 SDA=0; // 發送起始信號,SDA下跳
40 1 Some_NOP; // 起始信號至少維持4.7us
41 1 SCL=0; // 時鐘信號跳變
42 1 Some_NOP; // 等待一段時間
43 1 }
44
45 //
46 // 結束I2C總線
47 // 函數原型: void Stop_I2c8563();
48 // 功能:
49 // 結束I2C總線,即發送I2C結束條件.
50 //
51 void Stop_I2c8563()
52 {
53 1 SDA=0; // SDA維持低電平,準備發送停止信號
54 1 _Nop();
55 1 SCL=1; // SCL信號高電平,SDA由低變高,表明通信停止信號
C51 COMPILER V7.07 CLOCK 09/14/2005 15:20:46 PAGE 2
56 1 Some_NOP; // SCL信號高電平維持至少4us
57 1 SDA=1; // 發送停止信號
58 1 Some_NOP; // 停止信號至少維持4us
59 1 }
60
61
62 //
63 // 送到SDA線上的每個字節必須為8位長度,每次傳送的字節數是不受限制的,每個字節后
64 // 面必須跟隨一個響應位。數據傳送時先傳送最高位。如果接收器不能接收下一個字節(
65 // 例如正在處理一個內部中斷,在這個中斷處理完之前不能接收I2C總線上的數據字節),
66 // 可以使時鐘保持低電平,迫使主處理器處于等待狀態。當從器件準備好接收下一個數據
67 // 字節時就釋放SCL,以便數據繼續傳送。
68 //
69 // 接收器必須確認數據的接收,確認位相對于主器件產生一個時鐘在這個時鐘內發送器件
70 // 釋放SDA線。接收器件在這個時鐘內必須將SDA拉成低電平,使SDA在該時鐘的高電平期間
71 // 為穩定的低電平。
72 // 通常,被尋址的接收器件必須在收到每個字節后發出響應信息。若一個從器件在處理一
73 // 個實時事件不能接收數據時,從器件必須使SDA保持高電平。此時,主器件產生一個結
74 // 束信號使傳送異常結束。
75 // 在主器件接收的傳送中,主器件對最后一個數據字節不予確認,以對從發送器指出數據
76 // 傳送的結束,從發送器釋放SDA線,使主器件能產生一個結束信號。
77 //
78
79 // 字節數據傳送函數,,向從器件寫一個字節
80 // 函數原型: void SendByte8563(uchar c);
81 // 功能:
82 // 將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對
83 // 此狀態位進行操作.(不應答或非應答都使ack=0 假)
84 // 發送數據正常,ack=1; ack=0表示被控器無應答或損壞。
85 //
86 void SendByte8563(uchar c)
87 {
88 1 idata uchar i;
89 1
90 1 for(i=0;i<8;i++)// 每字節必須8位長度
91 1 {
92 2 if((c<<i)&0x80)
93 2 {
94 3 SDA=1; // 數據最高位先發送,數據1
95 3 }
96 2 else
97 2 {
98 3 SDA=0; // 數據0
99 3 }
100 2 _Nop();
101 2 SCL=1; // 每個主器件在SCL線上產生時鐘,數據僅在
102 2 // 時鐘的高電平期間有效,鎖存數據。
103 2 Some_NOP; // 保證SCL時鐘高電平至少為4us
104 2 SCL=0; // 時鐘低電平,準備寫入下一個字節
105 2 _Nop(); // 等待
106 2 _Nop();
107 2 }
108 1
109 1 _Nop();
110 1 _Nop();
111 1 SDA=1; // 8位數據發送完畢,檢測從器件響應
112 1 _Nop();
113 1 _Nop();
114 1 SCL=1; // SCL為高電平,發送第9時鐘作為應答信號
115 1 _Nop();
116 1 _Nop();
117 1 _Nop();
C51 COMPILER V7.07 CLOCK 09/14/2005 15:20:46 PAGE 3
118 1 if(SDA==1)
119 1 ack=0; // 從器件保持SDA為高電平,發送異常
120 1 else
121 1 ack=1; // 從器件拉低SDA為低電平,發送正常
122 1
123 1 SCL=0; // SCL為低電平,清除時鐘
124 1 _Nop();
125 1 _Nop();
126 1 }
127
128 //
129 // 字節數據傳送函數,讀出從器件一個字節
130 // 函數原型: uchar RcvByte();
131 // 功能:
132 // 用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
133 // 發完后請用應答函數。
134 //
135 uchar RcvByte8563()
136 {
137 1 idata uchar temp=0;
138 1 idata uchar i;
139 1
140 1 SDA=1; // 準備接收數據
141 1 for(i=0;i<8;i++)
142 1 {
143 2 _Nop();
144 2 SCL=0; // SCL時鐘下跳準備接收數據
145 2 Some_NOP; // SCL時鐘信號,最小低電平為4.7us
146 2 SCL=1; // 時鐘上跳
147 2 _Nop(); // 等待數據出現
148 2 _Nop();
149 2 temp=temp<<1; // 數據移位
150 2 if(SDA==1)
151 2 temp=temp+1;// 接收數據位
152 2 _Nop(); // 接收下一位數據
153 2 _Nop();
154 2 }
155 1
156 1 SCL=0; // 準備發送結束信號
157 1 _Nop();
158 1 _Nop();
159 1 return temp; // 返回接收到的字節
160 1 }
161
162 //
163 // 應答子函數
164 // 原型: void Ack_I2c8563(bit a);
165 // 功能:
166 // 主控器進行應答信號,(可以是應答或非應答信號)
167 //
168 void Ack_I2c8563(bit a)
169 {
170 1 if(a==0)
171 1 SDA=0; // 發應答信號
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -