基于C语言的Led 数码管显示数字钟.docx

上传人:b****5 文档编号:28511636 上传时间:2023-07-18 格式:DOCX 页数:34 大小:769.78KB
下载 相关 举报
基于C语言的Led 数码管显示数字钟.docx_第1页
第1页 / 共34页
基于C语言的Led 数码管显示数字钟.docx_第2页
第2页 / 共34页
基于C语言的Led 数码管显示数字钟.docx_第3页
第3页 / 共34页
基于C语言的Led 数码管显示数字钟.docx_第4页
第4页 / 共34页
基于C语言的Led 数码管显示数字钟.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

基于C语言的Led 数码管显示数字钟.docx

《基于C语言的Led 数码管显示数字钟.docx》由会员分享,可在线阅读,更多相关《基于C语言的Led 数码管显示数字钟.docx(34页珍藏版)》请在冰豆网上搜索。

基于C语言的Led 数码管显示数字钟.docx

基于C语言的Led数码管显示数字钟

1.引言

1.1编写目的

(1)巩固和提高学过的基础理论和专业知识;

(2)提高运用所学专业知识进行独立思考和综合分析、解决实际问题的能力;

(3)培养掌握正确的思维方法和利用软件和硬件解决实际问题的基本技能;

(4)增强对实际电路的认识,掌握分析处理方法,进行调试、设计等基本技能的训练,使之具有一定程度的实际工作能力。

(5)通过设计数字电子钟,了解电子钟的工作原理和内部构造。

(6)学会系统(模块)的测试方法,并根据完整的测试数据对系统(模块)的性能指标做出分析和评价;

1.2背景

20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高。

目前,单片机正朝着高性能和多品种方向发展,发展趋势将进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。

单片机应用的重要意义在于,它从根本上改变了传统的控制系统设计思想和设计方法。

从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。

单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。

因此,本设计报告在Keilvision2环境下调试与编写程序,在利用proteus软件进行仿真,最终设计出PCB,制作出led数码管显示的数字钟。

产品名称:

led数码管显示数字钟

任务提出者:

王全洲

设计者:

王海燕

产品运行环境:

KeiluVision2、proteus、实物

1.3定义

(1)单片机:

单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。

通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:

中央处理器、存储器和I/O接口电路等。

因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。

(2)STC89C52单片机:

本设计中采用型号为STC89C52的单片机,STC89C52是一个低功耗高性能单片机,40个引脚,32个外部双向输入/输出(I/O)端口,同时内含6个中断源,3个16位可编程定时计数器,2个全双工串行通信口,片内含8KB的可反复擦写的Flash只读程序存储器(ROM)和256B的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-52指令系统,片内置通用8位中央处理器和Flash存储单元。

(3)中断:

就是当CPU正在执行程序A时,发生了另一个急需处理的事件B,这时CPU暂停当前执行的程序A,立即转去执行处理事件B的程序,处理完事件B后,再返回到程序A继续执行,这个过程被叫做中断。

(4)数码管:

分段式显示器(LED数码管)由7条线段围成8字型,每一段包含一个发光二极管。

外加正向电压时二极管导通,发出清晰的光。

只要按规律控制各发光段亮、灭,就可以显示各种字形或符号。

LED数码管有共阳、共阴之分。

(5)KEILuVISION2:

是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和C语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。

(6)Proteus:

Proteus软件是LabcenterElectronics公司的一款电路设计与仿真软件,它包括ISIS、ARES等软件模块,ARES模块主要用来完成PCB的设计,而ISIS模块用来完成电路原理图的布图与仿真。

Proteus的软件仿真基于VSM技术,它与其他软件最大的不同也是最大的优势就在于它能仿真大量的单片机芯片,比如MCS-51系列、PIC系列等等,以及单片机外围电路,比如键盘、LED、LCD等等。

通过Proteus软件的使用我们能够轻易地获得一个功能齐全、实用方便的单片机实验室。

1.3参考资料

(1)《51单片机c语言教程》郭天祥编著电子工业出版社出版

(2)《单片机原理与应用及c51程序设计》谢维成、杨加国编著清华大学出版社出版

(3)《单片机原理及技术接口技术》北京航空航天大学出版社北京航空航天大学出版社出版

(4)网络资料

 

