80C51单片机数字钟

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(二)使用DS1302实现时钟
一、实验原理:
二、详细程序:
/***********时钟,显示:时、分、秒;年,月,日。

可调时,使用1302**************/ /*********************2011,4,17***********************/
/********************* *****************************/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sclk=P2^1;
sbit rst=P2^2;
sbit io=P2^3;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit CLKPIN = P1^6;
sbit DIPIN = P1^3;
sbit k1=P1^1;
sbit k2=P1^2;
sbit k3=P1^0;
uchar miao,fen,year,month,day,shi,shi_shi,shi_ge,fen_shi,
fen_ge,miao_shi,miao_ge,year_shi,year_ge,month_shi,
month_ge,day_shi,day_ge;
uchar s_shi,s_fen,s_miao; //转换进制时用
uchar sfen,sshi,smiao; //调整分\时\秒
uint num1,num2,num3,num4;
uchar code riqi[]={0x11,0x04,0x17};//ss_year=0x10,ss_month=0x04,ss_day=0x17;
void delay()
{
uchar x,y;
for(x=110;x>0;x--)
for(y=60;y>0;y--);
}
void delay1(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void transbit(bit d)
{ DIPIN = d;
_nop_();
_nop_();
CLKPIN = 1;
_nop_();
_nop_();
CLKPIN = 0;
_nop_();
_nop_();
CLKPIN = 1;
}
void transbyte(unsigned char d)
{ unsigned char i;
for(i=0;i<8;i++)
{ if((d&0x1) == 0x1)
transbit(1);
else
transbit(0);
d>>=1;
}
}
unsigned char code NUMCODETAB[]={0xFC,0x60,0xDA,0xF2, //数字0,1,2,3
0x66,0xB6,0xBE,0xE0, //数字4,5,6,7
0xFE,0xF6,0x00,0x02, //数字8,9,字符空格,字符-
0x9C,0xCE,0x9E,0x8E}; //字符C,字符P,字符E,字符F void transram(n1,n2,n3,n4,n5,n6,n7,n8) //显示程序
{
unsigned char buf;
buf=0x00;
buf=NUMCODETAB[n1];
transbyte(buf);
buf=NUMCODETAB[n2];
transbyte(buf);
buf=NUMCODETAB[n3];
transbyte(buf);
buf=NUMCODETAB[n4];
transbyte(buf);
buf=NUMCODETAB[n5];
transbyte(buf);
buf=NUMCODETAB[n6];
transbyte(buf);
buf=NUMCODETAB[n7];
transbyte(buf);
buf=NUMCODETAB[n8];
transbyte(buf);
delay();
}
void DS1302_Write(uchar D)
{ //DS1302写入函数uchar i;
for(i=0;i<8;i++){
io=D&0x01;
sclk=1;
sclk=0;
D=D>>1;
}
}
uchar DS1302_Read(){ //DS1302读出函数uchar TempDat=0,i;
for(i=0;i<8;i++)
{
TempDat>>=1;
if(io) TempDat=TempDat|0x80;
sclk=1;
sclk=0;
}
return TempDat;
}
void wt_sb(uchar addr, uchar date) //DS1302单字节写入函数{
rst = 0;
sclk = 0;
rst = 1;
DS1302_Write(addr); // 写地址
DS1302_Write(date); // 写1Byte数据sclk = 1;
}
uchar rd_sb(uchar addr) //DS1302单字节读出函数
{
uchar date;
rst = 0;
sclk = 0;
rst = 1;
DS1302_Write(addr);
date=DS1302_Read();
sclk = 1;
rst = 0;
return date;
}
void SetTime(uchar ss_miao,uchar ss_fen,uchar ss_shi) //时间设置函数{
wt_sb(0x80,ss_miao&0x7f);
wt_sb(0x82,ss_fen&0x7f);
wt_sb(0x84,ss_shi&0xbf);
}
void set_riqi()
{
wt_sb(0x8c,riqi[0]);
wt_sb(0x88,riqi[1]&0x1f);
wt_sb(0x86,riqi[2]&0x3f);
}
void charge_mode()
{
wt_sb(0x90, 0xa6); //一个电阻,一个二极管充电
}
void DecToBCD() //二-十进制转换函数
{
s_shi=(((sshi)/10)<<4)+((sshi)%10);
s_fen=(((sfen)/10)<<4)+((sfen)%10);
s_miao=((smiao/10)<<4)+((smiao)%10);
}
void key_set()
{
if((k1==0)|(k2==0)) //判断是否有调整时间键按下
{
if (k1==0) //调分
delay1(2); //消抖
if(k1==0)
{
while(!k1); //等待松手
sfen++;
if(sfen==60)
sfen=0;
}
}
if (k2==0) //调时
{
delay1(2);
if(k2==0)
{
while(!k2);
sshi++;
if(sshi==24)
sshi=0;
s_shi=((sshi/10)<<4)+(sshi%10);
}
}
DecToBCD(); //十进制转换为BCD码
SetTime(s_miao,s_fen,s_shi);//修改时间
}
if(k3==0)
{
delay1(2);
if(k3==0)
{
while(!k3);
transram(year_shi,year_ge,11,month_shi,month_ge,11,day_shi,day_ge);
delay1(2000);
}
}
}
void rd_ntime() //读取当前时间
{
uchar temp;
temp=rd_sb(0x81); //second
miao=((temp&0x7f)>>4)*10+(temp&0x0f);
miao_shi=miao/10;
miao_ge=miao%10;
temp=rd_sb(0x83); //minute
fen=((temp&0x7f)>>4)*10+(temp&0x0f);
fen_shi=fen/10;
fen_ge=fen%10;
temp=rd_sb(0x85);
shi=((temp&0x3f)>>4)*10+(temp&0x0f); //hour
shi_shi=shi/10;
shi_ge=shi%10;
}
void read_ndate()
{
uchar temp;
temp=rd_sb(0x87);
day=((temp&0x3f)>>4)*10+(temp&0x0f); //day
day_shi=day/10;
day_ge=day%10;
temp=rd_sb(0x89);
month=((temp&0x1f)>>4)*10+(temp&0x0f); //month
month_shi=month/10;
month_ge=month%10;
temp=rd_sb(0x8d);
year=((temp&0xff)>>4)*10+(temp&0x0f); //year
year_shi=year/10;
year_ge=year%10;
}
void main()
{
charge_mode();
set_riqi();
while(1)
{
rd_ntime();
read_ndate();
transram(shi_shi,shi_ge,11,fen_shi,fen_ge,11,miao_shi,miao_ge);
key_set();
}
}
三、硬件电路:。

相关文档
最新文档