我上大四了,现在在北京某公司实习,硬件工程,
代码拖拖拉拉写了两个月的时间,年前考试之前就开始写了,由于考试和找工作的事,耽搁了 ,年后,实习,发现,软件搞好很有必要,所以我以后一码一字都要自己写,以后才能成长
所以又把它拿起来了。今天终于成功了。
亲测能用。里面内嵌了串口调试程序,也就是说时间不仅通过数码管显示,还会把读取出的时分秒发到PC上去,方便调试!
测试时有一个小插曲:就是DS1302运行起来后,走时不准,不像网上说的那个走时不准还比较靠谱的,一分钟差几秒,我这个是实际走十多秒,它才走一秒。用开发板带的例程烧进去也是很不准。大概实际走五秒才走一秒
最后我把纽扣电池卸下了,重新安装回去就好了。解决问题!
献丑了,献给后来人
/*
DS1302时钟芯片数码管显示
zhanglei
2014年1月28日7:40:14
*/
#include <reg52.h>
#include <intrins.h>
#define SECR 0x81 //对秒寄存器进行读操作
#define SECW 0x80 //对秒寄存器进行写操作
#define MINW 0x82 //对分寄存器进行写操作
#define MINR 0x83 //对分寄存器进行读操作
#define HOUW 0x84 //对小时寄存器进行写操作
#define HOUR 0x85 //对小时寄存器进行读操作
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//数码管显示0~9的段码表
unsigned char code sheet[1]={0x00};
unsigned char h,m,s;
sbit SCLK=P1^0;
sbit IO=P1^1;
sbit RST=P1^2;
sbit ACC7=ACC^7;
//显示延时函数
void delayms(unsigned char i)
{
unsigned char j;
for(;i>0;i--)
{
for(j=0;j<200;j++);
}
}
//函数功能:通过串口中断测试读取出来的时,分,秒
//入口参数:读取出来的数据m,h,s
//返回值:无
void Com_Init()
{
SCON= 0x40; //串口方式1
PCON=0; //SMOD=0
REN=1; //允许接收
TMOD= 0x20; //定时器1定时方式2
TH1= 0xfd; //11.0592M 9600波特率
TL1= 0xfd;
TR1= 1; //启动定时器
}
//函数功能:SPI总线字节写函数
//入口参数:寄存器地址addr,写入寄存器的数据dat
//返回值:无
void writedata(unsigned char addr,unsigned char dat)
{
unsigned char i;
unsigned char j;
RST=0;
SCLK=0;
RST=1;
for(i=0;i<8;i++)
{
SCLK=0;
IO=(bit)(addr&0x01);
addr>>=1;
SCLK=1;
_nop_();
_nop_();
}
for(j=0;j<8;j++)
{
SCLK=0;
IO=(bit)(dat&0x01);
dat>>=1;
SCLK=1;
_nop_();
_nop_();
}
RST=0;
SCLK=1;
}
//SPI总线读取数据函数
//入口参数:addr 存储数据的地址
//返回值:返回SPI总线上的数据
unsigned char readdata(unsigned char addr)
{
unsigned char i;
unsigned char date;
RST=0;
SCLK=0;
IO=0;
RST=1;
for(i=0;i<8;i++)
{
SCLK=0;
IO=(bit)(addr&0x01);
addr>>=1;
SCLK=1;
_nop_();
_nop_();
}
for(i=0;i<8;i++)
{
ACC7=IO;//数据是从低位开始读取的
SCLK=1;
SCLK=0;
ACC>>=1;
}
SCLK=1;
RST=0;
date=ACC;
return date;
}
//函数功能:读取小时,分,秒数据并显示
//入口参数:无
//返回值:无
void ledshow()
{
h=readdata(HOUR);//读取小时
m=readdata(MINR);//读取分钟
s=readdata(SECR);//读取秒
//打印时,分,秒
SBUF=h;
while(TI==0);
TI=0;
SBUF=m;
while(TI==0);
TI=0;
SBUF=s;
while(TI==0);
TI=0;
SBUF=sheet[0];
while(TI==0);
TI=0;
/***
*******zhanglei test ledshow
// h=0x20;
// m=0x24;
// s=0x22;
******/
P2=0xfd;
P0=tab[(h&0x0f)];
delayms(5);
P2=0xfe;
P0=tab[((h>>4)&0x07)];
delayms(5);
P2=0xf7;
P0=tab[(m&0x0f)];
delayms(5);
P2=0xfb;
P0=tab[((m>>4)&0x07)];
delayms(5);
P2=0xdf;
P0=tab[(s&0x0f)];
delayms(5);
P2=0xef;
P0=tab[((s>>4)&0x07)];
delayms(5);
}
void main(void)
{
Com_Init();
writedata(0x8e,0x00);//对0x8e寄存器操作,去掉写保护,对最高位WP写0 ·
//对DS1302写入时间 20:24:22
writedata(HOUW,0x20);//设置小时,模式24h制,
writedata(MINW,0x58);//设置分钟
writedata(SECW,0x22);//设置秒并且使DS1302开始走时
writedata(0x8e,0x80);//进行写保护
while(1)
{
delayms(3);
ledshow();
}
}
复制代码转载
|