可以帮忙看下这个单片机程序哪里出错了么?DS1302的! 10

由于是初学者!找了好久都找不到错误!在单片机上时钟和秒钟都能正常显示而且能动,唯独分钟出先乱码而且动不了!请大家帮忙看以下!代码如下:#include<reg52.h>#... 由于是初学者!找了好久都找不到错误!
在单片机上时钟和秒钟都能正常显示而且能动,唯独分钟出先乱码而且动不了!请大家帮忙看以下!
代码如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#include<intrins.h>
unsigned char table[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char number[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
uchar time_data[]={10,6,4,17,11,45,31};
uchar write_add[]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
uchar read_add[]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
uchar disp[8]={0};
void write_ds1302_byte(uchar dat);
void write_ds1302(uchar add,uchar dat);
uchar read_ds1302(uchar add);
void set_rtc();
void read_rtc();
void time_pros();
void display();
void delay();
void init();
sbit sck=P1^7;
sbit io=P2^3;
sbit rst=P1^3;
void delay(uchar a)
{
uint i,j;
for(i=0;i<a;i++)
for(j=0;j<1;j++);
}
void init()
{
P2=0x80;
P0=0xff;
delay(5);
P2=0x1f;
}
void write_ds1302_byte(uchar dat) //参数
{
uchar i;
for(i=0;i<8;i++)
{
sck=0;
io=dat&0x01;
dat=dat>>1;
_nop_();
sck=1;
}
}
void write_ds1302(uchar add,uchar dat) //参数,数据
{
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
_nop_();
write_ds1302_byte(add);
write_ds1302_byte(dat);
_nop_();
rst=0;
_nop_();
io=1;
sck=1;
}
uchar read_ds1302(uchar add) //单字节的读
{
uchar i,value;
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
_nop_();
write_ds1302_byte(add);
for(i=0;i<8;i++)
{
value=value>>1;
sck=0;
if(io)
{
value=value|0x80;
}
sck=1;
}
rst=0;
_nop_();
sck=0;
_nop_();
sck=1;
io=1;
return value;
}
void set_rtc() //设置时钟
{
uchar i,j;
for(i=0;i<7;i++)
{
j=time_data[i]/10; //十位
time_data[i]=time_data[i]%10; //个位 //BCD码
time_data[i]=time_data[i]+j*16;
}
write_ds1302(0x8e,0x00); //去除写保护
for(i=0;i<7;i++)
{
write_ds1302(write_add[i],time_data[i]);
}
write_ds1302(0x8e,0x80);
}
void read_rtc() //读时间
{
uchar i;
for(i=0;i<7;i++)
{
time_data[i]=read_ds1302(read_add[i]);
_nop_();
}
}
void time_pros()
{
disp[0]=time_data[6]%16;
disp[1]=time_data[6]/16;
disp[2]=10;
disp[3]=time_data[5]%16;
disp[4]=time_data[5]/16;
disp[5]=10;
disp[6]=time_data[4]%16;
disp[7]=time_data[4]/16;

}
void display()
{
uchar i;
for(i=0;i<8;i++)
{

P2=0Xe0;
P0=number[disp[i]];
P2=0xc0;
P0=table[i];
delay(60);
init();
}
}
void main()
{

P2=0xa0;
P0=0x00;
set_rtc();
while(1)
{
read_rtc();
time_pros();
display();
}
}
程序格式本来在电脑上打是很好的,不知道为什么复制过来就成这样了,请大家细心看一下,谢谢!
展开
 我来答
做而论道
高能答主

2015-11-29 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.1亿
展开全部
时钟和秒钟都能正常显示而且能动,唯独分钟出先乱码而且动不了!

--检查一下电路。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式