资源描述
任务书
一、设计目的
本设计主要是对51单片机的一个方面的扩展,是能实现一般定时闹钟功能的设计。需要实现某一功能时,按对应的按键即可,经过多次验证,此设计灵活简便,可以实现显示、定时、修改定时、定时时间到能发出报警声的功能.
二、设计要求
1、能显示时时—分分—秒秒.
2、能够设定定时时间,并修改定时时间。
3、定时时间到能发出警报声.
目录
1。绪论1
2。方案论证1
3。方案说明2
4.硬件方案设计2
4。1单片机STC89C522
4。2 时钟电路4
4.3数码管显示电路4
4。4键盘电路6
4。5报警电路7
5。软件方案设计7
5。1系统软件设计7
5。2键盘程序7
5。3 LED8
5。4音响报警电路8
5.5 程序流程图8
6。调试9
7。小结10
8.参考文献11
9.附录:定时闹钟源程序12
1。绪论
系统采用单片机STC89C52作为本设计的核心元件,在其基础上外围扩展芯片和外围电路,附加时钟电路,复位电路,键盘接口及LED显示器.键盘采用独立连接式.还有定时报警系统,即定时时间到,通过扬声器发出报警声,提示预先设定时间时间到,从而起到定时作用。
外围器件有LED显示驱动器及相应的显示数字电子钟设计与制作可采用单片机来完成.由于其功能的实现主要通过软件编程来完成,那么就降低了硬件电路的复杂性,而且其成本也有所降低,所以在该设计与制作中采用单片机STC89C52,它是低功耗、高性能的CMOS型8位单片机。片内带有8KB的Flash存储器,且允许在系统内改写或用编程器编程。另外, STC89C52的指令系统和引脚与8051完全兼容,片内有512B的RAM、32条I/O口线、3个16位定时计数器、4个外部中断、一个7向量4级中断结构(兼容传统51的5向量2级中断结构)等.
在LED显示器中,分成静态显示和动态显示两类,在这个设计的最小系统中主要用了它的动态显示功能,动态显示器利用了人视觉的短暂停留,在数据的传输中是一个一个传输的,且先传输低位。
2。方案论证
单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大, 而且可以随时的更新系统,进行不同状态的组合。
本系统采用单片机STC89C52作为本设计的核心元件,利用两个4位7段共阴LED作为显示器件。接入共阴LED显示器,可显示时,分钟,秒,单片机外围接有定时报警系统,定时时间到,蜂鸣器发出报警声,提示预先设定时间到。
电路由下列部分组成:时钟电路、复位电路、控制电路、LED显示、报警电路,芯片选用STC89C52单片机。
系统基本框图如图2.1所示:
图2。1系统基本框图
3。方案说明
此设计主要是通过单片机系统,综合运用定时器、中断、数码显示等知识设计一个可定时的电子钟.它包括系统总体方案及硬件设计,软件设计,Proteus软件仿真等部分。
系统总体方案及硬件设计是本设计的重要组成部分,在这部分详细介绍了时钟原理,硬件设计,数码管LED,以及在设计过程中考虑到技术指标,机型的选择,器件的选择等一系列问题。
硬件设计的主要任务是根据总体设计要求,以及在所选机型的基础上,确定系统扩展所要用的存储器,I/O电路及有关外围电路等然后设计出系统的电路原理图。
合理的软件结构是设计出一个性能优良的单片机应用性系统软件的基础,因此必须充分重视。在本设计中采用应用广泛的C语言。用Proteus软件仿真检查设计是否合理。
4.硬件方案设计
4。1单片机STC89C52
STC89C52是一个低电压,高性能CMOS型8位单片机,片内含8KB的可反复擦写的Flash只读程序存储器(ROM)和512B的随机存取数据存储器(RAM),器件采用STC公司的高密度、非易失性存储技术生产,兼容标准MCS—51指令系统,片内置通用8位中央处理器和Flash存储单元,内置功能强大的微型计算机的STC89C52提供了高性价比的解决方案。其引脚图如下图4。1所示:
图4。1 STS89C52
STC89C52具体介绍如下:
1)主电源引脚(2根)
VCC(40):电源输入,接+5V电源
GND(20):接地线
2)外接晶振引脚(2根)
XTAL1(19):片内振荡电路的输入端
XTAL2(18):片内振荡电路的输出端
3)控制引脚(4根)
RST/VPP(9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位.
ALE/PROG(30):地址锁存允许信号
PSEN(29):外部存储器读选通信号
EA/VPP(31):程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。
4)可编程输入/输出引脚(32根)
STC89C52单片机有4组8位的可编程I/O口,分别为P0、P1、P2、P3口,每个口有8位(8根引脚),共32根.
PO口(39~32):8位双向I/O口线,名称为P0。0~P0。7
P1口(1~8):8位准双向I/O口线,名称为P1。0~P1.7
P2口(21~28):8位准双向I/O口线,名称为P2。0~P2.7
P3口(10~17):8位准双向I/O口线,名称为P3。0~P3.7
4。2 时钟电路
单片机的时钟产生方法有两种:内部时钟方式和外部时钟方式。
本系统中STC89C52单片机采用内部时钟方式。最常用的内部时钟方式是采用外接晶体和电容组成的并联谐振回路。振荡晶体可在1.2MHz~12MHz之间。电容值无严格要求,但电容取值对振荡频率输出的稳定性、大小和振荡电路起振速度有少许影响,一般可在20pF~100pF之间取值。STC89C52单片机的时钟电路如图4。2所示。
图4.2时钟电路
4。3数码管显示电路
单片机中通常使用7段LED,LED是发光二极管显示器的缩写。LED显示器由于结构简单,价格便宜,体积小,亮度高,电压低,可靠性高,寿命长,响应速度快,颜色鲜艳,配置灵活,与单片机接口方便而得到广泛应用。LED显示器是由若干个发光二极管组成显示字段的显示部件,当发光二极管导通时,相应的一个点或一个笔划发光,控制不同组合的二极管导通,就能显示出各种字符.LED显示器有多种形式,如:“米"字型显示器,点阵显示器和七段数码显示器等,在单片机系统中使用最多的是七段数码显示器.
LED七段数码显示器由8个发光二极管组成显示字符,根据内部发光二极管
的连接形式不同,LED有共阴极和共阳极两种,如图4。3.1所示为4为7段共阴数码管的引脚图.
图4.3。1 4段共阴数码管引脚图
采用高亮共阴型s位数码管,为示区别,显示秒的两个数码管个头较小,另外4个较大。共阴数码管连接线路如下:一般用7个发光二极管构成显示数字和符号,另外还用一段发光二极管显示小数点。这种显示器一般分为两种,共阳极显示器和共阴极显示器,共阳极显示器是把每个二极管的正端连在一起,共阴极显示器是把每个二极管的阴极连在一起。一只显示器是有8个发光二极管构成,当把某段加正向电压时,则该段所对应的笔划亮,不加正向电压则暗,为了保护各段不受损坏需要加限流电阻,无论是共阳极显示器还是共阴极显示器,它的8段排列顺序都是一样的:A段、B段、C段、D段、E段、F段、G段和DP段。在单片机中通常使用7段LED.数码管的显示电路如下图4.3.2所示:
图4。3。2 数码管的显示电路
数码管中二极管电流的计算
二极管本身有2V的电压降,一般二极管电流取10mA,则需添加的电阻为
R=(U-ULed)/ILed,
代入相关数值,即为300Ω。
本设计中,选用的电阻为470Ω,则电流为
I=(U—ULed)/R´,
代入实际数值,即为6。4mA,能够满足显示效果。
4。4键盘电路
设计方案中使用的是3个开关键组成的键盘电路,如下图4.4所示:
图4.4 键盘电路图
4。5报警电路
设计方案中,采用的是蜂鸣器和PNP型三极管组成的报警电路.如下图4。5所示:
图4。5 报警电路
5.软件方案设计
5。1系统软件设计
该系统软件主要有主程序模块,定时中断服务程序,中断等待服务程序,键盘程序,显示子程序服务程序等六大模块组成,因为C语言容易理解和记忆,所以我们用C语言来写此程序。
5。2键盘程序
键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦有键按下,便转向相应的子程序处理,处理结束后再返回。
5。3 LED
七段LED由七个发光二极管按日字排开,所有发光二极管的阳极连在一起成共阳极,阴极连在一块称共阴极接法。当采用芯片驱动时不需要加限流电阻,其他情况下一般应外接限流电阻。动态显示电路有显示块,字形码封锁驱动器,字位锁存驱动器三部分组成.
5.4音响报警电路
在STC89C52外围的一个管口上加蜂鸣器,通过软件与硬件的结合可实现定时闹钟功能。
5。5 程序流程图
图5。5 程序流程图
6。调试
设几个按键从左往右为K1,K2,K3。K1与P1。0相连,K2与P1.1相连,K3与P1。2相连。
按一下启动开关,显示为时间显示。按一下K1,进入时间显示的小时设定状态;按两下K1,进入时间显示的分钟设定状态;按三下K1,进入定时的小时设定状态;按四下K1,进入定时的分钟设定状态;按五下K1,退出设定,进入当前时间显示状态;K2和K3分别是对当前设定值的加和减。如下图6。1和6.2所示。
图6。1 调时仿真效果图
图6。2 定时仿真效果图
7。小结
在做课程设计的过程中,我进一步认识到全面专业知识以及逻辑思考方式对研究问题的重要性,同时我也更加具体的掌握了课程设计的基本方法。
经过不断的努力,我终于完成了这次课程设计,总的来说,我学到了不少的东西,知道了理论联系实际的重要性。在设计过程中我遇到了很多的困难,但没放弃,查阅了许多相关的书籍,自己独立思考和借鉴了前人的许多优秀成果,并与所学的知识紧密的结合了起来.我相信这过程对我今后的学习和工作有着积极的影响,并搭好了平台。
通过这次设计,我对这门课有了更好的理解,尤其结合了这几年学的相关的专业知识,对各门课都有了一个较全面的理解。这必将对我以后的学习和工作有很大的帮助.本次课程设计的定时闹钟电路,可以满足人们的基本要求,但因为知识水平有限,此电路中存在一定的问题,虽可以通过增加电路解决,但过于复杂和现有水平有限,本次设计就未深入涉及,想要更好的改进电路,需要进一步的努力,如果有好的意见,希望老师给予支持指导.
8。参考文献
[1] 何立民。单片机应用技术选编10.北京:北京航空航天大学出版社
[2] 林立。单片机原理及应用。北京:电子工业出版社
[3] 沙占友等.单片机外围电路设计.西安:电子工业出版社
[4] 江力。蔡骏。王艳春.董泽芳.单片机原理与应用技术。北京,清华大学出版社
[5] 潘永红.柳殊.单片机原理与应用。西安,西安电子科技大学出版社
9。附录:定时闹钟源程序
#include <reg52。h>
unsignedcharled[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00}; //用一维数组定义0—9、横杠、全灭
unsigned char a[8];
unsigned char second=0,minute=0,hour=1;
unsigned char minute1=0,hour1=0;
unsigned char b[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //扫描
unsigned char k=0;
unsigned int temp; // 记录毫秒为秒的变量
unsigned char M,S_flag; //M是模式,更新时间的种模式加上正常模式 S_flag闪烁标志
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit BEEP=P3^3;
void delay(unsigned n) //0.2毫秒
{
int x,y;
for(x=0;x〈n;x++)
for(y=0;y〈24;y++);
}
void time1() interrupt 3 //定时器中断函数
{
TH1=0xfc; //定时ms
TL1=0x18;
temp++;
if(temp==1000) //配合定时器定时s
{
temp=0;
second++;
}
if(second==59)
{
second=0;
if(minute<59)
minute++;
else
{
minute=0;
hour++;
hour%=24;
}
}
if(hour1==hour&&minute1==minute&&second〈10) //闹钟时间到
{
if(M==0)
BEEP=!BEEP;
}
if(temp%250==0) //每ms
S_flag=!S_flag; //闪烁标志位取反
if(k==8) k=0;
P0=a[k];
P2=b[k++];
delay(1);
P2=0xff;
}
void display()
{
switch(M)
{
case 0:
{
a[0]=led[hour/10];
a[1]=led[hour%10];
a[2]=led[10];
a[3]=led[minute/10];
a[4]=led[minute%10];
a[5]=led[10];
a[6]=led[second/10];
a[7]=led[second%10];
}break;
case 1:
{
if(S_flag==1)
{
a[0]=led[hour/10];
a[1]=led[hour%10];
}
else
{
a[0]=led[11];
a[1]=led[11];
}
a[2]=led[10];
a[3]=led[minute/10];
a[4]=led[minute%10];
a[5]=led[10];
a[6]=led[second/10];
a[7]=led[second%10];
}break;
case 2:
{
a[0]=led[hour/10];
a[1]=led[hour%10];
a[2]=led[10];
if(S_flag==1)
{
a[3]=led[minute/10];
a[4]=led[minute%10];
}
else
{
a[3]=led[11];
a[4]=led[11];
}
a[5]=led[10];
a[6]=led[second/10];
a[7]=led[second%10];
}break;
case 3:
{
if(S_flag==1)
{
a[0]=led[hour1/10];
a[1]=led[hour1%10];
}
else
{
a[0]=led[11];
a[1]=led[11];
}
a[2]=led[10];
a[3]=led[minute1/10];
a[4]=led[minute1%10];
a[5]=led[11];
a[6]=led[11];
a[7]=led[11];
}break;
case 4:
{
a[0]=led[hour1/10];
a[1]=led[hour1%10];
a[2]=led[10];
if(S_flag==1)
{
a[3]=led[minute1/10];
a[4]=led[minute1%10];
}
else
{
a[3]=led[11];
a[4]=led[11];
}
a[5]=led[11];
a[6]=led[11];
a[7]=led[11];
}
}
}
void key_prc()
{
if(K1==0)
{
delay(10); //延时去抖
if(K1==0) //按K1进行模式切换
{ M++;
if(M==5)
M=0;
}
while(!K1);//等待按键释放
}
if(M!=0)
{
switch(M)
{
case 1: //模式——调时
{
if(K2==0)
{
delay(10); //延时去抖
if(K2==0) //加键按下
{
if(hour〈23) hour++;
else hour=0;
}
while(!K2); //等待按键释放
}
if(K3==0)
{
delay(10);
if(K3==0)
{
if(hour> 0) hour--;
else hour=23;
}
while(!K3);
}
} break;
case 2: //模式——调分
{
if(K2==0)
{
delay(10);
if(K2==0)
{
if(minute〈59) minute++;
else minute=0;
}
while(!K2);
}
if(K3==0)
{
delay(10);
if(K3==0)
{
if(minute>0) minute——;
else minute=59;
}
while(!K3);
}
} break;
case 3: //模式—-闹钟调时
{
if(K2==0)
{
delay(10);
if(K2==0)
{
if(hour1<23)
hour1++;
else hour1=0;
}
while(!K2);
}
if(K3==0)
{
delay(10);
if(K3==0)
{ if(hour1>0)
hour1——;
else hour1=23;
}
while(!K3);
}
} break;
case 4: //模式-—闹钟调分
{
if(K2==0)
{
delay(10);
if(K2==0)
{
if(minute1〈59)
minute1++;
else minute1=0;
}
while(!K2);
}
if(K3==0)
{
delay(10); //延时去抖
if(K3==0) //减键按下
{ if(minute1>0)
minute1-—;
else minute1=59;
}
while(!K3);
}
} break;
}
}
}
void main()
{
M=0;
S_flag=0; //闪烁标志位
TMOD=0x10; //定时器以方式定时
TL1=0x18;
EA=1; //打开总中断
ET1=1; //允许定时器中断
TR1=1; //开启定时器(开始定时计数)
while(1)
{
key_prc();
display();
}
}
12
展开阅读全文