📄 gettime.lst
字号:
C51 COMPILER V7.06 GETTIME 12/17/2006 14:56:13 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE GETTIME
OBJECT MODULE PLACED IN GetTime.OBJ
COMPILER INVOKED BY: E:\My Electronic\Tools\Design tools\keil7.06\C51\BIN\C51.EXE GetTime.c LARGE OPTIMIZE(SIZE)
stmt level source
1 #include <REG52.H>
2 #include <intrins.h>
3
4 #define DS1307_Addr 0xd0 //前七位为器件地址,最后一位为读写位,为0时写,为1时读
5
6 //端口位定义
7 sbit SDA=P3^5; //模拟I2C数据传送位
8 sbit SCL=P3^4; //模拟I2C时钟控制位
9
10 void delay_us(unsigned char us);
11
12 /*******************************************************************
13 起动总线函数
14 函数原型: void Start_I2c();
15 功能: 启动I2C总线,即发送I2C起始条件.
16 ********************************************************************/
17 void IIC_Start()//在SCL处于高电平状态,SDA从高电平到低电平的跳变表示数据传输起始
18 {
19 1 SDA=1; //发送起始条件的数据信号
20 1 _nop_();
21 1 SCL=1;
22 1 delay_us(5); //起始条件建立时间大于4.7us,延时
23 1 SDA=0; //发送起始信号
24 1 delay_us(4); //起始条件锁定时间大于4us
25 1 SCL=0; //钳住I2C总线,准备发送或接收数据 起始条件已发送准备发送数据
26 1 delay_us(2);
27 1 }
28
29 /*******************************************************************
30 结束总线函数
31 函数原型: void Stop_I2c();
32 功能: 结束I2C总线,即发送I2C结束条件.
33 ********************************************************************/
34 void IIC_Stop()//在SCL处于高电平的时候,SDA从低电平向高电平的跳变表示结束数据传输
35 {
36 1 SDA=0; //发送结束条件的数据信号
37 1 _nop_(); //发送结束条件的时钟信号
38 1 SCL=1;
39 1 delay_us(4); //结束条件建立时间大于4us
40 1 SDA=1; //发送I2C总线结束信号
41 1 delay_us(4);
42 1 }
43
44 /*******************************************************************
45 字节数据传送函数
46 函数原型: void SendByte(unsigned char c);
47 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
48 此状态位进行操作.(不应答或非应答都使ack=0 假)
49 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
50 ********************************************************************/
51 void IIC_SendByte(unsigned char write_data)
52 {
53 1 unsigned char i;
54 1
55 1 for(i=0;i<8;i++) //要传送的数据长度为8位
C51 COMPILER V7.06 GETTIME 12/17/2006 14:56:13 PAGE 2
56 1 {
57 2 delay_us(2);
58 2 if(write_data&0x80)
59 2 SDA=1; //判断发送位
60 2 else
61 2 SDA=0;
62 2 write_data <<= 1;
63 2 delay_us(2);
64 2 SCL=1; //置时钟线为高,通知被控器开始接收数据位
65 2 delay_us(6); //保证时钟高电平周期大于4us
66 2 SCL=0;
67 2 }
68 1 SDA=1; //8位发送完后释放数据线,准备接收应答位
69 1 delay_us(5);
70 1 SCL=1;
71 1 while (SDA); //等待应答信号
72 1 _nop_();
73 1 SCL = 0;
74 1 }
75
76 /*******************************************************************
77 字节数据接收函数
78 函数原型: unsigned char RcvByte();
79 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
80 发完后请用应答函数。
81 ********************************************************************/
82 unsigned char IIC_ReadByte()
83 {
84 1 unsigned char iic_data_temp,i; //iic_data_temp用来接受数据
85 1
86 1 SDA=1; //置数据线为输入方式,释放数据总线
87 1 for(i=0;i<8;i++)
88 1 {
89 2 delay_us(3);
90 2 SCL = 0; //置时钟线为低,准备接收数据位,SDA变化在这段时间出现
91 2 delay_us(6); //时钟低电平周期大于4.7us
92 2 SCL = 1; //置时钟线为高使数据线上数据有效
93 2 delay_us(2);
94 2 iic_data_temp <<= 1;
95 2 if(SDA)
96 2 iic_data_temp +=1; //读数据位,接收的数据位放入iic_data_temp中
97 2 delay_us(2);
98 2 }
99 1 SCL=0;
100 1 _nop_();
101 1 return(iic_data_temp);
102 1 }
103
104
105 /********************************************************************
106 应答子函数
107 原型: void Ack_I2c(bit a);
108 功能:主控器进行应答信号,(可以是应答或非应答信号)
109 ********************************************************************/
110 void IIC_Ack(bit a)
111 {
112 1
113 1 if(a==0)
114 1 SDA=0; //在此发出应答或非应答信号
115 1 else
116 1 SDA=1;
117 1 delay_us(3);
C51 COMPILER V7.06 GETTIME 12/17/2006 14:56:13 PAGE 3
118 1 SCL=1;
119 1 delay_us(6); //时钟低电平周期大于4us
120 1 SCL=0; //清时钟线,钳住I2C总线以便继续接收
121 1 _nop_();
122 1 }
123
124
125
126 unsigned char DS1307_Read(unsigned char Addr)
127 {
128 1 unsigned char read_data; //存放读出的数据
129 1
130 1 //随机读取,先进行伪写,使指针移到要读的单元
131 1 IIC_Start(); //启动总线
132 1 IIC_SendByte(DS1307_Addr); //发送器件地址
133 1 IIC_SendByte(Addr); //发送要写的地址
134 1
135 1 //读取单元内容
136 1 IIC_Start();
137 1 IIC_SendByte(DS1307_Addr+1);
138 1 read_data=IIC_ReadByte();
139 1 IIC_Ack(1);
140 1 IIC_Stop();
141 1 return(read_data);
142 1 }
143
144
145 void DS1307_Write(unsigned char Addr,unsigned char wdata)
146 {
147 1 IIC_Start(); //启动总线
148 1 IIC_SendByte(DS1307_Addr); //发送器件地址
149 1 IIC_SendByte(Addr); //发送要写的地址
150 1 IIC_SendByte(wdata);
151 1 IIC_Stop();
152 1 }
153
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 293 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- 8
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -