新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于ATMEGA16的DS1302可调万年历程序

基于ATMEGA16的DS1302可调万年历程序

作者:时间:2012-08-06来源:网络收藏

点击浏览下一页

程序:main函数:/*程序功能:实时时钟显示作者:朱波时间:2012年2月3日通信方式:3线串行通信使用说明:本程序模仿家用万年历,能够进行时间的设定时间设定方法:1.按下设置键进入设置模式2.按选择键对要设置的项进行选择3.按加一键对选择项加一4.完成全部选择后出现"please check OK!"此时按下确定键就回到时间模式备注:可以通过主函数中的宏定义进行时间设置*/#include iom16v.h>#include macros.h>#include "delay.h" #include "display.h"#include "ds1302.h"#include "key.h"#define  uchar unsigned char#define  uint  unsigned int//用于校准时间#define year 12//年份#define week 4//星期#define month 12//月#define daytime 23//日#define hour  12//小时#define minute 59//分钟#define seconds 55//秒uint time_data[7]={year,week,month,daytime,hour,minute,seconds};
//年星期月日时分秒(设置初始时间)void  main(){ int_init();//中断初始化SEI();//开启总中断LCD_init();//1602液晶初始化SCK_OUT;//对时钟进行操作将SCK设置成输出RST_OUT;//对时钟进行操作将RST设置成输出set_rtc();//设置时间hour_mode(24);//时间显示模式设定,12小时显示没有做好处理//只是注意此函数的写法while(1){read_rtc();//读取时间time_pro();//时间处理display();//显示时间}}delay.c:#include"delay.h"void delay(unsigned int ms){unsigned int i,j;for(i=0;ims;i++){for(j=0;j1141;j++);}}delay.h:#ifndef delay_h#define delay_hextern void delay(unsigned int ms);#endifds1302.c:#include iom16v.h>#include macros.h>#include "key.h"#include "display.h"#define  uchar unsigned char#define  uint  unsigned int#define SCK_CLR PORTA=~BIT(6)#define SCK_SET PORTA|=BIT(6)#define SCK_OUT DDRA|=BIT(6)#define RST_CLR PORTC=~BIT(7)#define RST_SET PORTC|=BIT(7)#define RST_OUT DDRC|=BIT(7)#define IO_CLR PORTA=~BIT(7)//IO引脚输出低电平#define IO_SET PORTA|=BIT(7)//IO引脚输出高电平#define IO_OUT DDRA|=BIT(7)//IO引脚设置为输出#define IO_IN DDRA=~BIT(7)//IO引脚设置为输入#define IO_R PINABIT(7)//IO引脚进行读取操作extern int time_data[7];uchar write_add[7]={0X8C,0X8A,0X88,0X86,0X84,0X82,0X80};//写地址(最低位为0)uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//读地址(最低位为1)uchar table[];//用于计算void write_ds1302_byte(uchar dat)//在ds1302中写指令字节{uint i;IO_OUT;for(i=0;i8;i++)//一位一位往里写,共写8位{SCK_CLR;//开始时时序为0//先准备好数据,在给上升沿if(dat0x01)//如果数据位为1{IO_SET;//IO为1}else//如果数据位为0{IO_CLR;//IO为0}SCK_SET;//SCLK拉高开始传输数据dat=dat>>1;//移位进行下一个字节的传输(写的时候放到后面)}}uchar read_ds1302(uchar add)//单字节读{uchar i,value;//定义变量RST_CLR;SCK_CLR;//开始RET和SCLK时序为低RST_SET;//根据时序要传输命令write_ds1302_byte(add);//执行完此句后,SCLK时序到下降沿处开始读数据IO_IN;//IO设置成输入for(i=0;i8;i++)//一个字节为8位,一位一位的读{SCK_CLR;//时钟拉低开始传输value=value>>1;//读的时候放到前面if(IO_R)//读的结果如果为1{value=value|0X80;//从低位开始读取}SCK_SET;//时钟拉高结束传输}//循环结束后SCLK时序到了最后,将RST拉低RST_CLR;return value;//将数据返回  }void write_ds1302(uchar add,uchar dat)//单字节写(传递两个参数一个是地址一个是数据){RST_CLR;NOP();SCK_CLR;//开始RET和SCLK时序为低RST_SET;//根据时序开始写入东西时将RST拉高write_ds1302_byte(add);//写入地址write_ds1302_byte(dat);//写入数据RST_CLR;//根据时序,当写完东西时RST拉低} 
				
            	
                
				
								
上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