从DS1302中读出的数据用7段数码管显示程序如何编写

2025-04-14 10:02:56
推荐回答(1个)
回答1:

楼上,人家是ds1302的,呵呵,

给你个参考:

#includesbitclock_clk=P2^7;

sbitclock_dat=P2^6;

sbitclock_rst=P2^5;sbitwei1=P2^0;

sbitwei2=P2^1;

sbitwei3=P2^2;

sbitwei4=P2^3;

sbitwei5=P2^4;

sbitwei6=P3^3;sbita0=ACC^0;//为了编程方便定义的位变量

sbita1=ACC^1;

sbita2=ACC^2;

sbita3=ACC^3;

sbita4=ACC^4;

sbita5=ACC^5;

sbita6=ACC^6;

sbita7=ACC^7;unsignedcharTab_Num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9数字voiddelay(intnum)//延时函数

{

while(num--);

}

voidclock_write(unsignedchardd)//写入一个字节,DS1302时序

{

ACC=dd;

clock_clk=0;clock_dat=a0;clock_clk=1;

clock_clk=0;clock_dat=a1;clock_clk=1;

clock_clk=0;clock_dat=a2;clock_clk=1;

clock_clk=0;clock_dat=a3;clock_clk=1;

clock_clk=0;clock_dat=a4;clock_clk=1;

clock_clk=0;clock_dat=a5;clock_clk=1;

clock_clk=0;clock_dat=a6;clock_clk=1;

clock_clk=0;clock_dat=a7;clock_clk=1;

}unsignedcharclock_read(void)//读出一个字节,时序

{clock_clk=1;clock_clk=0;a0=clock_dat;

clock_clk=1;clock_clk=0;a1=clock_dat;

clock_clk=1;clock_clk=0;a2=clock_dat;

clock_clk=1;clock_clk=0;a3=clock_dat;

clock_clk=1;clock_clk=0;a4=clock_dat;

clock_clk=1;clock_clk=0;a5=clock_dat;

clock_clk=1;clock_clk=0;a6=clock_dat;

clock_clk=1;clock_clk=0;a7=clock_dat;

return(ACC);

}unsignedcharread_clock(unsignedcharreg1)//从reg1寄存器读数据

{

unsignedchardd=0;

clock_clk=0;

clock_rst=0;

clock_rst=1;

clock_write(reg1);

dd=clock_read();

clock_rst=0;

return(dd);

}voidwrite_clock(unsignedcharreg2,unsignedchardate)//向reg2写入date数据

{

clock_clk=0;

clock_rst=0;

clock_rst=1;

clock_write(reg2);

clock_write(date);

clock_rst=0;

}voidshow(void)//显示和闪烁函数

{

unsignedchard,e;

unsignedinti;

for(i=0;i<1000;i++)

{

d=read_clock(0x81);//读秒

e=d;

d=d>>4;

e=e&0x0f;P0=Tab_Num[d];//秒十位

wei2=1;

delay(250);

wei2=0;

P0=Tab_Num[e];//秒各位

wei1=1;

delay(250);

wei1=0;d=read_clock(0x83);//读分钟

e=d;

d=d>>4;

e=e&0x0f;P0=Tab_Num[d];//分十位

wei4=1;

delay(250);

wei4=0;

P0=Tab_Num[e];//分各位

wei3=1;

delay(250);

wei3=0;d=read_clock(0x85);//读小时

e=d;

d=d>>4;

e=e&0x0f;P0=Tab_Num[d];//小时十位

wei6=1;

delay(250);

wei6=0;

P0=Tab_Num[e];//小时各位

wei5=1;

delay(250);

wei5=0;

}for(i=0;i<400;i++)//间隔显示

{

d=read_clock(0x87);//读日

e=d;

d=d>>4;

e=e&0x0f;

P0=Tab_Num[d];//日十位

wei2=1;

delay(250);

wei2=0;

P0=Tab_Num[e];//日各位

wei1=1;

delay(250);

wei1=0;d=read_clock(0x89);//读月

e=d;

d=d>>4;

e=e&0x0f;

P0=Tab_Num[d];//月十位

wei4=1;

delay(250);

wei4=0;

P0=Tab_Num[e];//月各位

wei3=1;

delay(250);

wei3=0;d=read_clock(0x8d);//读年

e=d;

d=d>>4;

e=e&0xf;

P0=Tab_Num[d];//年十位

wei6=1;

delay(250);

wei6=0;

P0=Tab_Num[e];//年各位

wei5=1;

delay(250);

wei5=0;

}

for(i=0;i<200;i++)//间隔显示

{

d=read_clock(0x8b);//读年

e=d;

d=d>>4;

e=e&0xf;

P0=Tab_Num[d];//年十位

wei2=1;

delay(250);

wei2=0;

P0=Tab_Num[e];//年各位

wei1=1;

delay(250);

wei1=0;

}

}/*--------------------时钟的初始化---------------------------*/

voidInit_1302(void)//如果不满意现在的表,可以初始化调整,写入程序之后,再把初始化屏蔽掉

{

write_clock(0x8e,0x00);//close_protect

delay(250);

write_clock(0x8c,0x08);//year08年

delay(250);

write_clock(0x88,0x6);//month06

delay(250);

write_clock(0x86,0x25);//date25

delay(250);

write_clock(0x84,0x8);//hour8

delay(250);

write_clock(0x82,0x28);//minute28

delay(250);

write_clock(0x80,0x29);//second40

delay(250);

write_clock(0x8a,0x03);//week_day3

delay(250);

write_clock(0x90,0xa0);//supply_power

delay(250);write_clock(0x8e,0x80);//protect

delay(250);

}

voidmain(void)

{

inti;

for(i=0;i<2;i++)

delay(2000);

Init_1302();//DS1302寄存器初始化P2=0x00;while(1)

{

show();

}

}