2.总体设计

2.1开发与运行环境

本设计以C语言为开发语言,在KEILuVISION2软件平台上进行C程序的编辑,连接和调试,最终与proteus仿真软件相结合,进行相关的电路仿真及修改,最后利用proteldxp软件进行产品的PCB绘制和设计,最终完成电路的焊接和调试,制作出成品。

2.2硬件功能描述

此数字钟可实现基本的走时和显示时间时、分、秒;时间的调整;闹钟的设定和调整;闹钟的开启和关闭功能,具体如下:

(1)实现基本的走时和显示时间的时、分、秒,上电自动显示初始时间12-00-00,且控制闹钟状态的的蓝色led灯为亮的状态。

(2)当第一次按下第一个弹性按键时进入时间的调节状态,此时实现对显示时间的小时调节,按下第二个按键时实现小时的加一调节,按下第三个按键时实现小时的减一调节。

(3)当第二次按下第一个弹性按键时进入显示时间的分钟调节状态,按下第二个按键时实现分钟的加一调节,按下第三个按键时实现分钟的减一调节。

(4)当第三次按下第一个弹性按键时进入闹钟的小时调节状态,按下第二个按键时实现闹钟小时的加一调节,按下第三个按键时实现闹钟小时的减一调节。

(5)当第四次按下第一个弹性按键时进入闹钟的分钟调节状态,按下第二个按键时实现闹钟分钟的加一调节,按下第三个按键时实现闹钟分钟的减一调节。

(6)当第五次按下第一个弹性按键时返回正常的显示时间走时状态。

(7)当同时按下第二和第三个弹性按键时,关闭闹钟,且此时蓝色led灯为灭,及定时时间到蜂鸣器并不响,若再次同时按下第二和第三个弹性按键,则开启闹钟,且此时蓝色led灯为亮,定时时间到蜂鸣器发出滴滴的闹铃声,同时按下第二和第三个弹性按键即可关闭闹铃。

闹铃状态默认为开启。

2.3硬件结构

本数字钟显示时间需8位,格式为12-00–00,因此需采用8个数码管,若采用单独数码管连线时比较麻烦,而市场上无8位一体的数码管,故本数字钟采用4位一体的共阴极数码管,其引脚图如下:

若使8个数码管正常显示时间,必须采用数码管的动态扫描方式,即每一时刻只有一个数码管点亮,采用软件延时和人眼的视觉停留效果,使人眼看到的数码管是同时点亮的。

因此需要用8个端口控制数码管的段选,即决定数码管显示什么字符,8个端口控制数码管的位选,即决定该时刻让哪个数码管点亮。

考虑到数码管采用动态扫描方式,即循环扫描数码管的8位,并将显示字符送入段选段,为了节省单片机的输入/输出端口和易于程序的编写,采取直接用P0口控制数码管的8个段选位,其中数码管的小数点控制位DP不用可直接悬空,为了增加其驱动能力使数码管显示更亮,在此加入74ls573,有锁存数据和增加驱动的作用。

利用P2.0~P2.2口接一个74ls138的3–8译码器控制数码管的位选端。

74LS138为3线-8线译码器,共有54/74S138和54/74LS138两种线路结构型式,其工作原理如下:

  当一个选通端(E1)为高电平,另两个选通端(E2)和/(E3))为低电平时,可将地址端(A、B、C)的二进制编码在一个对应的输出端以低电平译出。

利用E1、E2和E3可级联扩展成24线译码器;若外接一个反相器还可级联扩展成32线译码器。

若将选通端中的一个作为数据输入端时,74LS138还可作数据分配器。

74HC573具有数据锁存和数据缓冲的功能,做数据锁存时,当输入的数据消失时,在芯片的输出端,数据仍然保持;做数据缓冲时,可加强驱动能力。

同样,74LS244/74LS245/74LS373/74LS573都具备数据缓冲的能力。

四位一体的数码管的引脚图如上所述,将2个四位一体的数码管的A到G的引脚依次相连接,既可作为8位数码管的段选端,将BIT1到BIT4的引脚依次相连接,即可作为8位数码管的位选端。

数码管的段选端控制如上图所示,分别将2个4位一体的数码管A到G引脚相连,构成其段选端,用单片机的P0.0~P0.6经74hc573后控制其段选端,使之显示相应的字符。

