OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4626|回复: 4

有人有ds3231模块的程序嘛 用51写的

[复制链接]

10

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-7-7
在线时间
13 小时
发表于 2016-12-17 23:47:53 | 显示全部楼层 |阅读模式
1金钱
有人有ds3231模块的程序嘛,用51写的求分享

最佳答案

查看完整内容[请看2#楼]

ds3231测试程序,采用数码管显示 #include #include #define uchar unsigned char #define uint unsigned int sbit SDA=P3^6; //模拟I2C数据传送位SDA sbit SCL=P3^7; //模拟I2C时钟控制位SCL sbit INT=P3^2; sbit RESET=P3^3; sbit led0=P1^0; sbit led1=P1^1; sbit led2=P1^2; sbit led3=P1^3; sbit led4=P1^4; sbit led5=P1^5; sbit led6=P1^6; sbit led7=P1^7; bit ack; ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

kelvinbing 该用户已被删除
发表于 2016-12-17 23:47:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165354
金钱
165354
注册时间
2010-12-1
在线时间
2109 小时
发表于 2016-12-26 01:50:46 | 显示全部楼层
帮顶
回复

使用道具 举报

1

主题

3

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
金钱
273
注册时间
2015-11-3
在线时间
39 小时
发表于 2017-1-6 10:07:38 | 显示全部楼层
sbit SCL=P4^1; //串行时钟
sbit SDA=P3^6; //串行数据
/********************************************************************************************************
**         DS3231常数定义
********************************************************************************************************/
#define DS3231_WriteAddress 0xD0    //器件写地址
#define DS3231_ReadAddress  0xD1    //器件读地址
#define DS3231_SECOND       0x00    //秒
#define DS3231_MINUTE       0x01    //分
#define DS3231_HOUR         0x02    //时
#define DS3231_WEEK         0x03    //星期
#define DS3231_DAY          0x04    //日
#define DS3231_MONTH        0x05    //月
#define DS3231_YEAR         0x06    //年
#define uchar unsigned char
#define uint  unsigned int
#define NACK    1
#define ACK     0

char Dhour,minute,second;
uchar TH3231;
bit        ack;                                                        //应答标志位

void Delay5US()           //
{
  _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
}

/**********************************************
//IIC Start
**********************************************/
void IIC_Start()
{
   SCL = 1;               
   SDA = 1;
   SDA = 0;
   SCL = 0;
}

/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{
   SCL = 0;
   SDA = 0;
   SCL = 1;
   SDA = 1;
}


/********************************************************************************************************
**         3231
********************************************************************************************************/


uchar        BCD2HEX(uchar val)
{
        return        ((val>>4)*10)+(val&0x0f);
}

uchar        HEX2BCD(uchar val)
{
        return        (((val%100)/10)<<4)|(val%10);
}


void SendByte(uchar c)
{
    uchar BitCnt;
   
    for(BitCnt=0;BitCnt<8;BitCnt++)         //要传送的数据长度为8位
    {
        if((c<<BitCnt)&0x80)
            SDA=1;                          //判断发送位
        else
            SDA=0;     
        SCL=1;                            //置时钟线为高,通知被控器开始接收数据位
        Delay5US();                       //保证时钟高电平周期大于4μs   
        SCL=0;
    }
    SDA=1;                                  //8位发送完后释放数据线,准备接收应答位
    SCL=1;
    Delay5US();
        Delay5US();
    if(SDA==1)
        ack=0;   
    else
        ack=1;                              //判断是否接收到应答信号
    SCL=0;
    Delay5US();
}          

uchar RcvByte()
{
   uchar retc;
   uchar BitCnt;

   retc=0;
   SDA=1;                           //置数据线为输入方式
   for(BitCnt=0;BitCnt<8;BitCnt++)
   {
        SCL=0;                      //置时钟线为低,准备接收数据位      
        Delay5US();                 //时钟低电平周期大于4.7μs                       
        SCL=1;                      //置时钟线为高使数据线上数据有效
        Delay5US();
                Delay5US();
        retc=retc<<1;
        if(SDA==1)
            retc=retc+1;            //读数据位,接收的数据位放入retc中
        Delay5US();
   }
   SCL=0;
   return(retc);
}                            

void Ack_I2C(bit a)
{
        SDA        =        a;  
    SCL=1;                     
    Delay5US();             //时钟低电平周期大于4us   
    SCL=0;                  //清时钟线,钳住I2C总线以便继续接收
    Delay5US();  
}                                            

uchar write_byte(uchar addr, uchar write_data)
{
    IIC_Start();
    SendByte(DS3231_WriteAddress);
    if (ack == 0)
        return 0;
   
    SendByte(addr);   
    if (ack == 0)
        return 0;
   
    SendByte(write_data);
    if (ack == 0)
        return 0;
   
    IIC_Stop();
    Delay5US();     
    Delay5US();      
    return 1;
}                                          

uchar read_current()
{
    uchar read_data;
    IIC_Start();
    SendByte(DS3231_ReadAddress);
    if(ack==0)
    return(0);             
    read_data = RcvByte();
    Ack_I2C(1);
    IIC_Stop();
    return read_data;
}                                                 

uchar read_random(uchar random_addr)   //读数据
{
    uchar Tmp;
        IIC_Start();
    SendByte(DS3231_WriteAddress);
    if(ack==0)
        return(0);            
    SendByte(random_addr);
    if(ack==0)
        return(0);
        Tmp=read_current();
        if(random_addr==DS3231_HOUR)
                Tmp&=0x3f;
                                            
    return(BCD2HEX(Tmp));//都转10进制输出
}                                  

void ModifyTime(uchar hou,uchar min,uchar sec) // uint year,uchar month,uchar day,uchar week,
{
    uchar temp=0;
   
//        temp=HEX2BCD(year);
//    write_byte(DS3231_YEAR,temp);   //修改时
//   
//    temp=HEX2BCD(month);
//    write_byte(DS3231_MONTH,temp); //修改分
//   
//    temp=HEX2BCD(day);
//    write_byte(DS3231_DAY,temp); //修改秒
//
//        temp=HEX2BCD(week);
//    write_byte(DS3231_WEEK,temp); //修改秒

    temp=HEX2BCD(hou);
    write_byte(DS3231_HOUR,temp);   //修改时
   
    temp=HEX2BCD(min);
    write_byte(DS3231_MINUTE,temp); //修改分
   
    temp=HEX2BCD(sec);
    write_byte(DS3231_SECOND,temp); //修改秒
}
//uint  read_temp()      
//{
//                int     itemp;
//                float   ftemp;
//                //温度数据是以2 进制格式存储的并不需要数制转换
//                write_byte(0x0e,0x20);//0x0e寄存器的CONV位置1开启温度转换
//
//        itemp = ( (int) read_random(0x11) << 5 );          //放大32倍
//        itemp += ( read_random(0x12)>> 3);
//        IIC_Stop();
//        if(itemp & 0x1000)
//                        itemp += 0xe000;      
//
//        ftemp = 0.4145 * (float) itemp+0.5;    //放大10倍          0.3125 * (float) itemp+0.5;
//                return  (uint) ftemp;
//}
回复

使用道具 举报

1

主题

3

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
金钱
273
注册时间
2015-11-3
在线时间
39 小时
发表于 2017-1-6 10:10:33 | 显示全部楼层
本帖最后由 fanfan1 于 2017-1-6 10:13 编辑

=================================
Dhour = read_random(DS3231_HOUR);                //读小时
minute = read_random(DS3231_MINUTE) ;        //读分钟
second = read_random(DS3231_SECOND);         //读秒
=================================
//  ModifyTime(2016,9,6,2,11,10,15);   //设置年月日星期时间
//  ModifyTime(11,10,15);  //设置时间
=================================

SCL,SDA需要加上拉电阻或者将引脚设置为推挽输出
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-27 13:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表