新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于ATMEGA16的DS1302可調(diào)萬年歷程序

基于ATMEGA16的DS1302可調(diào)萬年歷程序

作者: 時間:2012-08-06 來源:網(wǎng)絡(luò) 收藏

點擊瀏覽下一頁

程序:main函數(shù):/*程序功能:實時時鐘顯示作者:朱波時間:2012年2月3日通信方式:3線串行通信使用說明:本程序模仿家用萬年歷,能夠進行時間的設(shè)定時間設(shè)定方法:1.按下設(shè)置鍵進入設(shè)置模式2.按選擇鍵對要設(shè)置的項進行選擇3.按加一鍵對選擇項加一4.完成全部選擇后出現(xiàn)"please check OK!"此時按下確定鍵就回到時間模式備注:可以通過主函數(shù)中的宏定義進行時間設(shè)置*/#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//用于校準(zhǔn)時間#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};
//年星期月日時分秒(設(shè)置初始時間)void  main(){ int_init();//中斷初始化SEI();//開啟總中斷LCD_init();//1602液晶初始化SCK_OUT;//對時鐘進行操作將SCK設(shè)置成輸出RST_OUT;//對時鐘進行操作將RST設(shè)置成輸出set_rtc();//設(shè)置時間hour_mode(24);//時間顯示模式設(shè)定,12小時顯示沒有做好處理//只是注意此函數(shù)的寫法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引腳設(shè)置為輸出#define IO_IN DDRA=~BIT(7)//IO引腳設(shè)置為輸入#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中寫指令字節(jié){uint i;IO_OUT;for(i=0;i8;i++)//一位一位往里寫,共寫8位{SCK_CLR;//開始時時序為0//先準(zhǔn)備好數(shù)據(jù),在給上升沿if(dat0x01)//如果數(shù)據(jù)位為1{IO_SET;//IO為1}else//如果數(shù)據(jù)位為0{IO_CLR;//IO為0}SCK_SET;//SCLK拉高開始傳輸數(shù)據(jù)dat=dat>>1;//移位進行下一個字節(jié)的傳輸(寫的時候放到后面)}}uchar read_ds1302(uchar add)//單字節(jié)讀{uchar i,value;//定義變量RST_CLR;SCK_CLR;//開始RET和SCLK時序為低RST_SET;//根據(jù)時序要傳輸命令write_ds1302_byte(add);//執(zhí)行完此句后,SCLK時序到下降沿處開始讀數(shù)據(jù)IO_IN;//IO設(shè)置成輸入for(i=0;i8;i++)//一個字節(jié)為8位,一位一位的讀{SCK_CLR;//時鐘拉低開始傳輸value=value>>1;//讀的時候放到前面if(IO_R)//讀的結(jié)果如果為1{value=value|0X80;//從低位開始讀取}SCK_SET;//時鐘拉高結(jié)束傳輸}//循環(huán)結(jié)束后SCLK時序到了最后,將RST拉低RST_CLR;return value;//將數(shù)據(jù)返回  }void write_ds1302(uchar add,uchar dat)//單字節(jié)寫(傳遞兩個參數(shù)一個是地址一個是數(shù)據(jù)){RST_CLR;NOP();SCK_CLR;//開始RET和SCLK時序為低RST_SET;//根據(jù)時序開始寫入東西時將RST拉高write_ds1302_byte(add);//寫入地址write_ds1302_byte(dat);//寫入數(shù)據(jù)RST_CLR;//根據(jù)時序,當(dāng)寫完東西時RST拉低} 
				
            
                
			
							
上一頁 1 2 3 下一頁

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