基于A(yíng)TMEGA16的DS1302可調萬(wàn)年歷程序
程序:main函數:/*程序功能:DS1302實(shí)時(shí)時(shí)鐘顯示作者:朱波時(shí)間:2012年2月3日通信方式:3線(xiàn)串行通信使用說(shuō)明:本程序模仿家用萬(wàn)年歷,能夠進(jìn)行時(shí)間的設定時(shí)間設定方法:1.按下設置鍵進(jìn)入設置模式2.按選擇鍵對要設置的項進(jìn)行選擇3.按加一鍵對選擇項加一4.完成全部選擇后出現"please check OK!"此時(shí)按下確定鍵就回到時(shí)間模式備注:可以通過(guò)主函數中的宏定義進(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//用于校準時(shí)間#define year 12//年份#define week 4//星期#define month 12//月#define daytime 23//日#define hour 12//小時(shí)#define minute 59//分鐘#define seconds 55//秒uint time_data[7]={year,week,month,daytime,hour,minute,seconds};
//年星期月日時(shí)分秒(設置初始時(shí)間)void main(){ int_init();//中斷初始化SEI();//開(kāi)啟總中斷LCD_init();//1602液晶初始化SCK_OUT;//對時(shí)鐘進(jìn)行操作將SCK設置成輸出RST_OUT;//對時(shí)鐘進(jìn)行操作將RST設置成輸出set_rtc();//設置時(shí)間hour_mode(24);//時(shí)間顯示模式設定,12小時(shí)顯示沒(méi)有做好處理//只是注意此函數的寫(xiě)法while(1){read_rtc();//讀取時(shí)間time_pro();//時(shí)間處理display();//顯示時(shí)間}}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引腳進(jìn)行讀取操作extern int time_data[7];uchar write_add[7]={0X8C,0X8A,0X88,0X86,0X84,0X82,0X80};//寫(xiě)地址(最低位為0)uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//讀地址(最低位為1)uchar table[];//用于計算void write_ds1302_byte(uchar dat)//在ds1302中寫(xiě)指令字節{uint i;IO_OUT;for(i=0;i8;i++)//一位一位往里寫(xiě),共寫(xiě)8位{SCK_CLR;//開(kāi)始時(shí)時(shí)序為0//先準備好數據,在給上升沿if(dat0x01)//如果數據位為1{IO_SET;//IO為1}else//如果數據位為0{IO_CLR;//IO為0}SCK_SET;//SCLK拉高開(kāi)始傳輸數據dat=dat>>1;//移位進(jìn)行下一個(gè)字節的傳輸(寫(xiě)的時(shí)候放到后面)}}uchar read_ds1302(uchar add)//單字節讀{uchar i,value;//定義變量RST_CLR;SCK_CLR;//開(kāi)始RET和SCLK時(shí)序為低RST_SET;//根據時(shí)序要傳輸命令write_ds1302_byte(add);//執行完此句后,SCLK時(shí)序到下降沿處開(kāi)始讀數據IO_IN;//IO設置成輸入for(i=0;i8;i++)//一個(gè)字節為8位,一位一位的讀{SCK_CLR;//時(shí)鐘拉低開(kāi)始傳輸value=value>>1;//讀的時(shí)候放到前面if(IO_R)//讀的結果如果為1{value=value|0X80;//從低位開(kāi)始讀取}SCK_SET;//時(shí)鐘拉高結束傳輸}//循環(huán)結束后SCLK時(shí)序到了最后,將RST拉低RST_CLR;return value;//將數據返回 }void write_ds1302(uchar add,uchar dat)//單字節寫(xiě)(傳遞兩個(gè)參數一個(gè)是地址一個(gè)是數據){RST_CLR;NOP();SCK_CLR;//開(kāi)始RET和SCLK時(shí)序為低RST_SET;//根據時(shí)序開(kāi)始寫(xiě)入東西時(shí)將RST拉高write_ds1302_byte(add);//寫(xiě)入地址write_ds1302_byte(dat);//寫(xiě)入數據RST_CLR;//根據時(shí)序,當寫(xiě)完?yáng)|西時(shí)RST拉低}
關(guān)鍵詞:
ATMEGA16
DS1302
可調萬(wàn)年歷
相關(guān)推薦
技術(shù)專(zhuān)區
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線(xiàn)
- 開(kāi)關(guān)電源
- 單片機
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開(kāi)發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機控制
- 藍牙
- PLC
- PWM
- 汽車(chē)電子
- 轉換器
- 電源管理
- 信號放大器
評論