测品娱乐
您的当前位置:首页ds3231测试程序

ds3231测试程序

来源:测品娱乐


#include

#include

#include\"usart.h\"

unsigned char data_temp;

unsigned char uart_receive_flag = 0;

unsigned char RX_Counter = 0;

unsigned char RX_Buffer[7] = {0};

unsigned char uart_read = 0;

unsigned char flag = 0;

#include\"DS3231.h\"

#include\"usart.h\"

#include\"Delay.h\"

unsigned char err;

Time_Struct CurrentTime;

void IIC_Init(void)

{

// DDRD |= BIT(0);

TWBR = 0x20; // 200K I2C clock frequency

TWCR = 0X00;

TWSR = 0X00;

}

void ERROR(void)

{

err=1;

TWCR = (1<}

//**********************读取指定slave的地址内的数据************

//i2c_address:从机地址。对于x1226,CCR为0xde,,E2为0xae。

unsigned char IIC_Read(unsigned char addr)//从slave接收1字节数据

{

unsigned char temp; //读取数值缓存

TWCR = (1<if((TWSR & 0xF8) != START)

ERROR();

TWDR = SLA_W; //发送SLA+W

TWCR = (1<while (!(TWCR & (1<if((TWSR & 0xF8) != MT_SLA_ACK)

//发开始信号

ERROR();

TWDR = addr; //发送地址

TWCR = (1<while (!(TWCR & (1<if((TWSR & 0xF8) != MT_DATA_ACK)

ERROR();

TWCR = (1<if((TWSR & 0xF8) != RE_START)

ERROR();

TWDR = SLA_R; //发送SLA+R

TWCR = (1<while (!(TWCR & (1<//发开始信号

if((TWSR & 0xF8) != MR_SLA_ACK)

ERROR();

TWCR = 0x84; //接收8位数据,发送nACK

while (!(TWCR & (1<if((TWSR & 0xF8) != MR_DATA_NOACK)

ERROR();

temp = TWDR;

TWCR = (1<//Delay(1);

return (temp);

}

//*************将数据写入指定slave的地址内***********************

void write_byte(unsigned char addr ,unsigned char data)

{

TWCR = (1<while (!(TWCR & (1<if((TWSR & 0xF8) != START)

ERROR();

TWDR = SLA_W; //发送SLA+W

TWCR = (1<while (!(TWCR & (1<if((TWSR & 0xF8) != MT_SLA_ACK)

ERROR();

TWDR = addr;

TWCR = (1<while (!(TWCR & (1<if((TWSR & 0xF8) != MT_DATA_ACK)

ERROR();

TWDR = data;

TWCR = (1<while (!(TWCR & (1<if((TWSR & 0xF8) != MT_DATA_ACK)

ERROR();

TWCR = (1<//Delay(1);

}

unsigned char BCD2HEX(unsigned char val) //BCD转换为Byte

{

unsigned char temp;

temp = val & 0x0f; //用4位二进制数来表示1位十进制数中的0~9这个数码

val>>=4;

val &= 0x0f;

val *= 10;

temp += val;

return temp;

}

unsigned char HEX2BCD(unsigned char {

unsigned char i,j,k;

i = val / 10;

j = val % 10;

k = j + (i << 4);

val) //B码转换为BCD码

10

return k;

}

void ModifyTime(unsigned char yea,unsigned char mon,unsigned char da,unsigned char hou,unsigned char min,unsigned char sec)

{

unsigned char temp=0;

temp = HEX2BCD(yea);

write_byte(DS3231_YEAR,temp); //修改年

temp=HEX2BCD(mon);

write_byte(DS3231_MONTH,temp); //修改月

temp=HEX2BCD(da);

write_byte(DS3231_DAY,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); //修改秒

}

void get_show_time(void)

{

unsigned char Htemp1,Mtemp1,Stemp1;

Htemp1 = IIC_Read(DS3231_HOUR); //时 24小时制

Htemp1 &= 0x3f;

CurrentTime.Hour = BCD2HEX(Htemp1);

Mtemp1 = IIC_Read(DS3231_MINUTE); //分

CurrentTime.Min = BCD2HEX(Mtemp1);

Stemp1 = IIC_Read(DS3231_SECOND); //秒

CurrentTime.Sec = BCD2HEX(Stemp1);

}

void get_show_date(void)

{

unsigned char Ytemp1,Mtemp1,Dtemp1;

Ytemp1 = IIC_Read(DS3231_YEAR); //年

CurrentTime.Year = BCD2HEX(Ytemp1);

Mtemp1 = IIC_Read(DS3231_MONTH); //月

CurrentTime.Month = BCD2HEX(Mtemp1);

Dtemp1 = IIC_Read(DS3231_DAY); //日

CurrentTime.Day = BCD2HEX(Dtemp1);

}

Time_Struct GetTime(void)

{

Time_Struct Time ;

get_show_time();

get_show_date();

Time.Year = CurrentTime.Year;

Time.Month = CurrentTime.Month;

Time.Day = CurrentTime.Day;

Time.Hour = CurrentTime.Hour;

Time.Min = CurrentTime.Min;

Time.Sec = CurrentTime.Sec;

return Time ;

}

void DisplayTime(void)

{

Time_Struct TimeCurrent ;

unsigned char shi = 0;

unsigned char ge = 0;

PORTD |= BIT(4)|BIT(6);

TimeCurrent = GetTime();

PORTD &= ~(BIT(4)|BIT(6));

shi = TimeCurrent.Year/10;

ge = TimeCurrent.Year%10;

USART1_char_Send(0x30 + shi);

USART1_char_Send(0x30 + ge);

USART1_char_Send('_');

shi = TimeCurrent.Month/10;

ge = TimeCurrent.Month%10;

USART1_char_Send(0x30 + shi);

USART1_char_Send(0x30 + ge);

USART1_char_Send('_');

shi = TimeCurrent.Day/10;

ge = TimeCurrent.Day%10;

USART1_char_Send(0x30 + shi);

USART1_char_Send(0x30 + ge);

USART1_char_Send('_');

shi = TimeCurrent.Hour/10;

ge = TimeCurrent.Hour%10;

USART1_char_Send(0x30 + shi);

USART1_char_Send(0x30 + ge);

USART1_char_Send('_');

shi = TimeCurrent.Min/10;

ge = TimeCurrent.Min%10;

USART1_char_Send(0x30 + shi);

USART1_char_Send(0x30 + ge);

USART1_char_Send('_');

shi = TimeCurrent.Sec/10;

ge = TimeCurrent.Sec%10;

USART1_char_Send(0x30 + shi);

USART1_char_Send(0x30 + ge);

USART1_char_Send('\\n');

}

//****************发送一个字符******************************

void USART0_char_Send(uchar i)

{

while(!(UCSR0A&(1<UDR0 = i; //发送数据

}

/******************发送一个字符串*************************/

void USART0_str_Send(char *s)

{

while(*s)

{

USART0_char_Send(*s);

s++;

}

}

/*********************发送一个固定长度的字符串**********************/

void USART0_str_SendArray(uchar *p,uchar len)

{

uchar i;

for(i=0;i{

USART0_char_Send(*p);

p++;

}

}

/*****************串口初始化*********************************/

void USART0_Init(void)

{

PORTE |=BIT(1); //设置RXD0和TXD0

DDRE |= BIT(0)|BIT(1);

UCSR0B = 0x00; //禁止发送和接收

UCSR0A = 0x00; //非倍速异步模式USX0=0

UCSR0C = 0x06; //0000 0110,UCSZ01=1,UCSZ00=1;8位字符,1位停止位

UBRR0L=(Crystal/16/(Baud_OSD+1))%256; //若为正常异步模式USX0=0则位(Crystal/16/(Baud+1))%256

UBRR0H=(Crystal/16/(Baud_OSD+1))/256; //参见ATMAGE128使用手册

UCSR0B=0x98 ; //允许发送和接收,接收和发送结束中断使能

}

/*****************串口1初始化*********************************/

void USART1_Init(void)

{

DDRG |= BIT(3)|BIT(4);

// PORTG &= ~(BIT(3)|BIT(4)); //使其处于接收状态

PORTG |= BIT(3)|BIT(4);

DDRD |= BIT(3);

//PORTD |= BIT(2)|BIT(3); //设置RXD1和TXD1

UCSR1B = 0x00; //禁止发送和接收

UCSR1A = 0x00; //非倍速异步模式USX0=0

UCSR1C = 0x06; //0000 0110,UCSZ01=1,UCSZ00=1;8位字符,1位停止位

UBRR1L=(Crystal/16/(Baud_MAX485+1))%256; //若为正常异步模式USX0=0则位(Crystal/16/(Baud+1))%256

UBRR1H=(Crystal/16/(Baud_MAX485+1))/256; //参见ATMAGE128使用手册

UCSR1B=0x98 ; //允许发送和接收,接收和发送结束中断使能

}

//****************发送一个字符******************************

void USART1_char_Send(uchar i)

{

while(!(UCSR1A&(1<UDR1 = i; //发送数据

}

/****************中断接收服务处理子程序*******************************/

void USART1_RX_Interrupt(void)

{

UCSR1B &= ~BIT(RXCIE1);

if ((uart_receive_flag == 1) && (RX_Counter < 6)) // 若已经收到FFFE

{

uart_read = 0;

RX_Buffer[RX_Counter] = UDR1; // 接收报文

RX_Counter++;

if (RX_Counter == 6)

{

flag = 1;

RX_Counter = 0;

uart_receive_flag = 0;

UCSR1B|=BIT(RXCIE1);

}

}

else

{

if (uart_read == 0xFF)

{

uart_read = UDR1;//第二次进入中断,读FE

if (uart_read == 0xFE)

{

uart_receive_flag = 1;

RX_Counter = 0;

}

}

else

{

uart_read = UDR1;//第一次进入中断,读FF

uart_receive_flag = 0;

}

}

UCSR1B|=BIT(RXCIE1);

}

void main(void)

{

DDRD |= BIT(4)|BIT(5)|BIT(6)|BIT(7);

PORTD &=~(BIT(4)|BIT(5)|BIT(6)|BIT(7));

IIC_Init();

USART1_Init();

TxdOpen;

ModifyTime(12,1,17,12,52,00); //DS3231第一次上电时需要校正时间

while(1)

{

DisplayTime();

Delay(1000);

}

}

/**************************h文件************************/

/***********************Delay.h**************************/

#ifndef __Delay_H__

#define __Delay_H__

extern void Delay(unsigned int ms);

extern void Delay_1us(void);

extern void Delay_nus(unsigned int n);

extern void Delay_1ms(void);

extern void Delay_nms(unsigned int n);

#endif

/**************************3231.h文件************************/

ifndef __DS3231_H__

#define __DS3231_H__

#include

#include

#define SLA_W 0xD0

#define SLA_R 0xD1

#define START 0X08

#define RE_START 0X10

#define MT_SLA_ACK 0X18

#define MT_SLA_NOACK 0X20

#define MT_DATA_ACK 0X28

#define MT_DATA_NOACK 0X30

#define MR_SLA_ACK 0X40

#define MR_SLA_NOACK 0X48

#define MR_DATA_ACK 0X50

#define MR_DATA_NOACK 0X58

#define SECONDS_ADDR 0x00

#define MINUTES_ADDR 0x01

#define HOURS_ADDR 0x02

#define DAY_ADDR 0x03

#define DATE_ADDR 0x04

#define MONTH_ADDR 0x05

#define YEAR_ADDR 0x06

#define CONTROL_ADDR 0x07

#define RAM_START_ADDR 0x08

#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 //年

//闹铃1

#define DS3231_SALARM1ECOND 0x07 //秒

#define DS3231_ALARM1MINUTE 0x08 //分

#define DS3231_ALARM1HOUR 0x09 //时

#define DS3231_ALARM1WEEK 0x0A //星期/日

//闹铃2

#define DS3231_ALARM2MINUTE 0x0b //分

#define DS3231_ALARM2HOUR 0x0c //时

#define DS3231_ALARM2WEEK 0x0d //星期/日

#define DS3231_CONTROL 0x0e //控制寄存器

#define DS3231_STATUS 0x0f //状态寄存器

#define BSY 2 //忙

#define OSF 7 //振荡器停止标志

#define DS3231_XTAL 0x10 //晶体老化寄存器

#define DS3231_TEMPERATUREH 0x11 //温度寄存器高字节(8位)

#define DS3231_TEMPERATUREL 0x12 //温度寄存器低字节(高2位)

typedef struct

{

unsigned char Sec;

unsigned char Min;

unsigned char Hour;

unsigned char Day;

unsigned char Month;

unsigned char Year;

}Time_Struct;

extern void IIC_Init(void);

extern void write_byte(unsigned char addr ,unsigned char data);

extern unsigned char IIC_Read(unsigned char addr);

extern unsigned char BCD2HEX(unsigned char val); //BCD转换为Byte

extern unsigned char HEX2BCD(unsigned char val) ; //B码转换为BCD码

extern void ModifyTime(unsigned char yea,unsigned char mon,unsigned char da,unsigned char hou,unsigned char min,unsigned char sec);

extern void get_show_time(void);

extern void get_show_date(void);

extern Time_Struct GetTime(void);

extern void DisplayTime(void);

#endif

/**************************usart.h文件************************/

#ifndef __usart_H__

#define __usart_H__

#define uchar unsigned char

#define uint unsigned int

#define Crystal 16000000 //晶振16MHZ

#define Baud_OSD 19200 //波特率0

#define Baud_MAX485 19200 //波特率1

#define RxdOpen PORTG &= ~(BIT(3)|BIT(4)) //使其处于接收状态

#define TxdOpen PORTG |= BIT(3)|BIT(4) //使MAX485处于发送状态

#pragma interrupt_handler USART1_RX_Interrupt:31

extern unsigned char data_temp;

extern void USART0_char_Send(uchar i);//发送一个字符

extern void USART0_str_Send(char *s);// 发送一个字符串

extern void USART0_str_SendArray(uchar *p,uchar len);//发送一个固定长度的字符串

extern void USART0_Init(void);//串口初始化

extern void USART1_Init(void) ;

extern void USART1_char_Send(uchar i);

#endif

/************************** ************************/

因篇幅问题不能全部显示,请点此查看更多更全内容