DS1302三键4位1.5寸数码管时钟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
说明:最初跑得不太准,把1302的电容换成7p以后,精度非常好,具体没有查误差,反正好几个月与家里的石英钟很对时。5v供电,亮度不高,室内用正好。本人程序基本抄袭的,其中秒是用定时器模拟闪动,各位老师多多指教,原来是显示带拐角的7,让我改了,第一位为零时也改作不显示了,请各位大大批评指正!随便挣俩钱儿
(感谢江顺万老师的细心批评指正,由于自己不够严谨导致一点错误,已经在原文改过,深表歉意!)
先上电路图:
再上个实物图:
分解图:
最后上c程序,不用下载,照顾没米的大大,欢迎批评,砸点儿币过来。三鞠躬!
/**********************************
DS1302 四位数码管
***********************************/
#include
#define uchar unsigned char
#define uint unsigned int
#define D P2 //段选
#define D P0 //位选
sbit IO=P1^1; //数据口
sbit SCLK=P1^2; //控制数据时钟
sbit RST=P1^0; //使能端、复位端
/************按键引脚定义***********/
sbit s1=P1^5; //按键加
sbit s2=P1^3; //按键减
sbit s3=P1^4; //按键选择
sbit led=P1^7; //闪烁的小数点
uchar s, knum=0,snum,fnum;
标志。
/***********写时分秒地址************/
#define write_shi 0x84
#define write_fen 0x82
#define write_miao 0x80
/***********读时分秒地址************/
#define read_shi 0x85
#define read_fen 0x83
#define read_miao 0x81
bit miao_flag;
char miao_num;
char Dmiao;
char shi,fen,miao; //读出数据存储变量
uchar d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90}; //不带小数点,共阳
uchar dd[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点,共阳
void delay(uint z) //延时函数,z的取值为这个函数的延时ms数,如 delay(200);大约延时200ms.
{ //delay(500);大约延时500ms.
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void t0_init() //定时50ms一个中断
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
uchar read_1302(uchar add) //读函数
{
uchar i,date;
RST=0; //禁止读写数据
for(i=0;i<8;i++)
{
RST=1;
SCLK=0;
IO=add&0x01;
add>>=1;
SCLK=1;
}
for(i=0;i<8;i++)
{
if(IO)
date=date|0x80;
else
date=date|0x00;
SCLK=1;
date>>=1;
SCLK=0;
}
RST=0;
date=date/16*10+date%16;//进制转换16转10进制
IO=0; //数据读完后,IO口必须为0,不然小时一直显示85 return date;
}
void write_1302(uchar add,uchar dat) //写函数
{
uchar i;
RST=0; //禁止读写数据
SCLK=0;
for(i=0;i<8;i++) //写地址
{
RST=1; //允许读写数据
SCLK=0;
IO=add&0x01;
add>>=1;
SCLK=1;
}
for(i=0;i<8;i++) //写数据
{
RST=1; //允许读写数据
SCLK=0;
IO=dat&0x01;
dat>>=1;
SCLK=1;
}
RST=0;
}
void init_1302() //初始化函数设置时间
{
flag=read_1302(0x81);
if(flag&0x80)
write_1302(0x8e,0x00); //保护取消,可以进行读写操作write_1302(write_miao,0x56);
write_1302(write_fen,0x49);
write_1302(write_shi,0x14);
write_1302(0x90,0xa5);
write_1302(0x8e,0x80); //保护启动,不能进行读写操作}
void display(uchar shi,uchar fen) //显示函数
{
if(knum==0)
{
snum=30;
fnum=30;
}
if(knum==1)
{
fnum++;
snum=30;
}
if(knum==2)
{
snum++;
fnum=30;
}
if(snum>=30)
{
W=0xF7; //位选
s=d[shi/10];//段码先给s,判断其值是否为0,
if(s==0xc0)
{
W=0xff;
D=0xff;
}
D=s;//s不为零则给D,让其显示
delay(5);