LED电子钟设计.docx

上传人:b****5 文档编号:4841275 上传时间:2022-12-10 格式:DOCX 页数:20 大小:99.39KB
下载 相关 举报
LED电子钟设计.docx_第1页
第1页 / 共20页
LED电子钟设计.docx_第2页
第2页 / 共20页
LED电子钟设计.docx_第3页
第3页 / 共20页
LED电子钟设计.docx_第4页
第4页 / 共20页
LED电子钟设计.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

LED电子钟设计.docx

《LED电子钟设计.docx》由会员分享,可在线阅读,更多相关《LED电子钟设计.docx(20页珍藏版)》请在冰豆网上搜索。

LED电子钟设计.docx

LED电子钟设计

 

单片机原理及应用

课程设计

 

课题名称:

LED电子钟设计

专业:

班级:

学号:

姓名:

指导教师:

 

年月日

 

1.摘要

2.设计要求及设计思想

2.1.功能需求

2.2.设计功能

2.3.设计思想

3.硬件设计及描述

3.1.系统总体线路图

3.2.各部分硬件描述

3.2.1.AT89C51芯片

3.2.2.2×5矩阵键盘

3.2.3.共阳极七段数码管

4.软件设计流程及描述

4.1.程序流程图

4.2函数模版及功能

5.功能实现及截图

6.源程序

7.实验总结

 

1.摘要

单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。

而51单片机是各单片机中最为典型和最有代表性的一种

  近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。

在实时检测和自动控制的单片机系统中,它往往作为一个核心部件在使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。

通过单片机课程设计,我们可以更全面的了解单片机,把书本和实际联系起来,进一步掌握单片机结构和工作原理,通过实际程序设计与调试,逐步掌握模块化程序设计方法和调试技术。

在这一过程中,为我们今后的学习打下一定的基础。

 

2.设计要求

2.1.功能需求

用AT89S51单片机及接口电路设计一个时钟。

基本功能:

用6个LED数码管分别显示小时、分钟和秒钟。

时间初值设置由0~9十个数字键以及四个功能键完成。

四个功能键分别是复位(清零)键、小时、分钟和秒钟。

时间基准由单片机内的定时器实现。

2.2.设计功能

1.键盘按键设置初始时间

2.三个功能键控制秒,分,小时的显示及调整

3.一个功能键控制时间开始

2.3.设计思想

1.首先设计一个2×5矩阵键盘由0~9构成,由P1端构造。

2.在P3端设计4个功能键

3.P1和P2端连接七段共阳数码管。

 

3.硬件设计及描述

3.1.系统总体线路图

3.2.各部分硬件描述

3.2.1.AT89C51芯片

在这个系统中,AT89C51作为主芯片,其P3^0,P3^1,P3^2,P3^3口分别控制四个独立按键,分别实现对电子时钟的功能控制、对各个位进行相应的增加和减小,共阳七段数码管通过P0口控制其相应显示的值,P2口控制8个数码管显示,P1口连接矩阵键盘。

3.2.2.2×5矩阵键盘.

行列式键盘用I/O口线组成行列结构,按键设置在交叉点上,在按键数目较多时运用这种连接方式,可节省I/O口连线。

行列式键盘的标识最常用的两种方法:

行扫描法和线反转法。

3.2.3.七段共阳数码管

共阳七段数码管通过80C51的P0口控制其相应显示的值,P2口控制那个数码管显示。

用除10取余和取整分别给时-分-秒赋值。

显示字符

0

1

2

3

4

5

6

7

8

共阳数码管

C0H

F9H

A4H

B0H

99H

92H

82H

F8H

80H

显示字符

9

A

B

C

D

E

F

P

-

共阳数码管

90H

88H

83H

C6H

A1H

86H

8EH

8CH

BFH

 

4.软件设计流程及描述

4.1.程序流程图

4.2.函数模版及功能

(1)voiddelay(unsignedint);延时程序

voiddelay(unsignedintz)

{unsignedintx;

for(x=z;x>0;x--);

}

(2)ucharscan();行列扫描确定按键位置;

ucharscan()

{uchara,b,c,i;

P1=0xe0;

a=P1;

delay(5);

P1=0x1f;

b=P1;

c=a+b;

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

if(c==keytable[i])returni;

return10;

}

(3)voiddisplay();时钟计数,每历时一秒,时间跳变加一秒;

