基于STC89C51单片机的万年历制作方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于51单片机的万年历论文
学校华侨大学
学院信息科学与工程学院
班级10级集成电路设计与集成系统一、摘要
1、
2、74lLS245摘要:
74LS245是我们常用的芯片,用来驱动led 或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。
74LS245还具有双向三态功能,既可以输出,也可以输入数据。
3、四位一体共阴数码管管脚图:
二、所用到的元器件:
1、天关及其功能:
P1_0 //时钟秒或日历天调整
P1_1 //时钟分或日历月调整
P1_2; //时钟时或日历年调整
P1_3 //时间与日历间的切换
RST:复位。
三、protues仿真图:
四1、Altium designer下的原理图:
2、Altium designer下的PCB图:
五、c语言源代码:
#include
#include
#define uchar unsigned char
#define uint unsigned int
/*七段共阳管显示定义*/
uchar code dispcode[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x80}; //此表为LED 的字模, 共阳数码管0-9 ,_ 和.
/*定义并初始化变量*/
uchar seconde=0;//秒
uchar minite=0;//分
uchar hour=12; //时
uchar day=24;//日
uchar month=3;//月
uint year=2012,a=1,b=1,c=1; //年和下降沿变量
uchar mstcnt=0;//定时器计数,定时50ms,mstcnt满20,秒加1
int dateadd1=0;
sbit P1_0=P1^0; //时钟秒或日历天调整
sbit P1_1=P1^1; //时钟分或日历月调整
sbit P1_2=P1^2; //时钟时或日历年调整
sbit P1_3=P1^3; //时间与日历间的切换
/*函数声明*/
void delay(uint k ); //延时子程序
void time_pro( ); //时间处理子程序
void display( ); //时间显示调整子程序
void dateadd(int m); //日历处理子程序
void calendar( ); //日历显示调整子程序
/*延时子程序*/
void delay (uint k)
{
uchar j;
while(k--)
{
for(j=0;j<125;j++)
{;}
}
}
/*时间处理子程序*/
void time_pro(void)
{
if(seconde==60)
{
seconde=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
hour=0;
dateadd1++;
}
}
}
}
/*时间显示调整子程序*/
void display(void)
{
if(P1_3==1)
{
/*时间调整键盘扫描子程序*/
if(P1_0!=a)//秒位的调整,下降沿有效{
delay(10);
if(P1_0==0)
{
seconde++;
if(seconde==60)
{
seconde=0;
}
}a=P1_0;
}
if(P1_1!=b)//分位的调整,下降沿有效{
delay(10);
if(P1_1==0)
{
minite++;
if(minite==60)
{
minite=0;
}
}b=P1_1;
}
if(P1_2!=c)//时位的调整,下降沿有效{
delay(10);
if(P1_2==0)
{
hour++;
if(hour==24)
hour=0;
}
}c=P1_2;
}
/*时间显示子程序*/
P3=0Xfe;
P0=dispcode[hour/10];//时十位
delay(2);
P3=0Xfd;
P0=dispcode[hour%10];//时个位
delay(2);
P3=0Xfb;
P0=dispcode[10];//间隔符-
delay(2);
P3=0Xf7;
P0=dispcode[minite/10];//分十位
delay(2);
P3=0Xef;
P0=dispcode[minite%10];//分个位
delay(2);
P3=0Xdf;
P0=dispcode[10];//间隔符-
delay(2);
P3=0Xbf;
P0=dispcode[seconde/10];//秒十位delay(2);
P3=0X7f;
P0=dispcode[seconde%10];//秒个位delay(2);
}
}
/*日历处理子程序*/
void dateadd( int m) //日期加1函数{
if(m)
{
dateadd1--;
switch(month)
{
case 1: if( day==31)
{ day=1;
month++;
break;