智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1737|回复: 0
打印 上一主题 下一主题

DS1302显示问题

[复制链接]

9

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
327
QQ
威望
257
贡献
64
兑换币
0
注册时间
2010-10-15
在线时间
3 小时
跳转到指定楼层
1#
发表于 2011-10-13 20:06:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我写了个DS1302的程序,小时和秒显示都正常,但是分钟不知道是怎么回事,一下正常一下不正常!但是时间走的很正确!数码管显示我专门测试过,是没有问题的!请高手指点!
#include "reg51.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit p25=P2^5;
sbit p26=P2^6;
sbit p27=P2^7;
sbit clk= P1^7;
sbit io= P2^3;
sbit rst= P1^3;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
uchar code table[10]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90}; //显示段码
uchar second,minute,hour;  //秒、分、时、星期、日、月、年
uchar time[]={0x01,0x01,0x00}; //初始时间数组09年12月12日21点21分00秒
void delayms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/****************************************************************************
函数功能:数码管显示子程序
入口参数:
出口参数:
****************************************************************************/
void display()
{
// uchar qian,bai,shi,ge;
// qian=zhi/1000;
// bai=zhi%1000/100;
// shi=zhi%1000%100/10;
// ge=zhi%10;
p25=1;
p26=1;
p27=1;
P0=table[1];//  hour/16
p25=0;
p26=1;
p27=1;
P0=0x04;
delayms(5);
p25=1;
p26=1;
p27=1;
P0=table[2];//hour%16
p25=0;
p26=1;
p27=1;
P0=0x08;
delayms(5);
p25=1;
p26=1;
p27=1;
P0=table[minute/16];
p25=0;
p26=1;
p27=1;
P0=0x10;
delayms(5);
p25=1;
p26=1;
p27=1;
P0=table[minute%16];
p25=0;
p26=1;
p27=1;
P0=0x20;
delayms(5);
p25=1;
p26=1;
p27=1;
P0=table[second/16];
p25=0;
p26=1;
p27=1;
P0=0x40;
delayms(5);
p25=1;
p26=1;
p27=1;
P0=table[second%16];
p25=0;
p26=1;
p27=1;
P0=0x80;
delayms(5);
}
/*****************************************************************************
函数功能:向DS1302送一字节数据子程序
入口参数:
出口参数:
*****************************************************************************/
void write_byte(uchar byte)
{ uchar i;
ACC=byte;
for(i=8;i>0;i--)
{
  io=ACC0;
  clk=1;
  clk=0;
  ACC=ACC>>1;
}
return;
}
/*****************************************************************************
函数功能:读DS1302一个字节子程序
入口参数:
出口参数:
*****************************************************************************/
uchar read_byte()  
{
uchar i;
for(i=8;i>0;i--)
{ ACC=ACC>>1;
  ACC7=io;
  clk=1;
  clk=0;
  }
  return(ACC);
}
/*****************************************************************************
函数功能:向DS1302某地址写一字节数据子程序
入口参数:addr,TDat
出口参数:
*****************************************************************************/
void write_ds1302(uchar addr,uchar TDat)
{
rst=0;
_nop_();
clk=0;
_nop_();
rst=1;
  write_byte(addr);
_nop_();
write_byte(TDat);
clk=1;
_nop_();
rst=0;
}
/*****************************************************************************
函数功能:读DS1302地址子程序
入口参数:add
出口参数:timedata
*****************************************************************************/
uchar read_ds1302(uchar addr)
{
uchar timedata;
rst=0;
_nop_();
clk=0;
_nop_();
rst=1;
write_byte(addr);
timedata=read_byte();
clk=1;
_nop_();
rst=0;
return(timedata);
}
/*****************************************************************************
函数功能:初始化DS1302子程序
入口参数:time[](全局变量)
出口参数:
*****************************************************************************/
void initial_ds1302()
{
write_ds1302(0x8e,0x00);  //写保护寄存器,在对时钟或RAM写前WP一定要为0
//write_ds1302(0x8c,time[0]);  //年
//write_ds1302(0x88,time[1]);  //月
//write_ds1302(0x86,time[2]);  //日
//write_ds1302(0x8A,time[3]);  //星期
write_ds1302(0x84,time[0]);  //时
write_ds1302(0x82,time[1]);  //分
write_ds1302(0x80,time[2]);  //秒
write_ds1302(0x8e,0x80);  //写保护寄存器
}
/*****************************************************************************
函数功能:读DS1302时间子程序
入口参数:
出口参数:全局变量(second,minute,hour,week,day,month,year)
*****************************************************************************/
void read_time()
{
second=read_ds1302(0x81);  //秒寄存器
minute=read_ds1302(0x83);  //分
hour=read_ds1302(0x85);   //时
//week=read_ds1302(0x8B);   //星期
//day=read_ds1302(0x87);   //日
//month=read_ds1302(0x89);  //月
//year=read_ds1302(0x8d);   //年

}
/*****************************************************************************
函数功能:主程序
入口参数:
出口参数:
*****************************************************************************/
void main()
{
  initial_ds1302();    //初始化DS1302
while(1)
{
  
      read_time();//读取时间
   display();     //显示时间
}
}


本文摘自: 大学生电子设计联盟(http://www.nuedc.net.cn) 详细出处请参考:http://www.nuedc.net.cn/forum.ph ... id=20510&extra=
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|亿加合和智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-5-5 22:20 , Processed in 0.054643 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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