📄 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 + -