我最近在做单片机课程实习。DS1302的汇编程序。但是我自己看不出错误在哪。望你能帮助我,谢谢。

 我来答
fangyao18
2011-06-21 · TA获得超过193个赞
知道答主
回答量:647
采纳率:0%
帮助的人:0
展开全部
问题补充:程序太长 发不上来 怎么办? DS1302的确会自动加时……你应该把芯片手册找来看看就明白了
su790324
2011-06-21 · TA获得超过101个赞
知道小有建树答主
回答量:120
采纳率:66%
帮助的人:47.8万
展开全部
代码在哪呢?贴上来帮你看看呀
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友5f3670e
2011-06-22
知道答主
回答量:3
采纳率:0%
帮助的人:3.1万
展开全部
我给你一个1302+数码管显示的程序,有加按键调时,可以显示时分,月日,绝对可以用的
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit sclk=P1^0;///1302时钟引脚
sbit io=P1^1;/////1302 I/O引脚
sbit rst=P1^2;////1302复位引脚
sbit k1=P2^0;
sbit k2=P2^1;
sbit k3=P2^2;
sbit w4=P2^7;
sbit w3=P2^6;
sbit w2=P2^5;
sbit w1=P2^4;
char timetmp[7];
uint readdata[7];
uchar sec,min,hour,day,month,week,year;/////秒,分,时,日,月,周,年
uchar keynum,ss,key;////按键寄存器
uchar time[]={0x00,0x42,0x08,0x04,0x09,0x06,0x10};
uchar MAX[]={59,59,23,31,12,7,99};
uchar MINX[]={0,0,0,1,1,1,1};
uint duan[10]={0x14,0xd7,0x4c,0x45,0x87,0x25,0x24,0x57,0x04,0x05};
void delay1(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar jiance1()
{ uchar aa;
if(k1==0)
{
aa=1;
while(!k1);
}

return aa;
}
uchar jiance()
{ uchar aa;
if(k1==0)
{
aa=1;
while(!k1);
}
if(k2==0)
{
aa=2;
while(!k2);
}
if(k3==0)
{
aa=3;
while(!k3);
}
return aa;
}
void write(uchar date) //写一个字节
{
uchar i;
for(i=0;i<8;i++)
{
io=date&0x01;
sclk=1;
sclk=0;
date=date>>1;
}
}
uchar read() //读一个字节
{
uchar shuju,i;
for(i=0;i<8;i++)
{
shuju=shuju>>1;
sclk=0;
if(io)
shuju=shuju|0x80;
sclk=1;
}
return shuju;
}
void writebyte(uchar add,date) //写时间的一个单位(分/秒/时/年/月/日/周)
{
rst=0;sclk=0;rst=1;
write(0x8e);
write(0x00);
rst=0;sclk=0;rst=1;
write(add);
write(date);
rst=0;sclk=0;rst=1;
write(0x8e);
write(0x80);
rst=0;sclk=1;
}
void writetime() //初始化时间
{
uchar i,j=0x80;
for(i=0;i<7;i++)
{
writebyte(j,time[i]);
j+=2;
}
}
uchar readbyte(add) //读一个单位时间(分/秒/时/年/月/日/周)
{
uchar date;
rst=0;sclk=0;rst=1;
write(add);
date=read();
rst=0;sclk=1;
return date;
}
void readtime() //读取时间
{
uchar i,j=0x81;
for(i=0;i<7;i++)
{
readdata[i]=readbyte(j);
j+=2;
}
}
void process() //数制转换
{ uchar i;
for(i=0;i<7;i++)
{
readdata[i]=(readdata[i]>>4)*10+(readdata[i]&0x0f);
}
}
void timeout() //提取时间
{
sec=readdata[0];
min=readdata[1];
hour=readdata[2];
day=readdata[3];
month=readdata[4];
}
void display()
{
w4=1;
w1=0;
P0=duan[min%10];
delay1(7);
w1=1;
w2=0;
P0=duan[min/10];
delay1(7);
w2=1;
w3=0;
P0=duan[hour%10];
delay1(7);
w3=1;
w4=0;
P0=duan[hour/10];
delay1(7);
}
void display1()
{
w4=1;
w1=0;
P0=duan[day%10];
delay1(7);
w1=1;
w2=0;
P0=duan[day/10];
delay1(7);
w2=1;
w3=0;
P0=duan[month%10];
delay1(7);
w3=1;
w4=0;
P0=duan[month/10];
delay1(7);
}
void zj(uchar num) //增减函数
{
switch(keynum)
{
case 1:ss++;break; //如果是1,则进入下一位的调整
case 2:{ //如果是2,则当前闪烁的位加1
timetmp[num]++;
if(timetmp[num]>MAX[num]) //如何超过了闪烁位的最大值,返回最小值
timetmp[num]=MINX[num];
}break;
case 3:{ //如果是3,则当前闪烁的位减1
timetmp[num]--;
if(timetmp[num]<MINX[num]) //如何超过了闪烁位的最小值,返回最大值
timetmp[num]=MAX[num];
}break;
default:break;
}
}
void jpaction() //调时操作
{
while(ss<4)
{

while(ss==0) //调分
{
key=0;
timetmp[1]=readbyte(0x83)/16*10+readbyte(0x83)%16; //同上
P2=0XFF;
w1=0;
P0=duan[timetmp[1]%10];
delay1(5);
P2=0XFF;
w2=0;
P0=duan[timetmp[1]/10];
delay1(5);
keynum=jiance();
zj(1);
writebyte(0x82,timetmp[1]/10*16+timetmp[1]%10);
}
while(ss==1) //调时
{
key=0;
timetmp[2]=readbyte(0x85)/16*10+readbyte(0x85)%16; //从1302中取出时间
P2=0XFF;
w3=0;
P0=duan[timetmp[2]%10];
delay1(5);
P2=0XFF;
w4=0;
P0=duan[timetmp[2]/10];
delay1(5);
keynum=jiance(); //按键检测
zj(2); //对时间进行操作
writebyte(0x84,timetmp[2]/10*16+timetmp[2]%10); //把调整过的时间写到1302中
}
while(ss==2) //调日
{
key=0;
timetmp[3]=readbyte(0x87)/16*10+readbyte(0x87)%16; //从1302中取出时间
P2=0XFF;
w1=0;
P0=duan[timetmp[3]%10];
delay1(5);
P2=0XFF;
w2=0;
P0=duan[timetmp[3]/10];
delay1(5);
keynum=jiance(); //按键检测
zj(3); //对时间进行操作
writebyte(0x86,timetmp[3]/10*16+timetmp[3]%10); //把调整过的时间写到1302中
}
while(ss==3) //调月
{
key=0;
timetmp[4]=readbyte(0x89)/16*10+readbyte(0x89)%16; //从1302中取出时间
P2=0XFF;
w3=0;
P0=duan[timetmp[4]%10];
delay1(5);
P2=0XFF;
w4=0;
P0=duan[timetmp[4]/10];
delay1(5);
keynum=jiance(); //按键检测
zj(4); //对时间进行操作
writebyte(0x88,timetmp[4]/10*16+timetmp[4]%10); //把调整过的时间写到1302中
}
}
}
void main()
{
uint sb;
writetime(); //首次上电,往1302里面写时间
while(1)
{
readtime(); //从1302中读时间
process(); //把取出的时间(BCD码)转化为十进制
timeout(); //把时间从数组中提取出来
display(); //在1302上显示时间
if(k2==0)
{
while(!k2);
sb=1;
}
keynum=jiance1(); //检测按键是不是要调整时间
while(sb)////当sb为1时,显示月和日
{
display1();
if(k1==0)
{
while(!k1);
keynum=1;
sb=0;
}
if(k2==0)
{
while(!k2);
sb=0;
}
}
if(keynum==1)
{
ss=0;
jpaction(); //相应调时操作
writebyte(0x80,timetmp[0]/10*16+timetmp[0]%10); //重写秒,把秒写回到调之前的位置
ss=0;
key=0;
}
}

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式