voiddisplay()

{if(num==20)

{num=0;

sec++;

if(sec==60)

{sec=0;

min++;

if(min==60)

{min=0;

hour++;

if(hour==24)

{hour=0;

min=0;

sec=0;

}

}

}

}

secge=sec%10;

secshi=sec/10;

minge=min%10;

minshi=min/10;

hourge=hour%10;

hourshi=hour/10;

P2=0x01;

P0=table[secge];

delay(5);

P2=0x02;

P0=table[secshi];

delay(5);

P2=0x04;

P0=0xbf;

delay(5);

P2=0x08;

P0=table[minge];

delay(5);

P2=0x10;

P0=table[minshi];

delay(5);

P2=0x20;

P0=0xbf;

delay(5);

P2=0x40;

P0=table[hourge];

delay(5);

P2=0x80;

P0=table[hourshi];

delay(5);

}

(4)voidkeyscan();对运行中的时钟进行时间调整;

voidkeyscan()

{if(ksec==0)

{delay(10);

if(ksec==0)

{sec++;

if(sec>=60)

sec=0;

}

while(ksec==0)

display();

}

if(kmin==0)

{delay(10);

if(kmin==0)

{min++;

if(min>=60)

min=0;

}

while(kmin==0)

display();

}

if(khour==0)

{delay(10);

if(khour==0)

{hour++;

if(hour>=24)

hour=0;

}

while(khour==0)

display();

}

}

(5)main();主函数,写入三功能,初始、设定时间、计时;

main()

{

P0=0xbf;

while

(1)

{

while(ksec==0)

{

scan();

p=scan();

j++;

while(j==1){scan();p=scan();while(p==10){scan();p=scan();}P2=0x02;P0=table[p];secshi=p;j++;}

scan();p=scan();

while(p!

=10){scan();p=scan();}

while(j==2){scan();p=scan();while(p==10){scan();p=scan();}P2=0X01;P0=table[p];secge=p;j=0;}

ksec;

}

while(kmin==0)

{

scan();

p=scan();

j++;

while(j==1){scan();p=scan();while(p==10){scan();p=scan();}P2=0x10;P0=table[p];minshi=p;j++;}

scan();p=scan();

while(p!

=10){scan();p=scan();}

while(j==2){scan();p=scan();while(p==10){scan();p=scan();}P2=0X08;P0=table[p];minge=p;j=0;}

kmin;

}

while(khour==0)

{

scan();

p=scan();

j++;

while(j==1){scan();p=scan();while(p==10){scan();p=scan();}P2=0x80;P0=table[p];hourshi=p;j++;}

scan();p=scan();

while(p!

=10){scan();p=scan();}

while(j==2){scan();p=scan();while(p==10){scan();p=scan();}P2=0X40;P0=table[p];hourge=p;j=0;}

khour;

}

if(kzero==0)

{break;

}

}

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;ET0=1;TR0=1;

sec=10*secshi+secge;min=10*minshi+minge;hour=10*hourshi+hourge;

while

(1)

{display();

keyscan();

}

}

 

5.功能实现及截图

初始状态,等待按键

 

小时十位设置(24小时制)

 

小时个位设置

分与秒的设置于小时的设置同理;

时间设置为:

23:

21:

56

时间初始值设定

运行一会后时间显示

功能键小时加一

分钟和秒钟的功能键加一同理;

 

6.源程序

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitksec=P3^0;

sbitkmin=P3^1;

sbitkhour=P3^2;

sbitkzero=P3^3;

unsignedcharsecshi=0,secge=0,minshi=0,minge=0,hourshi=0,hourge=0;

unsignedintnum=0,sec=0,min=0,hour=0;j=0;p=0;

unsignedcharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};

unsignedcodekeytable[]={0xde,0xdd,0xdb,0xd7,0xcf,0xbe,0xbd,0xbb,0xb7,0xaf};

voiddelay(unsignedint);

voiddisplay();

voidkeyscan();

voidkeyscan();

ucharscan();

voiddelay(unsignedintz)

{unsignedintx;

for(x=z;x>0;x--);

}

voidkeyscan()

