您的当前位置:首页正文

基于megal66的DS1302时钟芯片操作程序

2024-07-16 来源:步旅网



基于megal66DS1302时钟芯片操作程序

基于M16DS1302时钟芯片操作程序clude<ioml6vh>

#include<macrosh>
//ftinclude"initAVRl. h
ttinclude<eepromh
elude"delaylh
ttincludedsl302h
eludezdisplay.h

#defineuchar unsigned char
#defineuint unsigned int

void m&in(void)



ucharhour, minute, second, date, month, year; //tm wl302(0x80, Oxff);
Tnit_DS1302();

while(l)

{ second = tm rl 302 (0x81) :

//从秒寄存器读数据

second((second&0x70)〉〉4)*10 + (second&OxOF) ;//将读出数据转化

display(6, second/10);

di splay (7, second%10) ; //显示秒

minute = tm rl302 (0x83) ;

//从分寄存器读





minute((minute&0x70)>>4)*10+ (minute&OxOF) ; //将读出

数据转化

display(3,minute/10);
display(4, minute%10) ; //显示分钟

display(5,17);

hourtmrl302(0x85);
hour=((hour&0x70) »4)*10 + (hour&OxOF) ; //将读出数据转化

display(0,hour/10);
display(1,hour%10) ;//显示小吋

display(2,17);

/*date= tm rl302 (0x87):
date((date&0x70)>>4)*10 + (date&OxOF) ; //将读出数据转化

display(6, date/10);
display (7, date%10) ;//显示日*/

Amonthtm_rl302(0x89):
month=((month&0x70)»4)*10+ (month&OxOF) ; //将读出数据转化

display(3,month/10);
display(4, month%10) ;//显示月

display(5,17);*/

Ayear = tm rl302 (0x8d);
year((year&0x70)〉〉4)*10+ (year&OxOF) ; //将读出数据转化

display(0,year/10);
display(1, year%10) ;//显示年份





display(2,17) ;*/

DS1302程序

#include<ioml6v.h>

#include<macrosh>//^include "initAVRl.h" ttinclude <eepromh>ttinclude "delayl.httincludedsl302.h

#defineuchar unsigned char

#defineuint unsigned int

//端口设置//////////////////////////

ttdefine RST PD4

ftdefine DAT PD5

ttdefineCLK PD6

#defineport PORTD ttdefine ddr DDRD #define pin PIND

////////////////////////////////////ftdefineDAT IN ddr &"BIT(DAT) ttdefine DAT OUT ddr |BIT(DAT) ftdefine DAT L port
&"BIT(DAT)ttdefine DAT H port|= BIT (DAT)





#define

RST H

port = BIT (RST)

#define

RST L

port &"BIT(RST)

#define

CLK H

port |BIT (CLK)

#define

CLK L

port &二〜BIT(CLK)

#define

read

pin & BIT(DAT)

unsignedchar tmrbyte (void) //读一个字节{unsigned

chari,j,dat, k;

DATIN;

delaynus(5);

for(i=0; i<8; i++) //连续读8个二进制位数据

{

dat»=l;

if(read)

dat|=0x80;

CLKH;

delay_nus(20); //稍微等待

CLK_L;; //拉低SCLK,形成脉冲下降沿

delay_nus(20) ; //稍微等待

}





returndat;

voidtmwbyte (unsigned char dat) //写一个字节{unsignedchar i, j;
unsignedchar testb;
DAT_0UT;
CLKL;
delay_nus (20);
for(j=lj=8;j++)
{if(dat & 0x01)
DATH;//1
else
DATL; //0

delay nus (20); CLK _H;
delay nus (20);



CLKL;
dat〉>二1;

uchar tm rl302 (uchar ucAddr) {
uchar ucDa;
DAT OUT;
delay nus (20);
RST_L;
delay nus (20);
CLKL;



delaynus (20);
RST」;
delaynus (20);
tmwbyte(ucAddr) ; //地址,命令ucDa=tmrbyte() ;//lByte数据CLKH; RST L;
returnucDa;

voidtm wl302(uchar ucAddr, uchar ucDa) {RST L; delay nus (20);
CLKL;
delaynus (20);
RST_delaynus (20);

tmwbyte (ucAddr) ;

tmwbyte (ucDa) ;

//地址,命令

delaynus (20);
CLKH;
delaynus (20);
RSTL;
delaynus (20);
DATIN;
delaynus (20);





voidInit DS1302(void)
{unsigned char flag;
RST_L;
CLK—L;

DDRDl= (l«RST) | (1«CLK);
flagtm_rl302 (0x81);

if(flag&0x80)//判断时钟芯片是否关闭
{

tm_wl302 (0x8E, 0x00) ;命令字,写入不保护指令

tm W1302 (0x80, ((59/10) «41 (59%10))) ;

//根据写状态寄存器

//根据写秒寄存

器命令字,写入秒的初始值

tm_wl302(0x82, ((15/10)«4| (15%10))) ; //根据写分寄存器

命令字,写入分的初始值
tm_wl302(0x84, ((13/10) «4 | (13%10))) ; //根据写小时寄存器命令字,写入小吋的初始值

tm_wl302(0x86, ((28/10)«41 (28%10))) ; //根据写日寄存器命

令字,写入口的初始值

tm_wl302(0x88, ((8/10)〈〈4 | (8%10))) ; //根据写月寄存器命令

字,写入月的初始值

tm_wl302(0x8c, ((10/10)«4| (10%10)));令字,写入年的初始值

tm wl302 (0x90, 0xa5) ; 2K电阻充电方式

//根据写年寄存器命

//打开充电功能选择

tm_wl302 (0x8E, 0x80) ;写入保护指令

//根据写状态寄存器命令字,


显示全文