基于ATMEGA16的DS1302可調(diào)萬年歷程序
程序:main函數(shù):/*程序功能:DS1302實時時鐘顯示作者:朱波時間:2012年2月3日通信方式:3線串行通信使用說明:本程序模仿家用萬年歷,能夠進(jìn)行時間的設(shè)定時間設(shè)定方法:1.按下設(shè)置鍵進(jìn)入設(shè)置模式2.按選擇鍵對要設(shè)置的項進(jìn)行選擇3.按加一鍵對選擇項加一4.完成全部選擇后出現(xiàn)"please check OK!"此時按下確定鍵就回到時間模式備注:可以通過主函數(shù)中的宏定義進(jìn)行時間設(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;//對時鐘進(jìn)行操作將SCK設(shè)置成輸出RST_OUT;//對時鐘進(jìn)行操作將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引腳進(jìn)行讀取操作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;//移位進(jìn)行下一個字節(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拉低}
關(guān)鍵詞:
ATMEGA16
DS1302
可調(diào)萬年歷
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號放大器
評論