标题:
ds3231单片机程序 时间和温度发送到串口显示
[打印本页]
作者:
accumulation
时间:
2019-7-27 18:38
标题:
ds3231单片机程序 时间和温度发送到串口显示
IMG_0477.JPG
(5.58 MB, 下载次数: 47)
下载附件
效果展示
2019-7-27 18:34 上传
#include<global.h>
void DS3231WriteByte(unsigned char addr,unsigned char dat)
{
bit ack;
IICStart();
ack = IICWrite(0xD0);//写设备地址+写操作
while(~ack);
ack = IICWrite(addr);//内部寄存器指针
while(~ack);
ack = IICWrite(dat);//写数据
while(~ack);
IICStop();
}
void DS3231ReadByte(unsigned char addr,unsigned char *buf)
{
bit ack;
IICStart();
ack = IICWrite(0xD0);//写设备地址+写操作
while(~ack);
ack = IICWrite(addr);//内部寄存器指针
while(~ack);
IICStop();
IICStart();
ack = IICWrite(0xD1);//写设备地址+读操作
while(~ack);
*buf = IICReadNAK();//读一个字节数据
IICStop();
}
void DS3231Read7Byte(unsigned char *buf)
{
bit ack;
unsigned char i;
IICStart();
ack = IICWrite(0xD0);//写设备地址+写操作
while(~ack);
ack = IICWrite(0x00);//秒寄存器地址
while(~ack);
IICStop();
IICStart();
ack = IICWrite(0xD1);//写设备地址+读操作
while(~ack);
for(i=0;i<6;i++)
{ //上面写了秒寄存器地址,内部寄存器指针会自动+1
*buf++= IICReadACK();//所以只需要发送一个开始地址
} //读数据,发送还需要读数据的应答位
*buf= IICReadNAK();//读数据,不需要再读取数据应答位
IICStop();
}
void DS3231Write7Byte(unsigned char *dat)
{
bit ack;
unsigned char i;
IICStart();
ack = IICWrite(0xD0);//写设备地址+写操作
while(~ack);
ack = IICWrite(0x00);//秒寄存器地址
while(~ack);
for(i=0;i<7;i++)
{
ack = IICWrite(dat[i]);//连续写入数据7次,和上面同理
while(~ack);
}
IICStop();
}
void GetRealTime(struct sTime *time)
{
unsigned char buf[8];
DS3231Read7Byte(buf);
time->year = buf[6];
time->mon = buf[5];
time->day = buf[4];
time->hour = buf[2];
time->min = buf[1];
time->sec = buf[0];
time->week = buf[3];
}
复制代码
#include<global.h>
sbit SDA = P2^1;
sbit SCL = P2^0;
void Delay5us() //@11.0592MHz
{
unsigned char i;
_nop_();
i = 11;
while (--i);
}
void IICStart()
{
SDA = 1; //确保sda为高电平为开始信号做准备
SCL = 1; //scl一直保持高电平等待读取sda由高向低切换
Delay5us(); //协议规定:sda高电平状态时间大于4.7us
SDA = 0; //协议规定:在scl为高时sda由高向低切换,为iic开始信号
Delay5us(); //协议规定:sda低电平状态时间大于4us
SCL = 0; //拉低scl为后面sda数据做准备
}
void IICStop()
{
SDA = 0; //确保sda为低电平为结束信号做准备
SCL = 1; //scl一直保持高电平等待读取sda由低向高切换
Delay5us(); //协议规定:sda低电平时间大于4us
SDA = 1; //协议规定:在scl为高时sda由低向高切换,为iic结束信号
Delay5us(); //协议规定:sda高电平状态时间大于4.7us
}
bit IICWrite(unsigned char dat)
{
bit ack; //暂时存应答值
unsigned char mask; //用于探测字节内一位的值
for(mask = 0x80; mask!=0; mask>>=1) //从高位到低位依次进行
{
if ((dat & mask) == 0) //将该位值输出到引脚
SDA = 0;
else
SDA = 1;
Delay5us(); //稳定数据
SCL = 1; //拉高时钟
Delay5us(); //维持时钟时间大于4us
SCL = 0;
}
SDA = 1; //释放总线准备接收数据
Delay5us();
SCL = 1;//开始读取应答位
ack = SDA;
Delay5us();
SCL = 0;
return ~ack;
}
unsigned char IICReadNAK()
{
unsigned char dat;
unsigned char mask;
SDA = 1;//释放总线准备接收数据
for(mask = 0x80; mask != 0; mask >>= 1)
{
SCL = 1;
if(SDA == 1)
dat |= mask;
else
dat &= ~mask;
Delay5us();
SCL = 0;
}
SDA = 1;
Delay5us();
SCL = 1;
Delay5us();
SCL = 0;
return dat;
}
unsigned char IICReadACK()
{
unsigned char dat;
unsigned char mask;
SDA = 1;//释放总线准备接收数据
for(mask = 0x80; mask != 0; mask >>= 1)
{
SCL = 1;
if(SDA == 1)
dat |= mask;
else
dat &= ~mask;
Delay5us();
SCL = 0;
}
SDA = 0;
Delay5us();
SCL = 1;
Delay5us();
SCL = 0;
return dat;
}
复制代码
全部资料51hei下载地址:
ds3231.rar
(58.74 KB, 下载次数: 79)
2019-7-27 18:34 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
ldh2009
时间:
2020-5-6 21:52
谢谢楼主分享!!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1