DS1302显示85问题

解决办法在1302的读字节函数:

#include<reg52.h>
#define uchar unsigned char 
#define uint unsigned int
uchar code s8[18]={0x40,0x79,0x24,0x30,0x19,0x12,
                   0x02,0x78,0x00,0x10,0x88,0x89,
		   0xbf,0xfe,0xf7,0xc7,0xbe,0xb7};
//共阳极数码管0-9,A,H,-,-(再上一格),_,灭,,,的字段码
uchar dssjs[20]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar dssjf[20]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//存储定时时间
uchar time[2]={12,00}; //存储分,小时
uchar w6[6]={0x01,0x02,0x04,0x08,0x10,0x20};
//位选择码
uchar k;
uchar shu[6]={0x00,0x00,0x00,0x00,0x00,0x00};//储存数码管要显示的数据
/*DS1302引脚定义*/
sbit SCL = P3^0;
sbit IO = P3^1;
sbit CE = P3^2;

/*74hc595引脚定义*/
sbit ds = P1^0;
sbit rck = P1^2;
sbit sck = P1^1;

void Delay(uint n)
{
	while(n--);
}

/************************************************
*名称:DS1302_Sendchar()
*描述:向DS1302写字节
*变量:dat
************************************************/
void DS1302_Sendchar(uchar dat)
{
	uchar i;
	for(i=0;i<8;i++)
	{
		SCL = 0;
		IO = (bit)(dat & 0x01);
		dat >>= 1;
		SCL = 1;
	}
}

/************************************************
*名称:DS1302_Rendchar2()
*描述:从ds1302读取字节
*变量:dat
************************************************/
uchar DS1302_Readchar()
{
	uchar dat,i;
	for(i=0;i<8;i++)
	{
		if(IO == 1)
		{
			dat = dat|0x80;
		}
		SCL = 1;
		dat >>= 1;
		SCL = 0;
	}
	IO = 0;//将读1个字节函数最后加上I/O=0即可消除85显示
	return dat;
}

/************************************************
*名称:DS1302_WriteADD()
*描述:向1302寄存器写数据
*变量:com,dat
************************************************/
void DS1302_WriteADD(uchar com,uchar dat)
{
	CE = 0;
	SCL = 0;
	CE = 1;
	DS1302_Sendchar(com);
	DS1302_Sendchar(dat);
	SCL = 1;
	CE = 0;
}

/************************************************
*名称:DS1302_ReadADD()
*描述:从1302指定寄存器内读数据
*变量:com
************************************************/
uchar DS1302_ReadADD(uchar com)
{
	uchar dat;
	CE = 0;
	SCL = 0;
	CE = 1;
	DS1302_Sendchar(com);
	dat = DS1302_Readchar();
	SCL = 1;
	CE = 0;
	return dat;
}

/************************************************
*名称:DS1302_Init()
*描述:初始化DS1302
*变量:无
************************************************/
void DS1302_Init()
{
//	uchar flag;
//	flag = DS1302_ReadADD(0x81);
//	if(flag & 0x80)
//	{
		DS1302_WriteADD(0x8e,0x00);
		DS1302_WriteADD(0x80,((21/10)<<4|(21%10)));
		DS1302_WriteADD(0x82,((12/10)<<4|(12%10)));
		DS1302_WriteADD(0x84,((13/10)<<4|(13%10)));
		DS1302_WriteADD(0x86,((14/10)<<4|(14%10)));
		DS1302_WriteADD(0x88,((1/10)<<4|(1%10)));
		DS1302_WriteADD(0x8c,((1/10)<<4|(1%10)));              
		DS1302_WriteADD(0x8e,0x80);
//	}
}

/************************************************
*名称:set595()
*描述:595向数码管发送数据
*变量:dat
************************************************/
void set595(uchar dat)
{
	uchar i;
	rck=0;
	for(i=0;i<8;i++)
	{
		if(dat & 0x80)
		{
			ds=1;
		}
		else
		{
			ds=0;
		}
		sck=1;
		dat<<=1;
		sck = 0;
	}
	rck = 1;
}


/************************************************
*名称:main()
*描述:主函数
************************************************/
void main()
{
	uchar ReadValue;   //储存从1302读取的数据
	DS1302_Init();     //将1302初始化
	TMOD=0x01;
	TH0=64536/256;
	TL0=64536%256;
	ET0=1;
    TR0 = 1;
    EA=1;
	while(1)
	{
	 ReadValue = DS1302_ReadADD(0x81);  //从分寄存器读
     time[0]=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
     ReadValue = DS1302_ReadADD(0x85);  //从时寄存器读
     time[1]=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化

	  
	 shu[0]=s8[15];shu[1]=s8[15];shu[2]=s8[(time[1]/10)];
	 shu[3]=s8[(time[1]%10)];shu[4]=s8[(time[0]/10)];shu[5]=s8[(time[0]%10)];
	 }
}
void timer0() interrupt 1//刷新数码管显示    
{
	TH0=64536/256;
	TL0=64536%256;
	set595(0xff);
	set595(0x00);
	set595(shu[k]);
	set595(w6[k]);
	k++;
	if(k==6) k=0;
}



评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值