#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< ERROR(); TWDR = SLA_W; //发送SLA+W TWCR = (1< //发开始信号 ERROR(); TWDR = addr; //发送地址 TWCR = (1< ERROR(); TWCR = (1< ERROR(); TWDR = SLA_R; //发送SLA+R TWCR = (1< if((TWSR & 0xF8) != MR_SLA_ACK) ERROR(); TWCR = 0x84; //接收8位数据,发送nACK while (!(TWCR & (1< ERROR(); temp = TWDR; TWCR = (1< return (temp); } //*************将数据写入指定slave的地址内*********************** void write_byte(unsigned char addr ,unsigned char data) { TWCR = (1< ERROR(); TWDR = SLA_W; //发送SLA+W TWCR = (1< ERROR(); TWDR = addr; TWCR = (1< ERROR(); TWDR = data; TWCR = (1< ERROR(); TWCR = (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< } /******************发送一个字符串*************************/ 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< } /****************中断接收服务处理子程序*******************************/ 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 /************************** ************************/
因篇幅问题不能全部显示,请点此查看更多更全内容