51单片机制作电子万年历
最后利用了Proteus 8进行仿真验证。
要求设计的功能:
1)能显示年月日时分秒的数据
2)能用按键分别调整 年月日时分秒的数据
设计过程
时分秒数据的输入与输出
我选择的是六位的数码管,输入端连接P2端口,接地端连接P3端口。如图。
最右端两位为秒钟数值的呈现位,中间两位显示分钟数值,最左边则是显示小时数值。
传入数据时,先设置变量,h、m、s分别代表时、分、秒,按照24小时制进行显示数值。为了使秒钟先进行加数,加到60s时,分钟也开始进行加数。我们直接将从0到9的十个数放进data1[]的数组当中,方便直接取数。而数码管的接地处连接在P3端口的目的是,能单独控制,(例如当只想要显现P3.7对应的数码管第一位显示数值为一时,使P3=0x7f即可,即0111 1111,当电平由1变为0时,相当于接地),将对应的数值写进数组wei[]当中。
但是具体该怎么输入数据呢?
因为时分秒的最大数值均为两位,我们要将这两位数字拆开分别传入对应的引脚当中。拿小时来举例,当h=11时,数码管最左边两位应该显示”11“,h/10来取十位上的数,h%10来取个位上的数。
对应代码如下
//
uchar data1[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar wei[]={
0x7f,0xbf,0xdf,0xef,0xf7,0xfb};
uchar h=0,m=0,s=0;
void delay()//延时防抖函数
{
int i;
for(i=0;i<100;i++);
}
void display(uchar h,uchar m,uchar s)//输入时分秒数据
{
//时
P2=data1[h/10];
P3=wei[0];
delay();
P3=0xff;//能让数码管显示值时不发生闪烁,呈现一个稳定的状态
P2=data1[h%10];
P3=wei[1];
delay();
P3=0xff;
//分
P2=data1[m/10];
P3=wei[2];
delay();
P3=0xff;
P2=data1[m%10];
P3=wei[3];
delay();
P3=0xff;
//秒
P2=data1[s/10];
P3=wei[4];
delay();
P3=0xff;
P2=data1[s%10];
P3=wei[5];
delay();
P3=0xff;
}
年月日数据的输入与输出
与输入输出时分秒的理论相同,但输出端口换为另一个端口更方便,我使用的是P0端口。
代码如下。
void display2(int y,uchar mon,uchar d)//输入年月份数据
{
//年
P2=data1[y/1000];
P0=wei1[0];
delay();
P0=0xff;
P2=data1[y%1000/100];
P0=wei1[1];
delay();
P0=0xff;
P2=data1[y%1000%100/10];
P0=wei1[2];
delay();
P0=0xff;
P2=data1[y%1000%100%10];
P0=wei1[3];
delay();
P0=0xff;
//月
P2=data1[mon/10];
P0=wei1[4];
delay();
P0=0xff;
P2=data1[mon%10];
P0=wei1[5];
delay