数码管的位选段控制如上图所示,用单片机的P2.0~P2.2经74ls138的3—8译码器后控制该时刻数码管的哪一位选中,因为74ls138选中时输出为低电平,故数码管采用共阴级的数码管,方便控制和编程。

如上图所示,按键采取独立按键控制方式,用单片机的P3.1~P3.3控制3个弹性按键,用以显示时间和闹钟的控制。

3.硬件模块描述

3.1描述

(1)数码管显示部分

数码管显示部分的电路如图所示,单片机的P0口控制8数码管的段选端,决定显示的字符,P0口经过74hc573锁存器后输出数据控制数码管的段选端,74hc573在这里起到锁存数据和增加驱动能力,是数码管亮度增加的作用,此外,单片机P0口做输入/输出端口使用时必须加上拉电阻,一般为1K电阻。

单片机的P2.0~P2.2经74ls138的3—8译码器后将译出的数据送入数码管的位选端,控制该时刻数码管的哪一位选中,因为74ls138译出为低电平,故数码管采用共阴级的数码管,方便控制和编程。

当然,位选端也可以直接由单片机的P2口控制数码管的8位,但因为数码管显示采用动态扫描方式,数码管循环轮流点亮,采用每个端口控制编写程序比较繁琐,而且浪费端口,故采用3—8译码器输出。

(2)按键扫描控制部分

此部分为按键扫描控制部分,用来控制时间的调整、闹钟的设定及闹钟的开启和关闭,因所用的按键较少,故采用独立按键控制方式,且所用按键均为弹性小按键,即按下时为低电平接通,松手时即弹起变为高电平,为了节省输入/输出端口和方便编程,每个按键根据其按的次数有不同的作用。

(3)闹钟部分

此部分为闹铃部分,当定时时间到,蜂鸣器发出滴滴的声响,可通过按键关闭或开启,若无手动操作,则响够1分中后自动关闭。

(4)闹钟状态指示部分

闹钟指示部分由一只共阳的蓝色led充当,若闹钟在开启状态,则led为亮的状态,若闹钟在关闭状态,led为灭的状态,默认为闹钟开启状态。

总体电路图设计如下

3.1功能

单片机上电,启动开关后,电源指示灯(红色led)亮,显示初始时间12-00-00,且控制闹钟状态的的蓝色led灯为亮的状态。

此时可对显示时间进行调整和进行闹钟的设定。

具体做法如下:

当第一次按下第一个弹性按键时进入时间的调节状态,此时实现对显示时间的小时调节,按下第二个按键时实现小时的加一调节,按下第三个按键时实现小时的减一调节。

当第二次按下第一个弹性按键时进入显示时间的分钟调节状态,按下第二个按键时实现分钟的加一调节,按下第三个按键时实现分钟的减一调节。

当第三次按下第一个弹性按键时进入闹钟的小时调节状态,按下第二个按键时实现闹钟小时的加一调节,按下第三个按键时实现闹钟小时的减一调节。

当第四次按下第一个弹性按键时进入闹钟的分钟调节状态,按下第二个按键时实现闹钟分钟的加一调节,按下第三个按键时实现闹钟分钟的减一调节。

当第五次按下第一个弹性按键时返回正常的显示时间走时状态。

当定时时间到,蜂鸣器将发出滴滴的闹铃声,此时,若同时按下第二和第三个弹性按键,关闭闹钟,闹钟指示灯(蓝色led)灭,若不手动关闭,则在声音响够1分钟后自动关闭,闹铃不影响正常走时,也可在刚开始就对闹钟的状态进行设置,若刚开始将闹钟关闭,则定时时间到蜂鸣器也不响,闹钟默认为开启状态。

4.嵌入式软件设计

4.1流程逻辑

主程序流程图

主程序流程图如下图所示,在主程序中设置定时器定时器0和1工作在方式一,开始循环扫描个按键的状态,检测到该按键按下,则执行相应的程序,其中按键一的按下还有标志位,每次按下标志位都加一,根据标志位的不同可控制是时间的时、分调整,还是闹钟的时、分调整,按键二控制加一调节,按键三控制减一调节,同时按下按键二、三控制闹钟的状态。

 

N

