📄 testtime.lst
字号:
C51 COMPILER V8.08 TESTTIME 11/27/2008 22:32:57 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE TESTTIME
OBJECT MODULE PLACED IN C:\DOCUME~1\ADMINI~1\桌面\我时间\TESTTIME.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE C:\DOCUME~1\ADMINI~1\桌面\我时间\TESTTIME.C DB SB OE
line level source
1 #include <reg52.H>
2 #include <absacc.h>
3 #include <string.h>
4 #include <intrins.h>
5 #include <math.h>
6 #define uint unsigned int
7 #define uchar unsigned char
8 #define ulong unsigned long
9
10 #define ulong unsigned long
11
12 //I2C定义位
13 sbit SDA=P2^1; //模拟I2C数据传送位
14 sbit SCL=P2^0; //模拟I2C时钟控制位
15 bit ack; //应答标志位
16
17 uchar P8563_Store[5]; /*时间交换区,全局变量声明*/
18 uchar code CP8563_Store[5]={0x21,0x09,0x28,0x11,0x08}; /*写入时间初值:08-11-20 00:00*/
19 /********************************************************************************
20 I2C总线协议
21 ********************************************************************************/
22
23
24 /*******************************************************************
25 (1) 起动总线函数
26 函数原型: void Start_I2c();
27 功能: 启动I2C总线,即发送I2C起始条件.
28
29 ********************************************************************/
30 void Start_I2c()
31 {
32 1 SDA=1; //发送起始条件的数据信号
33 1 _nop_();
34 1 SCL=1;
35 1 _nop_(); //起始条件建立时间大于4.7us,延时
36 1 _nop_();
37 1 _nop_();
38 1 _nop_();
39 1 _nop_();
40 1 SDA=0; //发送起始信号
41 1 _nop_(); // 起始条件锁定时间大于4μs
42 1 _nop_();
43 1 _nop_();
44 1 _nop_();
45 1 _nop_();
46 1 SCL=0; //钳住I2C总线,准备发送或接收数据
47 1 _nop_();
48 1 _nop_();
49 1 }
50 /*******************************************************************
51 (2)结束总线函数
52 函数原型: void Stop_I2c();
53 功能: 结束I2C总线,即发送I2C结束条件.
54 ********************************************************************/
55 void Stop_I2c()
C51 COMPILER V8.08 TESTTIME 11/27/2008 22:32:57 PAGE 2
56 {
57 1 SDA=0; //发送结束条件的数据信号
58 1 _nop_(); //发送结束条件的时钟信号
59 1 SCL=1; //结束条件建立时间大于4μs
60 1 _nop_();
61 1 _nop_();
62 1 _nop_();
63 1 _nop_();
64 1 _nop_();
65 1 SDA=1; //发送I2C总线结束信号
66 1 _nop_();
67 1 _nop_();
68 1 _nop_();
69 1 _nop_();
70 1 }
71 /*******************************************************************
72 (3)字节数据发送函数
73 函数原型: void SendByte(uchar c);
74 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
75 此状态位进行操作.(不应答或非应答都使ack=0 假)
76 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
77 ********************************************************************/
78 void SendByte(uchar c)
79 {
80 1 uchar BitCnt;
81 1 for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位
82 1 {
83 2 if((c<<BitCnt)&0x80)SDA=1; //判断发送位
84 2 else SDA=0;
85 2 _nop_();
86 2 SCL=1; //置时钟线为高,通知被控器开始接收数据位
87 2 _nop_();
88 2 _nop_(); //保证时钟高电平周期大于4μs
89 2 _nop_();
90 2 _nop_();
91 2 _nop_();
92 2 SCL=0;
93 2 }
94 1 _nop_();
95 1 _nop_();
96 1 SDA=1; //8位发送完后释放数据线,准备接收应答位
97 1 _nop_();
98 1 _nop_();
99 1 SCL=1;
100 1 _nop_();
101 1 _nop_();
102 1 _nop_();
103 1 if(SDA==1)ack=0;
104 1 else ack=1; //判断是否接收到应答信号
105 1 SCL=0;
106 1 _nop_();
107 1 _nop_();
108 1 }
109 /*******************************************************************
110 (4)字节数据接收函数
111 函数原型: uchar RcvByte();
112 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
113 发完后请用应答函数。
114 ********************************************************************/
115 uchar RcvByte()
116 {
117 1 uchar retc;
C51 COMPILER V8.08 TESTTIME 11/27/2008 22:32:57 PAGE 3
118 1 uchar BitCnt;
119 1
120 1 retc=0;
121 1 SDA=1; //置数据线为输入方式
122 1 for(BitCnt=0;BitCnt<8;BitCnt++)
123 1 {
124 2 _nop_();
125 2 SCL=0; //置时钟线为低,准备接收数据位
126 2 _nop_();
127 2 _nop_(); //时钟低电平周期大于4.7μs
128 2 _nop_();
129 2 _nop_();
130 2 _nop_();
131 2 SCL=1; //置时钟线为高使数据线上数据有效
132 2 _nop_();
133 2 _nop_();
134 2 retc=retc<<1;
135 2 if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中
136 2 _nop_();
137 2 _nop_();
138 2 }
139 1 SCL=0;
140 1 _nop_();
141 1 _nop_();
142 1 return(retc);
143 1 }
144 /********************************************************************
145 (5)应答子函数
146 原型: void Ack_I2c(bit a);
147
148 功能:主控器进行应答信号,(可以是应答或非应答信号)
149 ********************************************************************/
150 void Ack_I2c(bit a)
151 {
152 1
153 1 if(a==0)SDA=0; //在此发出应答或非应答信号
154 1 else SDA=1;
155 1 _nop_();
156 1 _nop_();
157 1 _nop_();
158 1 SCL=1;
159 1 _nop_();
160 1 _nop_(); //时钟低电平周期大于4μs
161 1 _nop_();
162 1 _nop_();
163 1 _nop_();
164 1 SCL=0; //清时钟线,钳住I2C总线以便继续接收
165 1 _nop_();
166 1 _nop_();
167 1 }
168 /*******************************************************************
169 (6)向无子地址器件发送字节数据函数
170 函数原型: bit ISendByte(uchar sla,ucahr c);
171 功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
172 如果返回1表示操作成功,否则操作有误。
173 注意: 使用前必须已结束总线。
174 ********************************************************************/
175 bit ISendByte(uchar sla,uchar c)
176 {
177 1 Start_I2c(); //启动总线
178 1 SendByte(sla); //发送器件地址
179 1 if(ack==0)return(0);
C51 COMPILER V8.08 TESTTIME 11/27/2008 22:32:57 PAGE 4
180 1 SendByte(c); //发送数据
181 1 if(ack==0)return(0);
182 1 Stop_I2c(); //结束总线
183 1 return(1);
184 1 }
185 /*******************************************************************
186 (7)向有子地址器件发送多字节数据函数
187 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
188 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
189 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
190 如果返回1表示操作成功,否则操作有误。
191 注意: 使用前必须已结束总线。
192 ********************************************************************/
193 bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
194 {
195 1 uchar i;
196 1
197 1 Start_I2c(); //启动总线
198 1 SendByte(sla); //发送器件地址
199 1 if(ack==0)return(0);
200 1 SendByte(suba); //发送器件子地址
201 1 if(ack==0)return(0);
202 1
203 1 for(i=0;i<no;i++)
204 1 {
205 2 SendByte(*s); //发送数据
206 2 if(ack==0)return(0);
207 2 s++;
208 2 }
209 1 Stop_I2c(); //结束总线
210 1 return(1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -