该文档包括原理图、源代码,系统的介绍了51单片机和DS1302的应用,显示方式为4位共阴时钟数码管,具有调时功能,原理图和源代码都已验证是可用的。
E:\Demo\Keil3\IS EB51M V100 DEMO\ 12Hf i\ds1302.c
sbit ntds p3 3
sbit ntoe= p3 5
sbit ntst p3 6
sbit ntsh= p3 7
74C595功能引做定义
uchar code ckntSegDot[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};/段砖,共例,带DP
uchar code ckntSeg]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/段码,共阴,19
uchar code ckntDig[]=Oxf7, Oxfb, Oxfd, Oxfe, Oxff)
位妈,共阴
uchar second, minute, hour, week, day, month, year
char secondL, second. minute, minute. hour, hour
uint blinkMin, blinkhour
bit isset, issetMin, issethour
==延的函数
void Delay (uint ent)
while(cnt--)
=S1302写字节数==
void Ds1302WriteByte(uchar abc
uchar
recce 1
rtccK =0
nop (
for(i=0;i<8;i++)
Page: 2
E:\Demo\Keil3\IS EB51M V100 DEMO\ 12Hf i\ds1302.c
rtio= abc oxol
/按位与,取最低位
nop
rtcCK I
)
nop (
rtcCK= 0
abc>>=1;
谁备传输次高位
DS1302读字节函数
uchar Ds1302ReadByte o
uchar i read dat
recce= 1
for(i=0;i<8;i+)
rcad dat >>=1
if(rtiO==1
rcad dat=0x80
rtcCK 1
(
nop (
rtcCK =0
nop
)
return read dat
Page: 3
E:\Demo\Keil3\IS EB51M V100 DEMO\ 12Hf i\ds1302.c
===DS1302读数据数
uchar Ds1302Read (uchar read addr)
uchar read dat
rtcc =0
rtcCK =0:
Ds1302WriteByte(read addr)
read dat= Dsl302ReadByteo
rtccK= 1
recce= 0
return read dat
=DS1302写的数===
void Ds1302Writc(uchar write addr, uchar write dat
rtcc= o
rtcCK =0
Ds1302WritcBytc(write addr)
先写地址
Ds1302WriteByte(write dat)
再写数据
rtccK =0
recce =0
=数据转化的数==
void DataTrans o
数据转化,提取BCD码
Page: 41
E:\Demo\Keil3\IS EB51M V100 DEMO\ 12Hf i\ds1302.c
/便于在数码管显示
secondl second oof
second >>=4
second= second oof
minute minute oof
minute >>=4
minute minute oof
hour hour OoF
hour >>=4
hour hour oof
共阴数码管显小函数
void CkntDisplay(uchar segTmp, uchar digTmp)
uchar i, tmp =0x80
for(i=0;i<8;i++)
位码,实际用了4位
ntsh =o
ntds =(digtmp tmp)? 1: 0
提取高位数据
ntsH= l
上开沿有效
di gmp =1
位码数据右移1位,将次高位变为最高位
for(i=0;i<8;i+)
段码,高位在成
Page: 5
E:\Demo\Keil3\IS EB51M V100 DEMO\ 12Hf i\ds1302.c
ntsH =o
ntDs=(segTmp tmp )? 1: 0
/提取高位数据
ntsh=l
上开沿有效
segtmp =1
段妈数据右移1位,将次高位变为最高位
ntsT =0
nop o)
ntst =1
将移位奇存器数据存入存信寄存器中
nop (
上开沿有效
ntSH=0
ntst=0
调餐74bc595的序,以待后用
ntoe =0
使能746c595输出
是示方式数
void Display o
if (isSet == 1)
调整时间时的显示方式
if(is SetMin== 1)
/调整分钟
blinkIng+
调整时间时,次定了分钟的闪烁频率
if(blinkMin <250
/在调整的时间模式下,分的显示
Page: 6
E:\Demo\Keil3\IS EB51M V100 DEMO\ 12Hf i\ds1302.c
CkntDisplay(ckntSeg [minuteL], ckntDig[o])
CkntDisplay(ckntSeg lminutehl, ckntDig[l])
else if((blinkMin >=250)&&(blinkMin< 500))
在调整时间模式下,分钟不显示
CkntDisplay(ckntSeg [minuteL], ckntDig [4])
CkntDisplay(ckntSeg [minute], ckntDig[4])
e⊥se
blinkMin=0
CkntDisplay(ckntSeg lhourl, ckntDig[2])
CkntDisplay(ckntSeg hour], ckntDig[3])
if(isSetHour ==1)
调整小的
blinkHour++
调整的间的,决定了小的的闪烁级率
if(blinkHour 250)
在调整的间模式下,小时显示
CkntDisplay(ckntScg lhourl], ckntDig[2])
CkntDisplay(ckntSeg lhourHl, ckntDigl3)
else if((b1 inhour>=250)&&( blinkhour<500)在调整的问模式下,小的不显示
CkntDisplay(ckntSeg [hourL], ckntDig[4])
CkntDisplay(ckntSeg thourH], ckntDig[4l)
e⊥se
Page: 7
E:\Demo\Keil3\IS EB51M V100 DEMO\ 12Hf i\ds1302.c
blinkhour =0
CkntDisplay(ckntSeg [minute], ckntDig[o)
CkntDisplay (ckntSeg [], ckntDig[l])
else
正常是示模式
/CkntDisplay(ckntSegisecondL ckntDiglo)
//CkntDisplay(ckntseglsecondH/, ckntDigl1/)
CkntDisplay(ckntSeg [minuteL], ckntDig[o])
Delay(100)
延时是调整数码管的显示亮度
CkntDisplay(ckntSeglminuteHl, ckntDigli])
Delay (10o
if((secondL %2)== 0)
判断是否显示欢点
CkntDisplay(cknt Scglot [hour], ckntDig[2])
else
CkntDisplay(cknt Scg hour], ckntDig[2])
Delay (100)
CkntDisplay(ckntscgthourH], ckntDig[3])
盘扫数==
void KeyScan o
Page: 8
E:\Demo\Keil3\IS EB51M V100 DEMO\ 12Hf i\ds1302.c
间加键
if ((upKey== 0)&&(isSet== 1)
Delay(200)
/去抖
if (upkey ==0
if (isSetMin ==1
minute++
if(minute = 10)
minute =0
minutest
if(minute== 10)&&(minute =5))
minute=o
minute =0
else if(isSctHour==1
hourly+
if((hour( 2)&&(hour == 10))
hour =0
h
our++
if((hour ==2)&&(hourL ==5))
Page: 9