找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3870|回复: 1
打印 上一主题 下一主题
收起左侧

[求助]关于数码管显示电子钟

[复制链接]
跳转到指定楼层
楼主
ID:30026 发表于 2011-8-12 21:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

我刚学单片机,做了个用DS1302在数码管显示的程序,可是数码管每个2秒才会加1,求各位帮忙看看


#include<reg52.h>
#include <intrins.h>


/******************端口定义*****************/

sbit io=P1^0;
sbit sclk=P1^1;
sbit ce=P1^2;
sbit dula=P2^0;
sbit wela=P2^1;

 

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};


 


/******************延时函数*****************/

void delay(uchar x)
{
 uchar a,b;
 for(a=x;a>0;a--)
  for(b=110;b>0;b--); 
}

 

 

/******************ds1302初始化*****************/

void reset_ds1302()
{
 ce=0;
  _nop_();
 sclk=0;
  _nop_();
 ce=1;
  _nop_();  //延时一个机器周期
}

 

 

 

/******************ds1302写操作*****************/

void ds1302_write(uchar add,uchar date)
{
 uchar temp,i;
 reset_ds1302();
 temp=add;    //写地址

 for(i=0;i<8;i++)
 {
  if((temp&0x01)==1)
   io=1;
  else
   io=0;
  sclk=1;
   _nop_();
  temp=temp>>1;
  sclk=0;
   _nop_();
 }
 temp=date;   //写数据
 for(i=0;i<8;i++)
 {
  if((temp&0x01)==1)
   io=1;
  else
   io=0;
  sclk=1;
   _nop_();
  temp=temp>>1;
  sclk=0;
   _nop_();
 }
 ce=0;
  _nop_();
}

 

 

 

/******************ds1302读操作*****************/

uchar ds1302_read(uchar add)
{
 uchar temp,i;
 reset_ds1302(); 
 temp=add;   //写地址
 for(i=0;i<8;i++)
 {
  if((temp&0x01)==1)
   io=1;
  else
   io=0;
  sclk=1;
   _nop_();
  temp=temp>>1;
  sclk=0;
   _nop_();
 }
 temp=0;   //读数据
 for(i=0;i<8;i++)
 {
  if(io==1)
   temp=temp|0x80;
  else
   temp=temp&0x7f;
  sclk=1;
   _nop_();
  temp=temp>>1;
  sclk=0;
   _nop_();
 }
 return temp;
}

/******************设置初始时间*****************/

void set_time()
{
 ds1302_write(0x8e,0x00);//关闭写保护
 ds1302_write(0x80,0x00);
 ds1302_write(0x82,0x00);
 ds1302_write(0x84,0x00);
 ds1302_write(0x8e,0x80); //打开写保护
}

//数码管显示
void display(uchar shi,uchar fen,uchar miao)

{
 P0=0xfe;

 wela=1;
 wela=0;
 P0=table[shi/10];
 dula=1;
 dula=0;
 delay(1);

 

 P0=0xfd; 

 wela=1;
 wela=0;
 P0=table[shi%10];
 dula=1;
 dula=0;
 delay(1);


 

 P0=0xfb; 

 wela=1;
 wela=0;
 P0=table[fen/10];
 dula=1;
 dula=0;
 delay(1);

 

 P0=0xf7; 

 wela=1;
 wela=0;
 P0=table[fen%10];
 dula=1;
 dula=0;
 delay(1);

 

 P0=0xef; 

 wela=1;
 wela=0;
 P0=table[miao/10];
 dula=1;
 dula=0;
 delay(1);

 

 P0=0xdf; 

 wela=1;
 wela=0;
 P0=table[miao%10];
 dula=1;
 dula=0;
 delay(1);


}

 

 

 


void main()
{
 uchar shi,fen,miao;
 set_time();
 while(1)
 {
  shi=ds1302_read(0x85);   //读时的数据
  shi=(shi>>4)*10+(shi&0x0f);//将BCD码转换成十进制数
  fen=ds1302_read(0x83);//读分的数据
  fen=(fen>>4)*10+(fen&0x0f);//将BSD码转换成十进制
  miao=ds1302_read(0x81);//读秒
  miao=(miao>>4)*10+(miao&0x0f);
  display(shi,fen,miao);
 }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:77498 发表于 2017-5-4 15:41 | 只看该作者
有电路图吗我想制作个时钟
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表