一、准备工作
1.引脚图
2.引脚描述
3.硬件准备
(1)Arduino 单片机
(2)AT8010芯片
4.基于Arduino的硬件IIC总线函数封装
可以由下面的函数对寄存器进行读写,以及连续读写
源文件
#include "iic.hpp"
#include <Wire.h>
#include "Arduino.h"
void WriteOneByte(uint8_t WriteAddr,uint8_t DataToWrite)
{
Wire.beginTransmission(ADDRESS_SLAVE);
Wire.write(WriteAddr);
Wire.write(DataToWrite);
Wire.endTransmission();
delay(1);
}
u8 ReadOneByte(u8 ReadAddr)
{
u8 temp=0;
Wire.beginTransmission(ADDRESS_SLAVE);
Wire.write(ReadAddr);
Wire.endTransmission();
Wire.requestFrom(ADDRESS_SLAVE, 1);
temp = Wire.read();
Wire.endTransmission();
return temp;
}
void Continuous_writing(uint8_t registers , uint8_t *send_data ,int length)
{
Wire.beginTransmission(ADDRESS_SLAVE);
Wire.write(registers);
for (int i=0; i<length; i++)
{
Wire.write(*(send_data +i) );
}
Wire.endTransmission();
}
void Continuous_reading(uint8_t registers , uint8_t *receive_data ,int length)
{
Wire.beginTransmission(ADDRESS_SLAVE);
Wire.write(registers);
Wire.endTransmission();
Wire.requestFrom(ADDRESS_SLAVE, length);
for (int i=0; i<length; i++)
{
*(receive_data+i) = Wire.read();
}
Wire.endTransmission();
}
头文件
#ifndef __IIC_HPP
#define __IIC_HPP
#include "Arduino.h"
#include "iic.hpp"
#include <Wire.h>
#define ADDRESS_SLAVE 0x32
void WriteOneByte(uint8_t WriteAddr,uint8_t DataToWrite);
void Continuous_writing(uint8_t registers , uint8_t *send_data ,int length);
u8 ReadOneByte(u8 ReadAddr);
void Continuous_reading(uint8_t registers , uint8_t *receive_data ,int length);
#endif
二、正式工作
1、AT8010初始化
源文件
#include "Arduino.h"
#include "AT8010.hpp"
#include "iic.hpp"
void AT8010_Init()
{
WriteOneByte(Reserved_17,Clear);
WriteOneByte(Reserved_30,Clear);
WriteOneByte(Reserved_31,Clear);
WriteOneByte(IRQ_Control,Clear);
WriteOneByte(Extension_Register,Clear);
WriteOneByte(Flag_Register,Clear);
WriteOneByte(Control_Register,Clear);
}
头文件
#ifndef __AT8010_HPP
#define __AT8010_HPP
#include "Arduino.h"
#include "AT8010.hpp"
#define Reserved_17 0xD8
#define Reserved_30 0xD8
#define Reserved_31 0xD8
#define Extension_Register 0x1D
#define Flag_Register 0x1E
#define Control_Register 0x1F
#define IRQ_Control 0x32
#define Clear 0x00
void AT8010_Init();
#endif
2.Clock calendar explanation
源文件
#include "Arduino.h"
#include "clock.hpp"
#include "iic.hpp"
//Clock_Init(&Clock_init); 设定时间
//clock_print(); 打印时间
Clock_Typedef Clock_init={
Clock_init.SEC=0x50,
Clock_init.MIN=0x59,
Clock_init.HOUR=0x17,
Clock_init.WEEK=0x01,
Clock_init.DAY=0x01,
Clock_init.MONTH=0x01,
Clock_init.YEAR=0x23,
};
/*设定时间*/
void Clock_Init(Clock_Typedef* clock)
{
Continuous_writing(Clock_SEC,(uint8_t*)clock ,7);
}
/*打印时间*/
void clock_print()
{
Serial.print("20");
Serial.print(ReadOneByte(Clock_YEAR) ,HEX);Serial.print("/");
Serial.print(ReadOneByte(Clock_MONTH) , HEX);Serial.print("/");
Serial.print(ReadOneByte(Clock_DAY), HEX);Serial.print(" ");
Serial.print(ReadOneByte(Clock_WEEK), HEX);Serial.print(" ");
Serial.print(ReadOneByte(Clock_HOUR), HEX);Serial.print(":");
Serial.print(ReadOneByte(Clock_MIN), HEX);Serial.print(":");
Serial.println(ReadOneByte(Clock_SEC), HEX);
delay(1000);
}
头文件
#ifndef __CLOCK_HPP
#define __CLOCK_HPP
#include "Arduino.h"
#include "clock.hpp"
#define Clock_SEC 0x10
#define Clock_MIN 0x11
#define Clock_HOUR 0x12
#define Clock_WEEK 0x13
#define Clock_DAY 0x14
#define Clock_MONTH 0x15
#define Clock_YEAR 0x16
typedef struct{
uint8_t SEC;
uint8_t MIN;
uint8_t HOUR;
uint8_t WEEK;
uint8_t DAY;
uint8_t MONTH;
uint8_t YEAR;
}Clock_Typedef;
extern Clock_Typedef Clock_init;
void Clock_Init(Clock_Typedef* clock);
void clock_print();
#endif
3.Fixed-cycle Timer Interrupt Function
源文件
#include <Wire.h>
#include "Arduino.h"
#include "iic.hpp"
#include "timer.hpp"
#include "AT8010.hpp"
//timer计数 IRQ_Init(&IRQ_init,IRQ2_interrupt);
TIMER_Typedef TIMER_init={
TIMER_init.timer_counter0=200,
TIMER_init.timer_counter1=00,
TIMER_init.extension_register=SourceClock_1HZ,
TIMER_init.flag_register=Clear_flag,
TIMER_init.control_register=TimerInterrupt_Disable,
};
void TIMER_Init(TIMER_Typedef* TIMER,uint8_t Control)
{
Continuous_writing(0x1B,(uint8_t*)TIMER ,6);
WriteOneByte(IRQ_Control,Control);
}
头文件
#ifndef __TIMER_HPP
#define __TIMER_HPP
#include "Arduino.h"
#include "timer.hpp"
#define Clear_flag 0x00
#define IRQ1_interrupt 0x04
#define IRQ2_interrupt 0x00
#define SourceClock_4096HZ 0x10
#define SourceClock_64HZ 0x11
#define SourceClock_1HZ 0x02
#define SourceClock1_60HZ 0x13
#define SourceClock1_3600HZ 0x14
#define Count_Enable 0X10
#define Count_Disable 0X00
#define TimerInterrupt_Enable 0X10
#define TimerInterrupt_Disable 0X00
typedef struct{
uint8_t timer_counter0;
uint8_t timer_counter1;
uint8_t extension_register;
uint8_t flag_register;
uint8_t control_register;
}TIMER_Typedef;
extern TIMER_Typedef TIMER_init;
void TIMER_Init(TIMER_Typedef* TIMER,uint8_t Control);
#endif
4、Alarm Interrupt Function
源文件
#include "Arduino.h"
#include "ALARM.hpp"
#include "iic.hpp"
#include "AT8010.hpp"
Alarm_Typedef Alarm_init={
Alarm_init.MIN_Alarm=0x00,
Alarm_init.HOUR_Alarm=0x18,
Alarm_init.WD_Alarm=0x01,
};
void Alarm_Init(Alarm_Typedef*alarm)
{
Continuous_writing(0x18,(uint8_t*)alarm ,3);
WriteOneByte(Extension_Register,WEEK);
WriteOneByte(Control_Register,ALARM_DISABLE);
}
头文件
#ifndef __ALARM_HPP
#define __ALARM_HPP
#include "Arduino.h"
#include "alarm.hpp"
#define WEEK 0x00
#define DAY 0x08
#define ALARM_ENABLE 0x08
#define ALARM_DISABLE 0x00
typedef struct{
uint8_t MIN_Alarm;
uint8_t HOUR_Alarm;
uint8_t WD_Alarm;
}Alarm_Typedef;
extern Alarm_Typedef Alarm_init;
void Alarm_Init(Alarm_Typedef*alarm);
#endif
5、Time Update Interrupt Function
源文件
#include "Arduino.h"
#include "update.hpp"
#include "iic.hpp"
#include "AT8010.hpp"
void Update_init ()
{
WriteOneByte(Extension_Register,Second_update);
WriteOneByte(Control_Register,Update_ENABLE);
}
头文件
#ifndef __update_HPP
#define __update_HPP
#include "Arduino.h"
#include "update.hpp"
#define Second_update 0x00
#define Minute_update 0x20
#define Update_ENABLE 0x20
#define Update_DISABLE 0x00
void Update_init ();
#endif
6、FOUT function
源文件
#include "Arduino.h"
#include "Fout.hpp"
#include "iic.hpp"
#include "AT8010.hpp"
// Fout_init(Output_1Hz,IRQ2_Output);
void Fout_init(uint8_t FSEL,uint8_t FOPIN1)
{
WriteOneByte(Extension_Register,FSEL);
WriteOneByte(IRQ_Control,FOPIN1);
}
头文件
#ifndef __FOUT_HPP
#define __FOUT_HPP
#include "Arduino.h"
#include "Fout.hpp"
#define Output_OFF 0x00
#define Output_1Hz 0x40
#define Output_1024Hz 0x80
#define Output_32768Hz 0xc0
#define IRQ1_Output 0x01
#define IRQ2_Output 0x00
void Fout_init(uint8_t FSEL,uint8_t FOPIN1);
#endif
7、主函数
#include <Wire.h>
#include "iic.hpp"
#include "timer.hpp"
#include "clock.hpp"
#include "Fout.hpp"
#include "AT8010.hpp"
#include "ALARM.hpp"
#include "update.hpp"
void setup()
{
Wire.begin();
Serial.begin(9600);
AT8010_Init();
Clock_Init(&Clock_init);
//Alarm_Init(&Alarm_init);
//TIMER_Init(&TIMER_init,IRQ1_interrupt);
//Update_init ();
//Fout_init(Output_1Hz,IRQ2_Output);
}
void loop()
{
clock_print();
}