Y

N

Y

N

Y

Y

N

时间显示流程图

时间显示流程图如下图所示,定义8个缓冲区,循环扫描数码管的位选状态,将时、分、秒的十位和各位计算显示,其中定时器一用来数码管的动态扫描。

 

定时器0中断流程图

定时器0中断流程图如下图所示,定时器0中断时先检测1秒是否到,1秒如果到,秒单元就加1;如果没到,就检测1分钟是否到,1分钟如果到,分单元就加1;如果没到,就检测1小时是否到,1小时如果到,时单元就加1,如果没到,就显示时间。

 

Y

 

4.2程序代码

(1)初始化及定义部分程序如下

#include

sbitKEY1=P3^2;

sbitKEY2=P3^3;

sbitKEY3=P3^4;

sbitspeak=P2^3;

sbitled=P1^2;

codeunsignedchartab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

unsignedcharStrTab[8];

unsignedcharminute=00,hour=12,second;

unsignedcharminute1=00,hour1=00;second1;

unsignedcharflag=0;

unsignedcharnum;

unsignedintcount;

unsignedintflag1=0;

此部分程序定义单片机p3.2口为KEY1,p3.3口为KEY1,p3.4口为KEY1,分别接三个弹性小按键,用于按键扫描,p2.3口为speak,接蜂鸣器,用于闹铃,p1.2口为led,接蓝色led,用于指示闹钟的开/关状态,tab[]数组中放有0~9共阴极数码管显示代码,定义8个缓冲区,用于数码管的动态扫描,初始化显示时间为12-00-00,定义标志位flag,用于标识按键一第几次按下,定义标志位flag1,用于标示闹钟的状态。

定义变量num和count,用于加一和计数。

(2)延时子函数

voiddelay(unsignedintcnt)

{

while(--cnt);

}

实现延时cntns的功能。

(3)正常时间显示子程序

voidplay(void)

{

StrTab[0]=tab[hour/10];

StrTab[1]=tab[hour%10];

StrTab[2]=0x40;

StrTab[3]=tab[minute/10];

StrTab[4]=tab[minute%10];

StrTab[5]=0x40;

StrTab[6]=tab[second/10];

StrTab[7]=tab[second%10];

}

用于显示正常的走时,显示格式为12-00-00,取小时的十位放在第一个数码管缓冲区,取小时的个位放在第二个数码管缓冲区,

第三个数码管缓冲区放入字符“—”,取分钟的十位放在第四个数码管缓冲区,取分钟的个位放在第五个数码管缓冲区,第六个数码管缓冲区放入字符“—”,取秒的十位放在第七个数码管缓冲区,取秒的个位放在第八个数码管缓冲区。

(4)闹钟时间显示

voidnplay(void)

{

StrTab[0]=tab[hour1/10];

StrTab[1]=tab[hour1%10];

StrTab[2]=0x40;

StrTab[3]=tab[minute1/10];

StrTab[4]=tab[minute1%10];

StrTab[5]=0x40;

StrTab[6]=tab[0/10];

StrTab[7]=tab[0%10];

}

原理与正常走时显示相同,只是函数名不同。

(5)主程序

main()

{

TMOD=0x01;//定时器0用于计时

TH0=0x3c;

TL0=0xb0;

ET0=1;

TR0=1;

TMOD=0x10;//定时器1用于动态扫描

TH1=0xF8;

TL1=0xf0;

ET1=1;

TR1=1;

EA=1;

play();

while

(1)//主循环

{

if(!

KEY1)//按键1去抖以及动作

{

delay(10000);

if(!

KEY1)

{

flag++;

}

}

if(flag==1)

{

if(!

KEY2)

{

delay(10000);

if(!

KEY2)

{

hour++;if(hour==24)hour=0;//正常时间小时加1

play();

}

}

if(!

KEY3)

{

delay(10000);

if(!

KEY3)

{

hour--;if(hour==0)hour=23;//正常时间小时减1

play();

}

}

}

if(flag==2)

{

if(!

KEY2)//按键去抖以及动作

{

delay(10000);

if(!

KEY2)

{

minute++;if(minute==60)minute=0;//分加1

play();

}

}

if(!

KEY3)//按键去抖以及动作

{

delay(10000);

if(!

KEY3)

{

minute--;if(minute==0)minute=59;//分减1

play();

}

}

}

if(flag==3)//闹钟对时

{

if(!

KEY2)

{

delay(10000);

if(!

KEY2)

{

hour1++;if(hour1==24)hour1=0;//闹钟时间小时加1

nplay();

}

}

if(!

KEY3)

{

delay(10000);

if(!

KEY3)

{

hour1--;if(hour1==0)hour1=23;//闹钟时间小时减1

nplay();

}

}

}

if(flag==4)

{

if(!

KEY2)//按键去抖以及动作

{

delay(10000);

if(!

KEY2)

{

minute1++;if(minute1==60)minute1=0;//闹钟分加1

nplay();

}

}

if(!

KEY3)//按键去抖以及动作

{

delay(10000);

if(!

KEY3)

{

minute1--;if(minute1==0)minute1=59;//闹钟分减1

nplay();

}

}

}

}

}

