?? viic_c51.lst
字號:
C51 COMPILER V7.06 VIIC_C51 07/01/2003 16:02:57 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE VIIC_C51
OBJECT MODULE PLACED IN VIIC_C51.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE VIIC_C51.c BROWSE INCDIR(C:\Keil\C51\INC\) DEBUG OBJECTEXTEND
stmt level source
1 /********************************************************************
2 VIIC_C51.C
3 此程序是I2C操作平臺(主方式的軟件平臺)的底層的C子程序,如發送數據
4 及接收數據,應答位發送,并提供了幾個直接面對器件的操作函數,它很方便的
5 與用戶程序連接并擴展.....
6
7 注意:函數是采用軟件延時的方法產生SCL脈沖,固對高晶振頻率要作
8 一定的修改....(本例是1us機器周期,即晶振頻率要小于12MHZ)
9
10 ********************************************************************/
11
12
13
14 #include <reg52.h> /*頭文件的包含*/
15 #include <intrins.h>
16
17 #define uchar unsigned char /*宏定義*/
18 #define uint unsigned int
19
20 #define _Nop() _nop_() /*定義空指令*/
21
22 /* 常,變量定義區 */
23
24 /*端口位定義*/
25 sbit SDA=P1^7; /*模擬I2C數據傳送位*/
26 sbit SCL=P1^6; /*模擬I2C時鐘控制位*/
27
28 /*狀態標志*/
29 bit ack; /*應答標志位*/
30
31
32
33
34
35
36 /*******************************************************************
37 起動總線函數
38 函數原型: void Start_I2c();
39 功能: 啟動I2C總線,即發送I2C起始條件.
40
41 ********************************************************************/
42 void Start_I2c()
43 {
44 1 SDA=1; /*發送起始條件的數據信號*/
45 1 _Nop();
46 1 SCL=1;
47 1 _Nop(); /*起始條件建立時間大于4.7us,延時*/
48 1 _Nop();
49 1 _Nop();
50 1 _Nop();
51 1 _Nop();
52 1 SDA=0; /*發送起始信號*/
53 1 _Nop(); /* 起始條件鎖定時間大于4μs*/
54 1 _Nop();
55 1 _Nop();
C51 COMPILER V7.06 VIIC_C51 07/01/2003 16:02:57 PAGE 2
56 1 _Nop();
57 1 _Nop();
58 1 SCL=0; /*鉗住I2C總線,準備發送或接收數據 */
59 1 _Nop();
60 1 _Nop();
61 1 }
62
63
64
65
66 /*******************************************************************
67 結束總線函數
68 函數原型: void Stop_I2c();
69 功能: 結束I2C總線,即發送I2C結束條件.
70
71 ********************************************************************/
72 void Stop_I2c()
73 {
74 1 SDA=0; /*發送結束條件的數據信號*/
75 1 _Nop(); /*發送結束條件的時鐘信號*/
76 1 SCL=1; /*結束條件建立時間大于4μs*/
77 1 _Nop();
78 1 _Nop();
79 1 _Nop();
80 1 _Nop();
81 1 _Nop();
82 1 SDA=1; /*發送I2C總線結束信號*/
83 1 _Nop();
84 1 _Nop();
85 1 _Nop();
86 1 _Nop();
87 1 }
88
89
90
91
92 /*******************************************************************
93 字節數據傳送函數
94 函數原型: void SendByte(uchar c);
95 功能: 將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對
96 此狀態位進行操作.(不應答或非應答都使ack=0 假)
97 發送數據正常,ack=1; ack=0表示被控器無應答或損壞。
98 ********************************************************************/
99 void SendByte(uchar c)
100 {
101 1 uchar BitCnt;
102 1
103 1 for(BitCnt=0;BitCnt<8;BitCnt++) /*要傳送的數據長度為8位*/
104 1 {
105 2 if((c<<BitCnt)&0x80)SDA=1; /*判斷發送位*/
106 2 else SDA=0;
107 2 _Nop();
108 2 SCL=1; /*置時鐘線為高,通知被控器開始接收數據位*/
109 2 _Nop();
110 2 _Nop(); /*保證時鐘高電平周期大于4μs*/
111 2 _Nop();
112 2 _Nop();
113 2 _Nop();
114 2 SCL=0;
115 2 }
116 1
117 1 _Nop();
C51 COMPILER V7.06 VIIC_C51 07/01/2003 16:02:57 PAGE 3
118 1 _Nop();
119 1 SDA=1; /*8位發送完后釋放數據線,準備接收應答位*/
120 1 _Nop();
121 1 _Nop();
122 1 SCL=1;
123 1 _Nop();
124 1 _Nop();
125 1 _Nop();
126 1 if(SDA==1)ack=0;
127 1 else ack=1; /*判斷是否接收到應答信號*/
128 1 SCL=0;
129 1 _Nop();
130 1 _Nop();
131 1 }
132
133
134
135
136
137
138 /*******************************************************************
139 字節數據傳送函數
140 函數原型: uchar RcvByte();
141 功能: 用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
142 發完后請用應答函數。
143 ********************************************************************/
144 uchar RcvByte()
145 {
146 1 uchar retc;
147 1 uchar BitCnt;
148 1
149 1 retc=0;
150 1 SDA=1; /*置數據線為輸入方式*/
151 1 for(BitCnt=0;BitCnt<8;BitCnt++)
152 1 {
153 2 _Nop();
154 2 SCL=0; /*置時鐘線為低,準備接收數據位*/
155 2 _Nop();
156 2 _Nop(); /*時鐘低電平周期大于4.7μs*/
157 2 _Nop();
158 2 _Nop();
159 2 _Nop();
160 2 SCL=1; /*置時鐘線為高使數據線上數據有效*/
161 2 _Nop();
162 2 _Nop();
163 2 retc=retc<<1;
164 2 if(SDA==1)retc=retc+1; /*讀數據位,接收的數據位放入retc中 */
165 2 _Nop();
166 2 _Nop();
167 2 }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -