📄 66.lst
字号:
C51 COMPILER V8.05a 66 03/06/2012 21:09:20 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE 66
OBJECT MODULE PLACED IN 66.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE 66.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg52.h>
2 #include<intrins.h>
3 #include "string.h"
4
5 #define DelayTime 10 //DelayTime用于控制IIC的速度,有些器件可能并不支持高速的IIC通信
6 //可以调整DelayTime来调节IIC的速度
7
8 sbit speak=P1^4;
9 struct Time //时间结构体,包括了秒,分,时,日,周,月,年
10 {
11 unsigned char second;
12 unsigned char minute;
13 unsigned char hour;
14 unsigned char day;
15 unsigned char week;
16 unsigned char month;
17 unsigned char year;
18 };
19
20
21 extern struct Time time; //用来装时间数据,需要在外部定义
22
23 //函数声明
24 unsigned char P8563_Read_Time();
25 unsigned char P8563_Set_Time();
26
27 void delay1(unsigned int i)
28 {
29 1 while(i--);
30 1 }
31
32 void delay(unsigned int time)
33 {
34 1 while(time--);
35 1 }
36
37 unsigned char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字表
38
39
40 //端口定义
41 sbit SCL=P1^0; //IIC的时钟线
42 sbit SDA=P1^1; //IIC的数据线
43
44 //函数声明
45 void IIC_Start();
46 void IIC_Stop();
47 void IIC_Ack();
48 void IIC_NAck();
49 unsigned char IIC_Get_Ack();
50 unsigned char IIC_Write_Byte(unsigned char dat);
51 unsigned char IIC_Read_Byte();
52
53 struct Time time; //用于装载时间数据的结构体型的变量time
54
55 void IIC_Start()
C51 COMPILER V8.05a 66 03/06/2012 21:09:20 PAGE 2
56 {
57 1 SDA=1;
58 1 delay(DelayTime);
59 1 SCL=1;
60 1 delay(DelayTime);
61 1 SDA=0;
62 1 delay(DelayTime);
63 1 SCL=0;
64 1 delay(DelayTime);
65 1 }
66
67 /******************************************************************
68 - 功能描述:IIC结束
69 - 隶属模块:IIC模块
70 - 函数属性:外部,供用户使用
71 - 参数说明:无
72 - 返回说明:无
73 - 注:无
74 ******************************************************************/
75
76 void IIC_Stop()
77 {
78 1 SDA=0;
79 1 delay(DelayTime);
80 1 SCL=1;
81 1 delay(DelayTime);
82 1 SDA=1;
83 1 delay(DelayTime);
84 1 SCL=0;
85 1 delay(DelayTime);
86 1 }
87
88 /*********************************************************************
89 - 功能描述:主设备发出应答
90 - 隶属模块:IIC模块
91 - 函数属性:外部,供用户使用
92 - 参数说明:无
93 - 返回说明:无
94 - 注:主设备(比如单片机),从从设备(比如PCF8563、AT24C64)读取字节后,如果
95 要继续读取,就要给从设备一个ACK(即所谓的“应答”,数据位SDA为0)
96 *********************************************************************/
97
98 void IIC_Ack()
99 {
100 1 SDA=0;
101 1 delay(DelayTime);
102 1 SCL=1;
103 1 delay(DelayTime);
104 1 SCL=0;
105 1 delay(DelayTime);
106 1 }
107
108 /*********************************************************************
109 - 功能描述:主设备发出无应答
110 - 隶属模块:IIC模块
111 - 函数属性:外部,供用户使用
112 - 参数说明:无
113 - 返回说明:无
114 - 注:主设备(比如单片机),从从设备(比如PCF8563、AT24C64)读取字节后,如果不再
115 进行读取,就要给从设备一个NACK(即所谓的“无应答”,数据位SDA为1)
116 *********************************************************************/
117
C51 COMPILER V8.05a 66 03/06/2012 21:09:20 PAGE 3
118 void IIC_NAck()
119 {
120 1 SDA=1;
121 1 delay(DelayTime);
122 1 SCL=1;
123 1 delay(DelayTime);
124 1 SCL=0;
125 1 delay(DelayTime);
126 1 }
127
128 /*********************************************************************
129 - 功能描述:主设备检测从设备应答
130 - 隶属模块:IIC模块
131 - 函数属性:外部,供用户使用
132 - 参数说明:无
133 - 返回说明:从设备的应答值
134 - 注:主设备(比如单片机),向从设备(比如PCF8563、AT24C64)写入字节后,要检测从
135 设备发出的应答,如果数据位SDA为0,说明向从设备成功写入了字节
136 *********************************************************************/
137
138 unsigned char IIC_Get_Ack()
139 {
140 1 unsigned char Error;
141 1 SDA=1;
142 1 delay(DelayTime);
143 1 SCL=1;
144 1 delay(DelayTime);
145 1 Error=SDA;
146 1 delay(DelayTime);
147 1 SCL=0;
148 1 delay(DelayTime);
149 1 return Error;
150 1 }
151
152 /*********************************************************************
153 - 功能描述:主设备向从设备写入一字节
154 - 隶属模块:IIC模块
155 - 函数属性:外部,供用户使用
156 - 参数说明:dat:将要写入的字节
157 - 返回说明:从设备的应答值
158 - 注:向从设备写入一个字节,并返回从设备的应答值
159 *********************************************************************/
160
161 unsigned char IIC_Write_Byte(unsigned char dat)
162 {
163 1 unsigned char i;
164 1 for(i=0;i<8;i++)
165 1 {
166 2 SDA=((dat<<i)&0x80);
167 2 SCL=1;
168 2 delay(DelayTime);
169 2 SCL=0;
170 2 delay(DelayTime);
171 2 }
172 1 return IIC_Get_Ack();
173 1 }
174
175 /*********************************************************************
176 - 功能描述:主设备从从设备读取一字节
177 - 隶属模块:IIC模块
178 - 函数属性:外部,供用户使用
179 - 参数说明:无
C51 COMPILER V8.05a 66 03/06/2012 21:09:20 PAGE 4
180 - 返回说明:读到的字节
181 - 注:无
182 *********************************************************************/
183
184 unsigned char IIC_Read_Byte()
185 {
186 1 unsigned char i,rbyte=0;
187 1 SDA=1;
188 1 for(i=0;i<8;i++)
189 1 {
190 2 SCL=1;
191 2 delay(DelayTime);
192 2 if(SDA) rbyte|=(0x80>>i);
193 2 SCL=0;
194 2 delay(DelayTime);
195 2 }
196 1 return rbyte;
197 1 }
198
199 unsigned char PCF8563_Write_Bytes(unsigned char addr,unsigned char length,unsigned char *pbuf)
200 {
201 1 unsigned char i=0;
202 1 IIC_Start(); //IIC通信开始
203 1 if(IIC_Write_Byte(0xa2)) return 1; //写PCF8563的ID与读写控制位,通信有错误立即返回
204 1 if(IIC_Write_Byte(addr)) return 1; //写寄存器地址
205 1 for(i=0;i<length;i++) //写入length个字节
206 1 {
207 2 if(IIC_Write_Byte(pbuf[i])) return 1;//写数据
208 2 }
209 1 IIC_Stop();
210 1 return 0;
211 1 }
212
213 /******************************************************************
214 - 功能描述:从地址addr的寄存器读取多个字节
215 - 隶属模块:PCF8563驱动模块
216 - 函数属性:内部
217 - 参数说明:addr:寄存器地址
218 length:要读出的字节数
219 pbuf:指向数据缓冲区的指针
220 - 返回说明:操作结果,0表示成功,1表示失败
221 - 注:无
222 ******************************************************************/
223
224 unsigned char PCF8563_Read_Bytes(unsigned char addr,unsigned char length,unsigned char *pbuf) //从地址addr
-连续读取length个字节到pbuf
225 {
226 1 unsigned char i=0,err=0;
227 1 IIC_Start(); //IIC通信开始
228 1 if(IIC_Write_Byte(0xa2)) return 1; //写PCF8563的ID与读写控制位,通信有错误立即返回
229 1 if(IIC_Write_Byte(addr)) return 1; //写寄存器地址
230 1
231 1 IIC_Start(); //IIC通信开始
232 1 if(IIC_Write_Byte(0xa3)) return 1; //写PCF8563的ID与读写控制位
233 1 for(i=0;i<length-1;i++) //写入前length-1个字节,并作出应答
234 1 {
235 2 pbuf[i]=IIC_Read_Byte();
236 2 IIC_Ack();
237 2 }
238 1 pbuf[i]=IIC_Read_Byte(); //写入最后一个字节,并作出无应答
239 1 IIC_NAck();
240 1 IIC_Stop();
C51 COMPILER V8.05a 66 03/06/2012 21:09:20 PAGE 5
241 1 return 0;
242 1 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -