基于W801的IIC学习(以DS1307为例)

DS1307

注意DS1307寄存器0X00的bit7,清零计数使能

写操作,地址0XD0

读操作,地址0XD1

GPIO初始化、I2C初始化

       wm_i2c_scl_config(WM_IO_PA_01);

       wm_i2c_sda_config(WM_IO_PA_04);

       tls_i2c_init(400000);//最大频率400KHz

unsigned char ds1307_read_reg(unsigned char reg_addr)//读寄存器
{
       //printf("%d\r:%s....reg_addr=0x%X\r\n",tls_os_get_time(),__FUNCTION__,reg_addr);
       tls_i2c_write_byte(ds1307_addr,1);
       tls_i2c_wait_ack();
       tls_i2c_write_byte(reg_addr, 0);
       tls_i2c_wait_ack();
       tls_i2c_write_byte(ds1307_addr|1, 1);
       tls_i2c_wait_ack();
       return tls_i2c_read_byte(0, 1);;
}

void ds1307_write_reg(unsigned char reg_addr,unsigned char data)//写寄存器
{
       //printf("%d\r:%s.... reg_addr:0x%X data:0x%X\r\n",tls_os_get_time(),__FUNCTION__,reg_addr,data);
       tls_i2c_write_byte(ds1307_addr, 1); //发送 写 命令
       tls_i2c_wait_ack();    
       tls_i2c_write_byte(reg_addr, 0);//发送地址      
       tls_i2c_wait_ack();      
       tls_i2c_write_byte(data, 0); //发送字节                             
       tls_i2c_wait_ack();           
       tls_i2c_stop();
       tls_os_time_delay(1);//必要的

}

void ds1307_set(unsigned short year,unsigned short month,unsigned short data,
                unsigned short week,unsigned short hour,
                unsigned short minute,unsigned short second)
{//设置日期

       printf("%d\r:%s....year:%d month:%d data:%d --week:%d\n\r\r
               time: %d:%d:%d\r\n",tls_os_get_time(),__FUNCTION__,
                     year,month,data,week,hour,minute,second);
       if(year>99)
              year-=2000;
       unsigned short date[7]={second,minute,hour,week,data,month,year};//year month data week hour minute second
       date[0]=((date[0]/10)<<4)+date[0]%10;//second
       date[1]=((date[1]/10)<<4)+date[1]%10;//minute
       date[2]=((date[2]/10)<<4)+date[2]%10;//hour
       date[3]=((date[3]/10)<<4)+date[3]%10;//week
       date[4]=((date[4]/10)<<4)+date[4]%10;//data
       date[5]=((date[5]/10)<<4)+date[5]%10;//month
       date[6]=((date[6]/10)<<4)+date[6]%10;//year
       for(int i=0;i<7;i++)
              ds1307_write_reg(i, date[i]);
}

void ds1307_read(void )//获取日期时间
{
       unsigned short date[7];
       for(int i=0;i<7;i++)
              date[i]=ds1307_read_reg(i);
       date[0]=(date[0]/16)*10+date[0]%16;
       date[1]=(date[1]/16)*10+date[1]%16;
       date[2]=(date[2]/16)*10+date[2]%16;
       date[3]=(date[3]/16)*10+date[3]%16;
       date[4]=(date[4]/16)*10+date[4]%16;
       date[5]=(date[5]/16)*10+date[5]%16;
       date[6]=(date[6]/16)*10+date[6]%16+2000;
       printf("data:%d-%d-%d-week:%d \r time: %d:%d:%d\r\n",
              date[6],date[5],date[4],date[3],date[2],date[1],date[0]);

}

另外:

       W801的内部寄存器HR_PMU_RTC_CTRL1、HR_PMU_RTC_CTRL2,有兴趣的可以试一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于W801单片机的智能手机充电器是一种能够更加智能化管理和保护手机充电的设计方案。这款充电器采用了W801单片机作为主控芯片,通过其强大的计算和控制能力,实现了多种功能和优化。 首先,基于W801单片机的充电器可以根据手机电池的容量和电压等信息,智能调节充电电流和电压。通过与手机之间的通信,充电器可以了解手机电池的具体状态,并根据需要进行快速充电或是低电流充电,以达到最佳充电效果,同时避免过度充电对手机电池的损害。 其次,充电器还具备安全保护功能。例如,基于W801单片机的充电器可以实现过充保护,当手机电池充满后自动停止充电,避免过度充电导致手机电池损坏。另外,充电器还可以监测电流和电压的异常情况,一旦发现异常即刻停止充电,确保手机充电安全。 此外,基于W801单片机的充电器还可以具备智能管理功能。它可以通过内置的计时器功能,记录手机充电时间和充电历史,帮助用户了解充电习惯和充电特点。同时,它还可以与用户的手机APP进行连接,实现远程控制和监测。用户可以通过手机APP查看充电器状态、调整充电参数等。 综上所述,基于W801单片机的智能手机充电器设计具备智能调节充电电流和电压、安全保护功能以及智能管理等特点,能够更好地满足用户对手机充电的需求,提供更加智能和安全的充电体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值