LED显示的电子钟.docx
《LED显示的电子钟.docx》由会员分享,可在线阅读,更多相关《LED显示的电子钟.docx(24页珍藏版)》请在冰点文库上搜索。
LED显示的电子钟
《单片机原理及其接口技术》
课程设计报告
课题LED显示的电子钟
姓名周文
学号201104170132
院系自动控制与机械工程学院
班级电气1班
指导教师冯维杰王玮
2013年7月
目录
一、设计目的及要求……………………………………………………………….1
二、系统设计………………………………………………………………….1
三、硬件设计…………………………………………………………………………….…1
1、AT89C51……………………………………………………………………………2
2、LED数码管显示部分…………………………………..…………………………2
2、晶振部分…………………………………………………..………………………3
4、按键部分………………………………………………..…………….…………3
四、软件设计…………………………………………………………………….………………4
1、protues软件……………………………………………………………………………4
2、流程图…………………………………………………………………..……4
3、仿真结果…………………………………………………………..……………6
五、总结与心得体会…………………………………………………………………………7
六、附录(C语言程序)………………………………………………………….…………8
一、设计目的及要求
1、设计题目:
LED显示的电子钟
2、设计任务:
基于AT89C51单片机,制作一个LED显示的智能电子钟。
3、设计要求:
(1)、用6个7段LED数码管作为显示设备,设计时钟功能。
(2)、显示格式,日期:
YYMMDD,时间:
HHMMSS.
(3)、可以分别设计年、月、日,时、分、秒。
在复位后的日期应该为:
120101,时间为:
000000。
(4)、秒钟复位功能,当秒位键按下后,秒的那位回到00。
(5)、键盘按键个数应该万为己确定。
(6)、@时间、月、日自行交替显示,或者按键切换显示。
二、系统设计
设计中采用AT89C51芯片及LED显示器,一些独立式按键构成一个简单的数字电子钟。
设计中是采用单片机的内部定时器进行定时,程序框图如图2.1所示:
图2.1系统框图
整个电子钟的工作原理是:
在正常的供电状态下,首先利用单片机定时,到了相应的时间由单片机将所需要显示的数据送到LED显示器的输入口,当有键按下时则进入相应的按键显示和调整状态,进行按键调整。
三、硬件设计:
硬件设计是指应用系统的电路设计,包括单片机芯片、控制电路、存储器、I/O接口等等。
硬件设计时,应考虑留有充分余量,电路设计力求无误,因为在系统调试中不易修改硬件结构。
如原理图所示,硬件系统主要由单片机最小应用系统、LED数码管显示部分、电源部分、晶振部分、按键部分等组成。
1、单片机最小系统——AT89C51.
AT89C51是一种带8K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。
时钟电路由一个12MHZ的石英晶体振荡器和两个22pF的的电容组成振荡电路和分频电路,为单片机提供内部时钟。
复位电路采用上电复位和按键复位结合的方式对电路进行复位,主要是通过RST引脚送入单片机。
如图3.1:
图3.189C51单片机图
2、LED数码管显示模块
本系统利用6位LED数码管显示时间,共阴极结构。
LED数码管由7段发光二极管组成,当要显示某个数字时只要将数字所对应的引脚送入低电平。
图3.2LED数码管的数值表及其引脚图
3、晶振模块:
下图所示为时钟电路原理图,在AT89S51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2。
而在芯片内部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。
时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。
图3.3晶振部分电路图
4、按键模块:
本设计中主要有8个控制按键,按键功能为:
(1)、P1.0键位为秒复位键,当使用时,使秒所显示数据复位。
回到00;
(2)、P1.1键位为分钟加“1”;
(3)、P1.2键位为小时加“1”;
(4)、P1.3键位为切换日期和时间;
(5)、P1.4键位为天数加“1”;
(6)、P1.5键位月份加“1”;
(7)、P1.6键位为年份加“1”;
(8)、P1.7为清零开关,当功能切换为日期显示时,P1.7键位为日期复位。
图3.4独立按键部分电路图
四、软件设计:
1、Protues软件的介绍:
Proteus软件所提供了30多个元件库,数千种元件。
元件涉及到数字和模拟、交流和直流等。
在Proteus软件包中,不存在同类仪表使用数量的问题。
Proteus还提供了一个图形显示功能,可以将线路上变化的信号,以图形的方式实时地显示出来,其作用与示波器相似但功能更多。
提供软件调试功能。
在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如KeilC51uVision2等软件。
具有强大的原理图绘制功能。
总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。
在protues绘制好原理图后,调入已编译好的目标代码文件:
*.HEX,可以在protues的原理图中看到模拟的实物运行状态和过程。
用Protues软件进行仿真,其仿真的电路图如图4.1所示
仿真设计图如下:
图4.2.1仿真电路图
2、程序设计流程图
根据所编写的C语言程序,画出如下所示的流程图,程序按照流程图的步骤运行。
图4.2.1主程序流程图
图4.2.2时间处理子程序图
图4.23键盘扫描程序流程图
3、软件仿真结果
经过仿真,得到要求中的结果,如图所示:
图4.3.1清零结果图
图4.3.2日期复位结果图
图4.3.3秒复位结果图
五、设计总结
我们电气工程机自动化专业的学生学习单片机原理及接口技术课程,配套的开设课程设计。
我们三个班的同学在一起进行了一次单片机的课程设计的实训,实训的时间为一个周,在这个周的实训中,我们通过本课程设计明白了这样的课程是培养学生的主专业课,是培养现代化人才的重要技术之一。
单片机的课程设计是学习单片机理论的重要实践环节,在单片机的实验课程基础上,我们通过课程的设计和学习,使我们增进对单片机的感性认识,加深对单片机理论的的理解,使我们掌握单片机的内部功能模块的应用,掌握单片机的接口功能和扩展的应用,掌握一些特殊器件的使用方法,学习编辑综合的程序。
使我们了解和掌握单片机应用系统的硬件和软件的设计的方法和调试的过程。
充分发挥我们的主观能动性,更好的激发了我们的学习激情和学习的兴趣。
这次试训培养了我们大学生能主动利用芯片解决工程上实际的问题的意识,培养了我们的工程实践能力、实际动手能力和自我学习的能力。
使我们为完成从实际项目立题、调研、方案论证、方案实施、系统的调试、编写使用说明书等调研过程的基本训练,为今后在相关的领域中从事和单片机有关的设计、开发、应用等工作打下扎实的基础。
六、附录
用C语言编写的程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
/*七段共阴管显示定义*/
ucharcodedispcode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
/*定义并初始化变量*/
0x80,0xBF,0x86,0xCB,0xCF,0xEF,0xED,0xFD,0x87,0xFF,0xDF};
ucharsecond=0;
ucharminute=0;
ucharhour=0;
ucharmstcnt=0;
ucharmon=1;
ucharday=1;
ucharyear=12;
intdisp=0;
inta=0,k1num;
sbitP10=P1^0;//second调整定义
sbitP11=P1^1;//minite调整定义
sbitP12=P1^2;//hour调整定义
sbitP13=P1^3;//年月日与时分秒转换
sbitP14=P1^4;
sbitP15=P1^5;
sbitP16=P1^6;
sbitP17=P1^7;
/*函数声明*/
voiddelay(uchark);//延时子程序
voidtime_pro();//时间处理子程序
voiddisplay();//时分秒显示子程序
voiddisplay1();//年月日显示子程序
voidkeyscan();//键盘扫描子程序
/*****************************/
/*延时子程序*/
/****************************/
voiddelay(uchark)
{
ucharj;
while((k--)!
=0)
{
for(j=0;j<125;j++)
{;}
}
}
/**************************/
/*时间处理子程序*/
/**************************/
voidtime_pro(void)
{
if(second==60)//秒钟设为进制
{
second=0;
minute++;
if(minute==60)//分钟设为进制
{
minute=0;
hour++;
if(hour==24)//时钟设为进制
{
hour=0;
day++;
//switch(mon)
//{
//
//case3:
//case5:
//case7:
//case8:
//case10:
//case12:
//case1:
if(day==30)
{
day=1;
mon++;
//}
//break;
//case2:
//if(day==31)
//{
//day=1;
//mon++;
//}
//break;
/*case4:
if(day==31)
{
day=1;
mon++;
}
break;
//case6:
//case9:
//case11:
//
}*/
if(mon==13)
{
mon=1;
year++;
if(year>=99)
{
year=1;
}
}
}
}
}
}
}
/*****************************/
/*时分秒显示子程序*/
/*****************************/
voiddisplay(void)
{
P2=0xfe;
P0=dispcode[hour/10];//显示小时的十位
delay(4);
P2=0xfd;
P0=(dispcode[(hour%10)])|0X80;//显示小时的个位
delay(4);
P2=0xfb;
P0=dispcode[minute/10];//显示分的十位
delay(4);
P2=0xf7;
P0=(dispcode[minute%10])|0X80;//显示分的个位
delay(4);
P2=0xef;
P0=dispcode[second/10];//显示秒的十位
delay(4);
P2=0xdf;
P0=dispcode[second%10];//显示秒的个位
delay(4);
}
/*年月日显示程序*/
voiddisplay1(void)
{
P2=0xfe;
P0=dispcode[year/10];
delay(4);
P2=0xfd;
P0=(dispcode[(year%10)])|0X80;
delay(4);
P2=0xfb;
P0=dispcode[mon/10];
delay(4);
P2=0xf7;
P0=(dispcode[mon%10])|0X80;
delay(4);
P2=0xef;
P0=dispcode[day/10];
delay(4);
P2=0xdf;
P0=dispcode[day%10];
delay(4);
}
/*******************************/
/*键盘扫描子程序*/
/*******************************/
voidkeyscan(void)
{
if(P10==0)//按键秒的调整
{
delay(30);
k1num++;
if(P10==0)
{
second++;
if(k1num==0)
{
if(second==60)
{
second=0;
}
}
if(k1num==1)
{
second=0;
k1num=0;
}
}
while(P10==0)
display();
}
if(P11==0)//按键分的调整
{
delay(30);
if(P11==0)
{
minute++;
if(minute==60)
{
minute=0;
}
}
while(P11==0)
display();
}
if(P12==0)//按键小时的调整
{
delay(30);
if(P12==0)
{
hour++;
if(hour==24)
{
hour=0;
}
}
while(P12==0)
display();
}
if(P13==0)//年月日与时分秒的转换
{
delay(30);
if(P13==0)
{
disp=!
disp;
}
while(P13==0)
display();
}
if(P14==0)
{
delay(30);
if(P14==0)
{
day++;
if(day==31)
{
day=1;
}
}
while(P14==0)
display1();
}
if(P15==0)
{
delay(30);
if(P15==0)
{
mon++;
if(mon==13)
{
mon=1;
}
}
while(P15==0)
display1();
}
if(P16==0)
{
delay(30);
if(P16==0)
{
year++;
if(year==100)
{
year=1;
}
}
while(P16==0)
display1();
}
if(P17==0)
{
delay(30);
if(P17==0)
{
second=0;minute=0;hour=0;day=01;mon=01;year=12;
}
}
}
voidtimer0(void)interrupt1using0//定时器方式,ms中断一次
{
TH0=0x3c;
TMOD=0x11;
mstcnt++;
if(mstcnt==20)
{
second++;
mstcnt=0;
}
}
/**************************/
/*主函数*/
/**************************/
voidmain(void)
{P1=0xff;//初始化p1口,全设为
TMOD=0x11;//time0为定时器,方式
TH0=0x3c;//预置计数初值
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
while
(1)
{
keyscan();//按键扫描
time_pro();//时间处理
if(disp)
display1();//显示时间
else
display();
}
}