{if(ksec==0)

{delay(10);

if(ksec==0)

{sec++;

if(sec>=60)

sec=0;

}

while(ksec==0)

display();

}

if(kmin==0)

{delay(10);

if(kmin==0)

{min++;

if(min>=60)

min=0;

}

while(kmin==0)

display();

}

if(khour==0)

{delay(10);

if(khour==0)

{hour++;

if(hour>=24)

hour=0;

}

while(khour==0)

display();

}

}

ucharscan()

{uchara,b,c,i;

P1=0xe0;

a=P1;

delay(5);

P1=0x1f;

b=P1;

c=a+b;

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

if(c==keytable[i])returni;

return10;

}

voidtime0()interrupt1

{num++;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

}

voiddisplay()

{

if(num==20)

{num=0;

sec++;

if(sec==60)

{sec=0;

min++;

if(min==60)

{min=0;

hour++;

if(hour==24)

{hour=0;

min=0;

sec=0;

}

}

}

}

secge=sec%10;

secshi=sec/10;

minge=min%10;

minshi=min/10;

hourge=hour%10;

hourshi=hour/10;

P2=0x01;

P0=table[secge];

delay(5);

P2=0x02;

P0=table[secshi];

delay(5);

P2=0x04;

P0=0xbf;

delay(5);

P2=0x08;

P0=table[minge];

delay(5);

P2=0x10;

P0=table[minshi];

delay(5);

P2=0x20;

P0=0xbf;

delay(5);

P2=0x40;

P0=table[hourge];

delay(5);

P2=0x80;

P0=table[hourshi];

delay(5);

}

main()

{P0=0xbf;

while

(1)

{

while(ksec==0)

{scan();

p=scan();

j++;//p=scan();while(p==10){scan();p=scan();}等待键按下(也想了一段时间)

while(j==1){scan();p=scan();while(p==10){scan();p=scan();}P2=0x02;P0=table[p];secshi=p;j++;}

scan();p=scan();//等待键抬起(此处我想了很一段时间才发现必须加上的,否则程序运行部下去)

while(p!

=10){scan();p=scan();}

while(j==2){scan();p=scan();while(p==10){scan();p=scan();}P2=0X01;P0=table[p];secge=p;j=0;}

ksec;

}

while(kmin==0)

{scan();

p=scan();

j++;

while(j==1){scan();p=scan();while(p==10){scan();p=scan();}P2=0x10;P0=table[p];minshi=p;j++;}

scan();p=scan();

while(p!

=10){scan();p=scan();}

while(j==2){scan();p=scan();while(p==10){scan();p=scan();}P2=0X08;P0=table[p];minge=p;j=0;}

kmin;

}

while(khour==0)

{scan();

p=scan();

j++;

while(j==1){scan();p=scan();while(p==10){scan();p=scan();}P2=0x80;P0=table[p];hourshi=p;j++;}

scan();p=scan();

while(p!

=10){scan();p=scan();}

while(j==2){scan();p=scan();while(p==10){scan();p=scan();}P2=0X40;P0=table[p];hourge=p;j=0;}

khour;

}

if(kzero==0)

{break;

}

}

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;ET0=1;TR0=1;

sec=10*secshi+secge;min=10*minshi+minge;hour=10*hourshi+hourge;

while

(1)

{display();

keyscan();

}

}

 

7.实验总结

通过这次时钟的设计,让我对简单应用程序的编程有了深刻的了解和学习,对AT89S51单片机的学习更深刻、更有效,对其结构及其各个接口进行了再一次的学习和认知,尤其是串行口的利用,更是在本次实验中获得了提高。

以前的书本学习一直都是在纸上谈兵,通过这次自己做时钟,我对单片机才有了真正意义上的认识,对它能够更好的进行编程。

说到编程,这次的实验对我的编程能力有了很大的提高。

当然,我也遇到了很多困难,比如2×5矩阵键盘的设计,代码表设计出现问题。

比如,初始时间的设置,通过键盘控制显示,键盘按键与时间的显示不对应,有时按了键却没有显示等问题。

通过查询资料,以及旧知识的重新认知与巩固,终于实现了各项功能。

对于这些电路还是应该投入到实际操作中,去发现,去尝试,这样才能得到更多的知识与更好的经历。

在这次设计过程中,体现出自己进行单片机设计调试的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。

通过对程序的不断完善,硬件的不断改变,从而不断提高自己对程序的理解能力,编程的能力,并且不断的提高了自己对单片机的了解,对单片机的应用等。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1