板子上的DS1302以前烧sunhm版主的那个测试程序,显示问号。。!!
就一直没有弄。。!!!
今天,突然很想把它写好。。!!
在网上就找了个DATASHEET,还有蒋建军的一个头文件。。!!!
今天,是头一次认真的好好的看一个完全英文的文件。。一边用金山词霸
发现也真的不有那么难。。。。。。!!发现这样的文档比中文全的多。。
自己的DS1302是外接的。原理图看这个贴子。
----------------------------------------------------------------------------------
今天,发现自己还是太懒了。。!!
不行,小雨要好好的努力。。不要怕。。!!!
---------------------------------------------------------------------------------------
下面是源程序,试用于CEPARK 51开发板。
/*************************************************
功能:利用DS1302做时钟,用数码管显示。一个按键调节(18B20右边的第一个键)。初始化显示时:分,
按一下按键显示分:秒。
这个只能看时分秒,也只用了一个按键,比较简单。将不定时升级,优化。
作者:小雨
QQ:151334856
版本:V1.0
时间:2009/04/01
*************************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar reg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar dis[6] = {0};
/*定义数码管位控端*/
sbit c1 = P1^0; //位码控制
sbit c2 = P1^1;
sbit c3 = P1^2;
sbit c4 = P1^3;
/*定义DS1302控制脚*/
sbit DS1302_CLK = P3^4;
sbit DS1302_RST = P3^5;
sbit DS1302_IO = P3^3;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
sbit Key = P2^0;
sbit Keyend = P2^4;
uchar Flag = 0;
uchar TempHour,TempMinute,TempSecond,Hour=12,Minute=59,Second=0;
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_WRITE 0x8E
#define DS1302_POWER 0x90
#define Time_24_Hour 0x00 //24时制控制
#define BCD2DEC(X) (((X&0x70)>>4)*10 + (X&0x0F)) //用于将BCD码转成十进制的宏
#define DEC2BCD(X) ((X/10)<<4 | (X%10)) //用于将十进制转成BCD码的宏
//实时时钟写入一字节(内部函数)
void DS1302InputByte(uchar d)
{
uchar i;
ACC = d;
for(i=8; i>0; i--)
{
DS1302_IO = ACC0; //相当于汇编中的 RRC
DS1302_CLK = 1;
DS1302_CLK = 0;
ACC = ACC >> 1;
}
}
//实时时钟读取一字节(内部函数)
uchar DS1302OutputByte()
{
unsigned char i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; //相当于汇编中的 RRC
ACC7 = DS1302_IO;
DS1302_CLK = 1;
DS1302_CLK = 0;
}
return(ACC);
}
//写DS1302,ucAddr: DS1302地址, ucData: 要写的数据
void Write1302(uchar ucAddr, uchar ucDa)
{
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr); // 地址,命令
DS1302InputByte(ucDa); // 写1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
}
//读取DS1302某地址的数据
uchar Read1302(uchar ucAddr)
{
uchar ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr|0x01); // 地址,命令
ucData = DS1302OutputByte(); // 读1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
return(ucData);
}
void delay(uchar i) //延时
{
for(;i>0;i--)
{
uchar j="244";while(--j);
}
}
void Display() //动态扫描显示
{
P1=0xff;
if(Flag==0)
{
P0=reg[dis[0]];
c1=0;
delay(5);
c1=1;
P0=reg[dis[1]]&0x7f;
c2=0;
delay(5);
c2=1;
P0=reg[dis[2]];
c3=0;
delay(5);
c3=1;
P0=reg[dis[3]];
c4=0;
delay(5);
c4=1;
}
else {
P0=reg[dis[2]];
c1=0;
delay(5);
c1=1;
P0=reg[dis[3]]&0x7f;
c2=0;
delay(5);
c2=1;
P0=reg[dis[4]];
c3=0;
delay(5);
c3=1;
P0=reg[dis[5]];
c4=0;
delay(5);
c4=1;
}
}
//读取时间函数
void DS1302_GetTime()
{
uchar ReadValue;
ReadValue = Read1302(DS1302_SECOND);
TempSecond = BCD2DEC(ReadValue&0x7F);
ReadValue = Read1302(DS1302_MINUTE);
TempMinute = BCD2DEC(ReadValue);
ReadValue = Read1302(DS1302_HOUR);
TempHour = BCD2DEC(ReadValue&0x7F);
}
//设置时间函数
void DS1302_SetTime()
{
Write1302(DS1302_WRITE,0x00); //关闭写保护
Write1302(DS1302_HOUR,DEC2BCD(Hour)|Time_24_Hour);
Write1302(DS1302_MINUTE,DEC2BCD(Minute));
Write1302(DS1302_SECOND,DEC2BCD(Second));
Write1302(DS1302_WRITE,0x80); //打开写保护
}
void OscCtrl(bit CtrlDat)
{
if(CtrlDat) Write1302(0x80,0x00);
else Write1302(0x80,0x80);
}
void Hex2Bcd()
{
dis[0] = TempHour/10;
dis[1] = TempHour%10;
dis[2] = TempMinute/10;
dis[3] = TempMinute%10;
dis[4] = TempSecond/10;
dis[5] = TempSecond%10;
}
void KeyCtrl()
{
if(Key==0)
{
delay(1000);
if(Key==0)
{
Flag++;
if(Flag>1) Flag = 0;
}
}
}
void main()
{
OscCtrl(1);
DS1302_SetTime();
Keyend = 0;
while(1)
{
KeyCtrl();
DS1302_GetTime();
Hex2Bcd();
Display();
}
}
文章评论(0条评论)
登录后参与讨论