万年历实训报告

  • 格式:doc
  • 大小:156.50 KB
  • 文档页数:5

下载文档原格式

  / 5
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、任务目的

通过万年历的设计与制作,进一步熟悉单片机内部定时器、I/O口、中断、提高实践能力

二、设计要求

用单片机设计一个功能实用,使用简便万年历,具体要求:根据提供的单片机键盘接口模块电路,加上必要的外部电路,设计出万年历的硬件电路,编写软件,用Proteus进行仿真实验,然后进行实物的软硬件调试,并撰写符合要求的实训报告。

三、系统硬件电路设计

可分为最小系统、键盘电路、显示部分等几个单元电路,要求画出各部分电路图,写出工作原理。

这是仿真总图

1、最小系统:最小系统包括时钟电路和复位电路。

时钟信号的产生:在MCS-51系列单片机内部有一个高增益反相放大器,其输入端引脚为XTAL1,其输出端引脚为XTAL2。只在XTAL1和 XTAL2之间跨接晶振和微调电容,就可以构成一个稳定的自激振荡器。

复位电路,可分为上店复位电路和按键复位电路,在电子琴设计中采用的是按键复位电路。该电路用RESET键实现复位,此时电源经两个电阻分压,在RST 端产生一个复位高电平

2、按键电路:因为显示数码有限,所以就用P2_7口来判断,即当P2_7=0时显示时分秒;

P2_7=1显示年月日。而三个按钮分别是年月日或时分秒对应的加法按钮。

端,而P1口是段码输入端,来进行动态扫描。

四、软件设计

#include

unsigned int hour=0, min=0,sec=0,c=0,r=20, y=3,n=2012;

unsigned char led[]={0x11,0xd7,0x32,0x92,0xd4,0x98,0x18,0xd3,0x10,0x90}; void delay(unsigned int x)

{

unsigned int j;

while(x--)

for(j=0;j<125;j++);

}

void main()

{

TMOD = 0x01;

TH0 = (65536-50000)/256;

TL0 = (65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

while(1)

{ unsigned int q=0;

for(q=0;q<50;q++)

{ if (P2_7==0)

{

P0=0XFE;P1=led[sec%10];delay(1);

P0=0XFd;P1=led[sec/10];delay(1);

P0=0XFb;P1=led[min%10];delay(1);

P0=0Xf7;P1=led[min/10];delay(1);

P0=0Xef;P1=led[hour%10];delay(1);

P0=0Xdf;P1=led[hour/10];delay(1);

}

else

{

P0=0XFE;P1=led[r%10];delay(1);

P0=0XFd;P1=led[r/10];delay(1);

P0=0XFb;P1=led[y%10];delay(1);

P0=0Xf7;P1=led[y/10];delay(1);

P0=0Xef;P1=led[n%10];delay(2);

P0=0Xdf;P1=led[n%100/10];delay(2);

P0=0xbf;P1=led[n%1000/100];delay(2);

P0=0x7f;P1=led[n/1000];delay(2);

}

}

if(P2_0==0){delay(1);if(P2_0==0);if(sec==60){min++;}else sec++;}

if(P2_1==0){delay(1);if(P2_1==0);if(min==60){hour++;}else min++;} if(P2_2==0){delay(1);if(P2_2==0);if(hour==24){r++;}else hour++;}

if(P2_0==0){delay(1);if(P2_0==0);

if(y==1||y==3||y==5||y==7||y==8|y==10||y==12){if(r==31){r=1;y++;}

else r++;}

if(y==2){if(((n%400==0||n%4==0&&n%100!=0))&&r>=29){r=1;y++;}else if(((n%400==1||n%4==1&&n%100!=1))&&r>=28){r=1;y++;}else r++;}

if(y==4||y==6||y==9||y==11){if(r==30){r=1;y++;}else r++;}}

if(P2_1==0){delay(1);if(P2_1==0);if(y==12){n++;y=1}else(y++);}

if(P2_2==0){delay(1);if(P2_2==0);n++;}

}

}

void T0_1() interrupt 1

{ TH0 = (65536-50000)/256;

TL0 = (65536-50000)%256;

c++;

if(c==20) { c =0; sec++;}

if(sec==60){sec = 0; min++; }

if(min==60) { min=0; hour++; }

if(hour==24){hour=0;r++;}

if(y==1||y==3||y==5||y==7||y==8|y==10||y==12)

{if(r==31){r=1;y++;} else r++;}

if(y==2){if(((n%400==0||n%4==0&&n%100!=0))&&r>=29){r=1;}

else if(((n%400==1||n%4==1&&n%100!=1))&&r>=28){r=1;y++;}else r++;}

if(y==4||y==6||y==9||y==11){if(r==30){r=1;y++;}else r++;}

if(y==12){n++;y=1}else y++;}

五、系统调试

该万年历要实现以下功能:

1、实现正常走时;

2、能够校准时间和日期;

3、能够自动区分平润年和大小月;

在仿真过程中出现的最典型的问题是按下加法按钮要么出现闪烁或抖动,要么就加法跳动数次,经分析与试验得知这是由于延时时间使用不当,于是我们在循环扫描的前面加一个FOR语句循环50次后再扫描是否有键被按下

六、心得体会

通过此次万年历的设计与制作,获得了丰富的理论知识,极大地提高了实践能力。不但发挥了团队精神,分工合作,更充分发挥了人的主观能动性。从接到任务开始到较好地完成了作品,我们学到的很多,成长了很多。刚开始,对于任务和要求都不很清晰,思路断断续续的。但最终静下来冷静思考和组员进行讨论,思路也就理顺了反而觉得得心应手了。我知道了凡事要一颗平常的心,不要老想着走捷径,一步一个脚印。