ds3231测试程序.docx
- 文档编号:2592409
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:18
- 大小:17.89KB
ds3231测试程序.docx
《ds3231测试程序.docx》由会员分享,可在线阅读,更多相关《ds3231测试程序.docx(18页珍藏版)》请在冰点文库上搜索。
ds3231测试程序
#include
#include
#include"usart.h"
unsignedchardata_temp;
unsignedcharuart_receive_flag=0;
unsignedcharRX_Counter=0;
unsignedcharRX_Buffer[7]={0};
unsignedcharuart_read=0;
unsignedcharflag=0;
#include"DS3231.h"
#include"usart.h"
#include"Delay.h"
unsignedcharerr;
Time_StructCurrentTime;
voidIIC_Init(void)
{
//DDRD|=BIT(0);
TWBR=0x20;//200KI2Cclockfrequency
TWCR=0X00;
TWSR=0X00;
}
voidERROR(void)
{
err=1;
TWCR=(1< } //**********************读取指定slave的地址内的数据************ //i2c_address: 从机地址。 对于x1226,CCR为0xde,,E2为0xae。 unsignedcharIIC_Read(unsignedcharaddr)//从slave接收1字节数据 { unsignedchartemp;//读取数值缓存 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(); TWCR=(1< while(! (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的地址内*********************** voidwrite_byte(unsignedcharaddr,unsignedchardata) { 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); } unsignedcharBCD2HEX(unsignedcharval)//BCD转换为Byte { unsignedchartemp; temp=val&0x0f;//用4位二进制数来表示1位十进制数中的0~9这10个数码 val>>=4; val&=0x0f; val*=10; temp+=val; returntemp; } unsignedcharHEX2BCD(unsignedcharval)//B码转换为BCD码 { unsignedchari,j,k; i=val/10; j=val%10; k=j+(i<<4); returnk; } voidModifyTime(unsignedcharyea,unsignedcharmon,unsignedcharda,unsignedcharhou,unsignedcharmin,unsignedcharsec) { unsignedchartemp=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);//修改秒 } voidget_show_time(void) { unsignedcharHtemp1,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); } voidget_show_date(void) { unsignedcharYtemp1,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_StructGetTime(void) { Time_StructTime; 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; returnTime; } voidDisplayTime(void) { Time_StructTimeCurrent; unsignedcharshi=0; unsignedcharge=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'); } //****************发送一个字符****************************** voidUSART0_char_Send(uchari) { while(! (UCSR0A&(1< UDR0=i;//发送数据 } /******************发送一个字符串*************************/ voidUSART0_str_Send(char*s) { while(*s) { USART0_char_Send(*s); s++; } } /*********************发送一个固定长度的字符串**********************/ voidUSART0_str_SendArray(uchar*p,ucharlen) { uchari; for(i=0;i { USART0_char_Send(*p); p++; } } /*****************串口初始化*********************************/ voidUSART0_Init(void) { PORTE|=BIT (1);//设置RXD0和TXD0 DDRE|=BIT(0)|BIT (1); UCSR0B=0x00;//禁止发送和接收 UCSR0A=0x00;//非倍速异步模式USX0=0 UCSR0C=0x06;//00000110,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初始化*********************************/ voidUSART1_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;//00000110,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;//允许发送和接收,接收和发送结束中断使能 } //****************发送一个字符****************************** voidUSART1_char_Send(uchari) { while(! (UCSR1A&(1< UDR1=i;//发送数据 } /****************中断接收服务处理子程序*******************************/ voidUSART1_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); } voidmain(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__ externvoidDelay(unsignedintms); externvoidDelay_1us(void); externvoidDelay_nus(unsignedintn); externvoidDelay_1ms(void); externvoidDelay_nms(unsignedintn); #endif /**************************3231.h文件************************/ ifndef__DS3231_H__ #define__DS3231_H__ #include #include #defineSLA_W0xD0 #defineSLA_R0xD1 #defineSTART0X08 #defineRE_START0X10 #defineMT_SLA_ACK0X18 #defineMT_SLA_NOACK0X20 #defineMT_DATA_ACK0X28 #defineMT_DATA_NOACK0X30 #defineMR_SLA_ACK0X40 #defineMR_SLA_NOACK0X48 #defineMR_DATA_ACK0X50 #defineMR_DATA_NOACK0X58 #defineSECONDS_ADDR0x00 #defineMINUTES_ADDR0x01 #defineHOURS_ADDR0x02 #defineDAY_ADDR0x03 #defineDATE_ADDR0x04 #defineMONTH_ADDR0x05 #defineYEAR_ADDR0x06 #defineCONTROL_ADDR0x07 #defineRAM_START_ADDR0x08 #defineDS3231_SECOND0x00//秒 #defineDS3231_MINUTE0x01//分 #defineDS3231_HOUR0x02//时 #defineDS3231_WEEK0x03//星期 #defineDS3231_DAY0x04//日 #defineDS3231_MONTH0x05//月 #defineDS3231_YEAR0x06//年 //闹铃1 #defineDS3231_SALARM1ECOND0x07//秒 #defineDS3231_ALARM1MINUTE0x08//分 #defineDS3231_ALARM1HOUR0x09//时 #defineDS3231_ALARM1WEEK0x0A//星期/日 //闹铃2 #defineDS3231_ALARM2MINUTE0x0b//分 #defineDS3231_ALARM2HOUR0x0c//时 #defineDS3231_ALARM2WEEK0x0d//星期/日 #defineDS3231_CONTROL0x0e//控制寄存器 #defineDS3231_STATUS0x0f//状态寄存器 #defineBSY2//忙 #defineOSF7//振荡器停止标志 #defineDS3231_XTAL0x10//晶体老化寄存器 #defineDS3231_TEMPERATUREH0x11//温度寄存器高字节(8位) #defineDS3231_TEMPERATUREL0x12//温度寄存器低字节(高2位) typedefstruct { unsignedcharSec; unsignedcharMin; unsignedcharHour; unsignedcharDay; unsignedcharMonth; unsignedcharYear; }Time_Struct; externvoidIIC_Init(void); externvoidwrite_byte(unsignedcharaddr,unsignedchardata); externunsignedcharIIC_Read(unsignedcharaddr); externunsignedcharBCD2HEX(unsignedc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ds3231 测试 程序
![提示](https://static.bingdoc.com/images/bang_tan.gif)