LED电子钟设计.docx
《LED电子钟设计.docx》由会员分享,可在线阅读,更多相关《LED电子钟设计.docx(20页珍藏版)》请在冰豆网上搜索。
![LED电子钟设计.docx](https://file1.bdocx.com/fileroot1/2022-12/10/7e6edb07-ef51-490a-a7eb-acf4c4aecb0a/7e6edb07-ef51-490a-a7eb-acf4c4aecb0a1.gif)
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矩阵键盘的设计,代码表设计出现问题。
比如,初始时间的设置,通过键盘控制显示,键盘按键与时间的显示不对应,有时按了键却没有显示等问题。
通过查询资料,以及旧知识的重新认知与巩固,终于实现了各项功能。
对于这些电路还是应该投入到实际操作中,去发现,去尝试,这样才能得到更多的知识与更好的经历。
在这次设计过程中,体现出自己进行单片机设计调试的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。
通过对程序的不断完善,硬件的不断改变,从而不断提高自己对程序的理解能力,编程的能力,并且不断的提高了自己对单片机的了解,对单片机的应用等。