📄 iic_c51.lst
字号:
C51 COMPILER V8.02 IIC_C51 03/20/2008 16:38:57 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE IIC_C51
OBJECT MODULE PLACED IN IIC_C51.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE IIC_C51.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2 /*
3 * Copyright (c) 2006,北京航空航天大学光电研究所
4 * All rights reserved.
5 *
6 * 文件名称:uart.h
7 * 文件标识:uart
8 * 摘 要:串口通讯的相关定义
9 *
10 * 当前版本:1.0
11 * 作 者:jyduan
12 * 完成日期:2006年3月日
13 *
14 * 取代版本:
15 * 原作者 :
16 * 完成日期:
17 */
18
19
20 /********************************************************************
21 IIC_C51.C
22 此程序是I2C操作平台(主方式的软件平台)的底层的C子程序,如发送数据
23 及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的
24 与用户程序连接并扩展.....
25
26 注意:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作
27 一定的修改....(本例是1us机器周期,即晶振频率要小于12MHZ)
28
29 ********************************************************************/
30
31 #include "REGX52.H" /*头文件的包含*/
32 #include <intrins.h>
33 #include "IIC_C51.h"
34 #include "uart.h"
35
36 #define uchar unsigned char /*宏定义*/
37 #define uint unsigned int
38
39 #define _Nop() _nop_() /*定义空指令*/
40
41 /* 常,变量定义区 */
42
43 /*端口位定义*/
44 #define SDA P2_0 /*模拟I2C数据传送位*/
45 #define SCL P2_1 /*模拟I2C时钟控制位*/
46
47 /*状态标志*/
48 bit ack; /*应答标志位*/
49
50
51 //void IICWait(uchar freq);
52
53 /*******************************************************************
54 起动总线函数
55 函数原型: void Start_I2c();
C51 COMPILER V8.02 IIC_C51 03/20/2008 16:38:57 PAGE 2
56 功能: 启动I2C总线,即发送I2C起始条件.
57
58 ********************************************************************/
59 void Start_I2c()
60 {
61 1 SDA = 1; /*发送起始条件的数据信号*/
62 1 _Nop();
63 1 SCL = 1;
64 1 IICWait(20); /*起始条件建立时间大于4.7us,延时*/
65 1 SDA = 0; /*发送起始信号*/
66 1 IICWait(20); /* 起始条件锁定时间大于4μs*/
67 1 SCL = 0; /*钳住I2C总线,准备发送或接收数据 */
68 1 _Nop();
69 1 _Nop();
70 1 _Nop();
71 1 _Nop();
72 1 }
73
74
75
76
77 /*******************************************************************
78 结束总线函数
79 函数原型: void Stop_I2c();
80 功能: 结束I2C总线,即发送I2C结束条件.
81
82 ********************************************************************/
83 void Stop_I2c()
84 {
85 1 SDA = 0; /*发送结束条件的数据信号*/
86 1 _Nop(); /*发送结束条件的时钟信号*/
87 1 _Nop();
88 1 SCL = 1; /*结束条件建立时间大于4μs*/
89 1 IICWait(20);
90 1 SDA = 1; /*发送I2C总线结束信号*/
91 1 _Nop();
92 1 _Nop();
93 1 _Nop();
94 1 _Nop();
95 1 _Nop();
96 1 _Nop();
97 1 _Nop();
98 1 _Nop();
99 1 }
100
101
102
103
104 /*******************************************************************
105 字节数据传送函数
106 函数原型: void SendByte(uchar c);
107 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
108 此状态位进行操作.(不应答或非应答都使ack=0 假)
109 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
110 ********************************************************************/
111 void SendByte(uchar c)
112 {
113 1 uchar BitCnt;
114 1
115 1 for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
116 1 {
117 2 if((c<<BitCnt)&0x80) SDA = 1; /*判断发送位*/
C51 COMPILER V8.02 IIC_C51 03/20/2008 16:38:57 PAGE 3
118 2 else SDA = 0;
119 2 _Nop();
120 2 _Nop();
121 2 SCL = 1; /*置时钟线为高,通知被控器开始接收数据位*/
122 2 IICWait(20); /*保证时钟高电平周期大于4μs*/
123 2 SCL = 0;
124 2 }
125 1
126 1 _Nop();
127 1 _Nop();
128 1 _Nop();
129 1 _Nop();
130 1
131 1 SDA = 1; /*8位发送完后释放数据线,准备接收应答位*/
132 1 _Nop();
133 1 _Nop();
134 1 _Nop();
135 1 _Nop();
136 1
137 1 SCL = 1; //sda有效了
138 1 _Nop();
139 1 _Nop();
140 1 _Nop();
141 1 _Nop();
142 1 _Nop();
143 1
144 1 if(SDA == 1)
145 1 {
146 2 ack = 0;
147 2 // printu("ACK = 0,no refelction \n");
148 2 }
149 1 else
150 1 {
151 2 ack = 1; /*判断是否接收到应答信号*/
152 2 // printu("ACK = 1,have refelction \n");
153 2 }
154 1
155 1 SCL = 0;
156 1 _Nop();
157 1 _Nop();
158 1 _Nop();
159 1 _Nop();
160 1 }
161
162
163
164
165
166
167 /*******************************************************************
168 字节数据传送函数
169 函数原型: uchar RcvByte();
170 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
171 发完后请用应答函数。
172 ********************************************************************/
173 uchar RcvByte()
174 {
175 1 uchar retc;
176 1 uchar BitCnt;
177 1
178 1 retc = 0;
179 1 SDA = 1; /*置数据线为输入方式*/
C51 COMPILER V8.02 IIC_C51 03/20/2008 16:38:57 PAGE 4
180 1 for (BitCnt=0;BitCnt<8;BitCnt++)
181 1 {
182 2 _Nop();
183 2 _Nop();
184 2 SCL = 0; /*置时钟线为低,准备接收数据位*/
185 2 IICWait(20); /*时钟低电平周期大于4.7μs*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -