?? 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子程序,如發(fā)送數(shù)據(jù)
4 及接收數(shù)據(jù),應答位發(fā)送,并提供了幾個直接面對器件的操作函數(shù),它很方便的
5 與用戶程序連接并擴展.....
6
7 注意:函數(shù)是采用軟件延時的方法產生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 /* 常,變量定義區(qū) */
23
24 /*端口位定義*/
25 sbit SDA=P1^7; /*模擬I2C數(shù)據(jù)傳送位*/
26 sbit SCL=P1^6; /*模擬I2C時鐘控制位*/
27
28 /*狀態(tài)標志*/
29 bit ack; /*應答標志位*/
30
31
32
33
34
35
36 /*******************************************************************
37 起動總線函數(shù)
38 函數(shù)原型: void Start_I2c();
39 功能: 啟動I2C總線,即發(fā)送I2C起始條件.
40
41 ********************************************************************/
42 void Start_I2c()
43 {
44 1 SDA=1; /*發(fā)送起始條件的數(shù)據(jù)信號*/
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; /*發(fā)送起始信號*/
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總線,準備發(fā)送或接收數(shù)據(jù) */
59 1 _Nop();
60 1 _Nop();
61 1 }
62
63
64
65
66 /*******************************************************************
67 結束總線函數(shù)
68 函數(shù)原型: void Stop_I2c();
69 功能: 結束I2C總線,即發(fā)送I2C結束條件.
70
71 ********************************************************************/
72 void Stop_I2c()
73 {
74 1 SDA=0; /*發(fā)送結束條件的數(shù)據(jù)信號*/
75 1 _Nop(); /*發(fā)送結束條件的時鐘信號*/
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; /*發(fā)送I2C總線結束信號*/
83 1 _Nop();
84 1 _Nop();
85 1 _Nop();
86 1 _Nop();
87 1 }
88
89
90
91
92 /*******************************************************************
93 字節(jié)數(shù)據(jù)傳送函數(shù)
94 函數(shù)原型: void SendByte(uchar c);
95 功能: 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應答,并對
96 此狀態(tài)位進行操作.(不應答或非應答都使ack=0 假)
97 發(fā)送數(shù)據(jù)正常,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++) /*要傳送的數(shù)據(jù)長度為8位*/
104 1 {
105 2 if((c<<BitCnt)&0x80)SDA=1; /*判斷發(fā)送位*/
106 2 else SDA=0;
107 2 _Nop();
108 2 SCL=1; /*置時鐘線為高,通知被控器開始接收數(shù)據(jù)位*/
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位發(fā)送完后釋放數(shù)據(jù)線,準備接收應答位*/
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 字節(jié)數(shù)據(jù)傳送函數(shù)
140 函數(shù)原型: uchar RcvByte();
141 功能: 用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應答信號),
142 發(fā)完后請用應答函數(shù)。
143 ********************************************************************/
144 uchar RcvByte()
145 {
146 1 uchar retc;
147 1 uchar BitCnt;
148 1
149 1 retc=0;
150 1 SDA=1; /*置數(shù)據(jù)線為輸入方式*/
151 1 for(BitCnt=0;BitCnt<8;BitCnt++)
152 1 {
153 2 _Nop();
154 2 SCL=0; /*置時鐘線為低,準備接收數(shù)據(jù)位*/
155 2 _Nop();
156 2 _Nop(); /*時鐘低電平周期大于4.7μs*/
157 2 _Nop();
158 2 _Nop();
159 2 _Nop();
160 2 SCL=1; /*置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效*/
161 2 _Nop();
162 2 _Nop();
163 2 retc=retc<<1;
164 2 if(SDA==1)retc=retc+1; /*讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中 */
165 2 _Nop();
166 2 _Nop();
167 2 }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -