基于megal66的DS1302时钟芯片操作程序
基于M16的DS1302时钟芯片操作程序clude<ioml6v・h>
#include<macros・h>
//ftinclude"initAVRl. h〃
ttinclude<eeprom・h〉
elude"delayl・h〃
ttinclude〃dsl302・h〃
eludez,display.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);
hour二tmrl302(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) ;//显示日*/
Amonth二tm_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<macros・h>//^include "initAVRl.h" ttinclude <eeprom・h>ttinclude "delayl.h〃ttinclude〃dsl302.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=l;j〈=8;j++)
{if(dat & 0x01)
DATH;//写1
else
DATL; //写0
delay nus (20); CLK _H; | |
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);
flag二tm_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) ;写入保护指令 | //根据写状态寄存器命令字, |