震惊:一男子CT107D使用DS1302模块时,数值不会改变
时间:10-02
整理:3721RD
点击:
#include"reg52.h"
#include"DS1302.h"
/****************************/
/* 地址定义 */
void DS1302_delay(unsigned char x)
{
unsigned char i,j;
for(i=x;i>0;i--)
for(j=12;j>0;j--)
;
}
/****************************/
/* 驱动函数 */
/****************************/
/* DS1302写一个字节 */
/* dat:写进DS1302的数据 */
void DS1302_WRITE(unsigned char dat)
{
char i;
RST=0;
SCLK=0;
RST=1;
for(i=0;i<8;i++)
{
if(dat&0x01)
IO=1;
else
IO=0;
dat>>=1;
SCLK=0;
SCLK=1;
}
DS1302_delay(5);
RST=0;
}
/* DS1302读一个字节 */
/* dat:读回的数据 */
char DS1302_READ()
{
char i,dat,temp,dat2;
RST=0;
SCLK=0;
RST=1;
for(i=0;i<8;i++)
{
SCLK=1;
DS1302_delay(5);
SCLK=0;
if(IO)
temp|=0x80;
else
temp|=0x00;
dat>>=1;
}
DS1302_delay(5);
RST=0;
dat2=temp/16;
dat=temp%16;
temp=dat+dat2*10;
return(temp);
}
/*DS1302写寄存器驱动函数*/
/*reg:目标寄存器,dat:写进寄存器的数据*/
void DS1302_WRITE_REG(char reg,char dat)
{
char i;
EA=0;
RST=0;
SCLK=1;
RST=1;
for(i=0;i<8;i++)
{
SCLK=0;
IO=reg&0x01;
reg>>=1;
DS1302_delay(5);
SCLK=1;
}
for(i=0;i<0;i++)
{
SCLK=0;
IO=dat&0x01;
dat>>=1;
DS1302_delay(5);
SCLK=1;
}
DS1302_delay(5);
RST=0;
IO=1;
SCLK=1;
EA=1;
}
/*DS1302寄存器读驱动函数*/
/*reg:读目标函数,dat:读回的数据*/
char DS1302_READ_REG(char reg)
{
char i,dat1,dat2,temp=0;
EA=0;
RST=0;
SCLK=1;
RST=1;
for(i=0;i<8;i++)
{
SCLK=0;
IO=reg&0x01;
reg>>=1;
DS1302_delay(5);
SCLK=1;
}
for(i=0;i<8;i++)
{
temp>>=1;
SCLK=0;
if(IO)
temp|=0x80;
else
temp|=0x00;
SCLK=1;
}
DS1302_delay(5);
RST=0;
IO=1;
SCLK=1;
dat1=temp/16;
dat2=temp%16;
temp=dat2+dat1*10;
EA=1;
return(temp);
}
#include"reg52.h"
#include"DS1302.h"
#include"absacc.h"
sfr AUXR = 0x8E;
uchar code table[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xFF};
//最后一个为熄灭
uchar dspbuf[]={10,10,10,10,10,10,10,10};
uchar dspcom;
uchar intr;
bit flag_DS1302;
void display();
void init_DS1302();
void init_T0();
void cls_beep();
void main()
{
uchar second,minute,hour;
init_DS1302();
init_T0();
cls_beep();
while(1)
{
if(flag_DS1302)
{
flag_DS1302=0;
hour =DS1302_READ_REG(READ_HOUR);
minute =DS1302_READ_REG(READ_MINUTE);
second =DS1302_READ_REG(READ_SECOND);
dspbuf[0]=hour/10;
dspbuf[1]=hour%10;
dspbuf[2]=minute/10;
dspbuf[3]=minute%10;
dspbuf[4]=second/10;
dspbuf[5]=second%10;
}
}
}
void init_T0()
{
TMOD&=0XF0;
TMOD|=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
EA=1;
}
void init_DS1302()
{
DS1302_WRITE_REG(WRITE_PROTECT,0X00);
DS1302_WRITE_REG(WRITE_SECOND,0X56);
DS1302_WRITE_REG(WRITE_MINUTE,0X15);
DS1302_WRITE_REG(WRITE_HOUR,0X15);
DS1302_WRITE_REG(WRITE_PROTECT,0X80);
}
void display()
{
P0 = 0xff;
P2 = ((P2&0x1f)|0xE0);
P2 &= 0x1f;
P0 = 1<<dspcom;
P2 = ((P2&0x1f)|0xC0);
P2 &= 0x1f;
P0 = table[dspbuf[dspcom]];
P2 = ((P2&0x1f)|0xE0);
P2 &= 0x1f;
if(++dspcom == 8){
dspcom = 0;
}
}
void inter_T0() interrupt 1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
intr++;
display();
if(intr==20)
{
intr=0;
flag_DS1302=1;
}
}
void cls_beep()
{
P2=((P2&0x1f)|0xa0);
P0=0x00;
P2&=0x1f;
}
#include"DS1302.h"
/****************************/
/* 地址定义 */
void DS1302_delay(unsigned char x)
{
unsigned char i,j;
for(i=x;i>0;i--)
for(j=12;j>0;j--)
;
}
/****************************/
/* 驱动函数 */
/****************************/
/* DS1302写一个字节 */
/* dat:写进DS1302的数据 */
void DS1302_WRITE(unsigned char dat)
{
char i;
RST=0;
SCLK=0;
RST=1;
for(i=0;i<8;i++)
{
if(dat&0x01)
IO=1;
else
IO=0;
dat>>=1;
SCLK=0;
SCLK=1;
}
DS1302_delay(5);
RST=0;
}
/* DS1302读一个字节 */
/* dat:读回的数据 */
char DS1302_READ()
{
char i,dat,temp,dat2;
RST=0;
SCLK=0;
RST=1;
for(i=0;i<8;i++)
{
SCLK=1;
DS1302_delay(5);
SCLK=0;
if(IO)
temp|=0x80;
else
temp|=0x00;
dat>>=1;
}
DS1302_delay(5);
RST=0;
dat2=temp/16;
dat=temp%16;
temp=dat+dat2*10;
return(temp);
}
/*DS1302写寄存器驱动函数*/
/*reg:目标寄存器,dat:写进寄存器的数据*/
void DS1302_WRITE_REG(char reg,char dat)
{
char i;
EA=0;
RST=0;
SCLK=1;
RST=1;
for(i=0;i<8;i++)
{
SCLK=0;
IO=reg&0x01;
reg>>=1;
DS1302_delay(5);
SCLK=1;
}
for(i=0;i<0;i++)
{
SCLK=0;
IO=dat&0x01;
dat>>=1;
DS1302_delay(5);
SCLK=1;
}
DS1302_delay(5);
RST=0;
IO=1;
SCLK=1;
EA=1;
}
/*DS1302寄存器读驱动函数*/
/*reg:读目标函数,dat:读回的数据*/
char DS1302_READ_REG(char reg)
{
char i,dat1,dat2,temp=0;
EA=0;
RST=0;
SCLK=1;
RST=1;
for(i=0;i<8;i++)
{
SCLK=0;
IO=reg&0x01;
reg>>=1;
DS1302_delay(5);
SCLK=1;
}
for(i=0;i<8;i++)
{
temp>>=1;
SCLK=0;
if(IO)
temp|=0x80;
else
temp|=0x00;
SCLK=1;
}
DS1302_delay(5);
RST=0;
IO=1;
SCLK=1;
dat1=temp/16;
dat2=temp%16;
temp=dat2+dat1*10;
EA=1;
return(temp);
}
#include"reg52.h"
#include"DS1302.h"
#include"absacc.h"
sfr AUXR = 0x8E;
uchar code table[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xFF};
//最后一个为熄灭
uchar dspbuf[]={10,10,10,10,10,10,10,10};
uchar dspcom;
uchar intr;
bit flag_DS1302;
void display();
void init_DS1302();
void init_T0();
void cls_beep();
void main()
{
uchar second,minute,hour;
init_DS1302();
init_T0();
cls_beep();
while(1)
{
if(flag_DS1302)
{
flag_DS1302=0;
hour =DS1302_READ_REG(READ_HOUR);
minute =DS1302_READ_REG(READ_MINUTE);
second =DS1302_READ_REG(READ_SECOND);
dspbuf[0]=hour/10;
dspbuf[1]=hour%10;
dspbuf[2]=minute/10;
dspbuf[3]=minute%10;
dspbuf[4]=second/10;
dspbuf[5]=second%10;
}
}
}
void init_T0()
{
TMOD&=0XF0;
TMOD|=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
EA=1;
}
void init_DS1302()
{
DS1302_WRITE_REG(WRITE_PROTECT,0X00);
DS1302_WRITE_REG(WRITE_SECOND,0X56);
DS1302_WRITE_REG(WRITE_MINUTE,0X15);
DS1302_WRITE_REG(WRITE_HOUR,0X15);
DS1302_WRITE_REG(WRITE_PROTECT,0X80);
}
void display()
{
P0 = 0xff;
P2 = ((P2&0x1f)|0xE0);
P2 &= 0x1f;
P0 = 1<<dspcom;
P2 = ((P2&0x1f)|0xC0);
P2 &= 0x1f;
P0 = table[dspbuf[dspcom]];
P2 = ((P2&0x1f)|0xE0);
P2 &= 0x1f;
if(++dspcom == 8){
dspcom = 0;
}
}
void inter_T0() interrupt 1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
intr++;
display();
if(intr==20)
{
intr=0;
flag_DS1302=1;
}
}
void cls_beep()
{
P2=((P2&0x1f)|0xa0);
P0=0x00;
P2&=0x1f;
}
标题party
明天来UC报道!
代码没细看,应该是1302的时序不对,你去参考一下开发板上的历程,荡一个下来改改。
我想问下,我那个DS1302时序已经调好了,但是我的秒数码管在从59调变到00时,却显示不出来,等到1分钟过去之后才会出现,请问您有了解过着类的问题吗/
LZ可以参考下我针对CT107D的固件库
你把1302读出来的数据通过串口打印在调试助手里看一下秒是如何变化的,尤其是从59->00的时候,数据抓到了要显示就是很简单的事情了。
多谢,我尝试一下
太棒了
你写的很棒,但是我看不懂,呜呜
请教下这位前辈,请问蓝桥杯是会给时序的驱动函数是吗?
我也是参加这届的。会给datasheet
只给数据手册?有没有底层驱动函数?
部分会给
我UC已经满了