此部分程序用来对定时器设置初值和按键扫描,定时器0和1都工作在方式1,定时器0用于计时,计时时间为50ms,定时器1用于数码管动态扫描,即使时间为10ms,设置定时器初值和开启定时器后,调用显示时间子程序进行显示,同时不断循环扫描按键的状态,其中,按键一每按下一次,标志位加一,第一次按下时,标志位为一,标志进入显示时间小时的调节,此时若检测到按键2按下,则进行加一调节,若检测到按键3按下,则进行减一调节,若无则继续扫描,标志位为2时指示显示时间分钟的调节,标志位为3时指示闹钟小时的调节,标志位为4时指示闹钟分钟的调节。

其中,按键加入延时10ms的去抖动程序,当标志为为5时重新赋值标志位为0。

在进行显示时间和闹钟显示时调用相应的响应子程序。

(6)闹钟控制子程序

voidnz()

{

if(minute==minute1&&hour==hour1&&flag1==0)

{

if(second%2==1)

speak=0;

else

speak=1;

}

if(!

KEY2&&!

KEY3)

flag1++;

if(flag1==1)

led=0;

else

led=1;

if(flag1==2)

flag1=0;

if(flag==5)

flag=0;

}

此本分程序为闹钟控制子程序,当正常走时的分和闹钟的分、正常走时的时和闹钟的时相等且闹钟标志位为0时,蜂鸣器发出滴滴的响声,否则蜂鸣器不发声。

此外还加了闹钟状态标志位flag1,初值为0,标志着闹钟开启。

当按键2和3同时按下时,标志位加一,且led给低电平,即led灭,标志着闹钟关闭,否则led亮。

当flag1为2时,重新赋值为0.

(7)定时中断1子程序

voidtime1_isr(void)interrupt3//定时器1用来动态扫描,l,l

{

TH1=0xF8;//重入初值

TL1=0xf0;

switch(num){

case0:

P2=0;P0=StrTab[num];break;//分别调用缓冲区的值进行扫描

case1:

P2=1;P0=StrTab[num];break;

case2:

P2=2;P0=StrTab[num];break;

case3:

P2=3;P0=StrTab[num];break;

case4:

P2=4;P0=StrTab[num];break;

case5:

P2=5;P0=StrTab[num];break;

case6:

P2=6;P0=StrTab[num];break;

case7:

P2=7;P0=StrTab[num];break;

default:

break;

}

nz();

num++;//扫描8次,使用8个数码管

if(num==8)

num=0;

}

此部分为定时器1动态扫描数码管子程序,定时器1重新赋初值,定时时间10ms,利用case语句进行循环动态扫描,给数码管相应的位送入相应的段码,完成数码管的动态扫描显示,且在定时器1中调用闹钟子程序,不断检测闹钟时间是否到。

(8)定时中断0子程序

voidtim(void)interrupt1//using1

{

TH0=0x3c;

TL0=0xb0;

count++;

switch(count)

{

case0:

case20:

if(flag==1||flag==2||flag==0)//隔一定时间调用显示处理

play();

break;

case40:

if(flag==3||flag==4)

nplay();

break;

case60:

case80:

default:

break;

}

if(count==159)

{

count=0;

second++;//秒加1

if(second==60)

{

second=0;

min

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

当前位置:首页 > 自然科学 > 物理

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

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