基于STC89C52的数字电子钟设计.docx
- 文档编号:5659444
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:20
- 大小:543.38KB
基于STC89C52的数字电子钟设计.docx
《基于STC89C52的数字电子钟设计.docx》由会员分享,可在线阅读,更多相关《基于STC89C52的数字电子钟设计.docx(20页珍藏版)》请在冰点文库上搜索。
基于STC89C52的数字电子钟设计
信息与电气工程学院
单片机原理与应用及C51程序设计
题目:
基于STC12C5A60S2的数字电子钟设计
专业电气工程及其自动化
班级1001班
姓名
学号
信息与电气工程学院
2013年7月8日
1、基本任务................................................................................................2
2、发挥任务................................................................................................2
3、硬件系统分析与设计............................................................................2
4、系统总体设计方案................................................................................3
5、Protel原理图及其原理说明.................................................................4
6、按键设计流程图.....................................................................................7
7、原理图.......................................................................................................................8
8、PCB图......................................................................................................................9
9、完整程序..................................................................................................9
10、系统所需的元器件清单.......................................................................19
11、检测阶段...............................................................................................19
12、疑难问题...............................................................................................19
13、课程设计总结.......................................................................................19
基本任务
1、采用STC单片机和键盘,设置4位LED数码管显示的电子时钟;
2、上电时,显示12:
00并且“.”间隔500ms闪烁,其中“.”代表秒功能;
3、具有闹钟设定、闹铃、功能;
4、通过键盘可修改时间。
发挥任务
1、实现时钟整点“嘟”声提示功能;
2、实现闹铃时间到有LED灯摆。
硬件系统分析与设计
本系统由以下各个模块电路构成:
1、单片机最小系统:
包括按键复位电路、时钟电路(12MHZ晶振)、STC12C5A60S2单片机为主控模块;
2、蜂鸣器电路:
闹铃作用;在本次实验中整点报时以及闹钟闹铃,通过该电路模块实现,蜂鸣器P1.6接低电平有效;
3、独立键盘:
按键输入,软件程序通过功能键的设置,实现时钟/秒表等功能切换。
按键为独立按键,需要进行键盘扫描,按键对应的引脚分别是P1.3、P1.4、P1.5;
4、数码管:
此次课程设计的数码管为共阳极,低电平有效,且引脚分别为P2.0、P2.1、P2.2、P2.3,本次实验使用数码管动态扫描方式显示;
系统总体设计方案
1、系统硬件框图如下图
(1)所示
图
(1):
系统硬件框图
2、系统工作原理
设计基于单片机STC89C52的数字电子时钟,实现时钟的准确显示,以及保证秒表计时准确,并且将误差控制在最小范围内。
利用数码管显示所需模块,同时显示小时、分钟、秒的计时,利用编程实现,在程序中进行时间的控制及调整,配合外部硬件按键电路实现小时、分钟显示模式及闹钟调整模式的切换。
通过多次修改优化单片机汇编程序,实现数码管正常的显示时、分、秒表及闹钟功能。
3、方案论证与比较
(1)单片机的选型:
方案一:
选用AT89S51单片机。
方案二:
选用STC12C5A16S2单片机。
本系统采用方案二,AT89S51单片机的FlashRom为4K,程序存储量太小,若采用12M晶振,则机械周期为1us。
而STC12C5A16S2单片机FlashRom为16K,程序存储量大,若采用12M晶振,其机械周期可达(1/12)us。
运行速度快12倍。
(2)显示方案
方案一:
选用1602液晶显示。
方案二:
选用4位数码管显示。
本系统采用方案二,1602液晶能显示16x2个字符,能很好的显示时间,但它与数码管相比成本太大。
对于本系统要求的显示内容数码管完全能完成。
成本大大降低。
Protel原理图及其原理说明
图(a):
8052芯片
图(a)为主控模块STC12C5A60S2单片机
图(b):
按键电路
图b按键电路功能实现:
P2.0引脚对应的按键为“功能键”,按键次数决定时钟小时、分钟的调整及闹钟小时、分钟的调整;P2.1引脚对应的按键为“确定键”;P2.2引脚对应的按键为“加键”;P2.3引脚对应的按键为“减键”;P2.4引脚接地。
图(c):
MOS管
图(c)为MOS管(PNP)实现对LED数码管的片选功能:
引脚P1.4、P1.5、P1.6、P1.7分别通过一个安全电阻与MOS管相连,通过对单片机引脚P1.4、P1.5、P1.6、P1.7接高低电平(接低电平时选通),实现对4个LED数码管(PNP)的片选功能。
图(d):
LED数码管
图(d)数码管功能实现:
本系统时钟数值显示采用动态数码管显示,即4个是数码管依次显示不同的数值,然后重复上述动作通过调试设计者。
本系统使用4个共阳极数码管,并且后2个是倒着装的。
因此在时钟程序显示时,可以定义2个不同的数码显示数组,一个专门为前2位数码管设置,另一组专门为后2位数码管设置。
这样可以形象的显示出时间的跳动。
图(e):
蜂鸣器电路
图(e)为蜂鸣器电路:
开启蜂鸣器电路(接单片机引脚INT0),当INT0断为低电平时蜂鸣器产生蜂鸣声。
图(f):
时钟电路
图(f)为时钟电路(接单片机引脚X1、X2):
单片机提供精确定时的内置电路,由晶振产生像时钟一样准确的振荡电路,主要用于计时、通讯时钟发生器、时间中断源、键盘去抖等等,电容用来滤波用,防止杂波干扰晶振的正常工作。
图(g):
按键复位电路
图(g)为按键复位电路(接单片机RST引脚):
实际上就是提供一个符合单片机要求的脉冲宽度和电平范围的复位信号,以使单片机回到初始状态重新开始,在有些电路中也同时将外围电路复位,即外接复位电路一接通,内部所有数据从0000位置开始运行,所有数据归位。
对于复位电路中的电容,是为了维持复位信号说要的高电平或者低电平时间而用的,一般由所用的单片机复位信号所要求的时间而定,而电容的充放电时间也要取决于电容本身,不同的电容一般不同。
按键设计流程图
原理图:
PCB图:
完整程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineled_portP3
#defineFLASH_FREQ100
sbitKEY1=P1^4;
sbitKEY2=P1^5;
sbitP1_6=P1^6;
sbitP1_3=P1^3;
sbitP1_2=P1^2;
bitDisDecemal=0;
#defineCOM1_ON(P2=0xf7)//11111110
#defineCOM2_ON(P2=0xfb)//11111101
#defineCOM3_ON(P2=0xfd)//11111011
#defineCOM4_ON(P2=0xfe)//11110111
#defineCOMS_OFF(P2=0xff)
#defineSEG_PORT(P0)
#defineDISPLAY_BIT4
ucharcodeLED_Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
ucharDisBuff[DISPLAY_BIT];
ucharshi=11,fen=59,miao=50,dshi=12,dfen=1;
ucharbjcs;
voiddelay(ucharms);
voiddelay(ucharms)
{
uchari,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
voidLED_DisplayTimer(ucharLED1,ucharLED2,ucharLED3,ucharLED4)
{
DisBuff[0]=LED_Tab[LED1];
DisBuff[1]=LED_Tab[LED2];
DisBuff[2]=LED_Tab[LED3];
DisBuff[3]=LED_Tab[LED4];
if(DisDecemal==1)
DisBuff[1]&=0x7f;
}
voidTimer0_Init(void)
{
TMOD=0x01;
TH0=(65536-5000)>>8;
TL0=(65536-5000);
IE=0x82;
TR0=1;
}
voidDisplay_Scan(void)
{
staticucharCOM;
COM++;
if(COM>=DISPLAY_BIT)COM=0;
COMS_OFF;
switch(COM)
{
case0:
SEG_PORT=DisBuff[0];
COM1_ON;
break;
case1:
SEG_PORT=DisBuff[1];
COM2_ON;
break;
case2:
SEG_PORT=DisBuff[2];
COM3_ON;
break;
case3:
SEG_PORT=DisBuff[3];
COM4_ON;
break;
}
}
voidKeyScan(void)
{
if(KEY1==0)
{
delay(10);
if(KEY1==0)
{
shi++;
if(shi==24)
shi=0;
while(!
KEY1)
{
LED_DisplayTimer(shi/10,shi%10,fen/10,fen%10);
}
}
}
elseif(KEY2==0)
{
delay(10);
if(KEY2==0)
{
fen++;
if(fen==60)
fen=0;
while(!
KEY2)
{
LED_DisplayTimer(shi/10,shi%10,fen/10,fen%10);
}
}
}
}
voidnaoling(void)
{
while((shi==dshi)&(fen==dfen))
{
led_port=0xaa;/*将数据输出到LED端口,显示为8.6.4.2号灯亮*/
delay(230);
delay(230);
delay(230);
delay(230);/*延时*/
led_port=0x55;/*将数据输出到LED端口,显示为7.5.3.1号灯亮*/
delay(230);
delay(230);
delay(230);
delay(230);/*延时*/
for(bjcs=0;bjcs<10;bjcs++)
{
P1_6=1;
delay(9000);
P1_6=0;
delay(9000);
}
if(P1_2==0)
delay(10);
if(P1_2==0)
break;
}
led_port=0xff;
}
/*整点报警*/
voidzhengdian(void)
{if((miao==0)&(fen==0))//整点报时
{P1_6=1;
delay(8000);
P1_6=0;
}
}
/*定时闹钟*/
voiddingshi(void)
{
while(P1_3==0)
{
LED_DisplayTimer(dshi/10,dshi%10,dfen/10,dfen%10);
if(KEY1==0)//设定时
{
delay(30);
if(KEY1==0)
{
dshi++;
if(dshi==24)
{
dshi=0;
}
}
while(!
KEY1)
{
LED_DisplayTimer(dshi/10,dshi%10,dfen/10,dfen%10);
}
}
if(KEY2==0)//设定分
{
delay(30);
if(KEY2==0)
{
dfen++;
if(dfen==60)
{
dfen=0;
}
}
while(!
KEY2)
{
LED_DisplayTimer(dshi/10,dshi%10,dfen/10,dfen%10);
}
}
}
if((shi==dshi)&(fen==dfen)&(miao==0))//闹铃时间到,报警。
{
naoling();
}
}
voidmain()
{
led_port=0xff;
Timer0_Init();
while
(1)
{
LED_DisplayTimer(shi/10,shi%10,fen/10,fen%10);
KeyScan();
zhengdian();
dingshi();
}
}
voidTimer0(void)interrupt1using3
{
staticucharflashFREQ;
staticucharmms;
flashFREQ++;
mms++;
TH0=(65536-5000)>>8;
TL0=(65536-5000);
if(mms==200)//5*200=1000
{
mms=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
Display_Scan();
if(flashFREQ>=FLASH_FREQ)
flashFREQ=0;
if(flashFREQ>=FLASH_FREQ/2)
DisDecemal=1;
else
DisDecemal=0;
}
系统所需的元器件清单
1块8052芯片;
3个10K电阻,1个5.1K电阻,4个5.6K电阻;
2个22pf电容,1个20pf电容,1个10pf电容;
1个12MHZ晶振;
4个按键;
1个蜂鸣器;
4个数码管;
5V电源;
1个开关。
检测阶段
检测阶段没有什么问题,使用WAVE软件对程序进行调试及通过STC仿真软件进行仿真。
疑难问题
用程序实现的软件按键去抖不够稳定,数字时钟计时的精准度不够高。
课程设计总结
1、本课题核心内容:
基于STC12C5A16S2单片机的电子时钟设计,具有时间设置、整点报时、闹铃设置及秒表功能,由4位LED数码管显示时间。
2、使用价值:
本设计操作简单,只需4个按键就能设置时间、设置闹铃和设置秒表。
4位数码管显示清晰。
最重要的是设计成本低,基本适用于所有用户。
3、优缺点及改进方向:
由于使用的晶振只有12MHZ,所以,在数码管上显示的时间略有抖动。
如果采用32MHZ的晶振,效果可能会更好。
也可将数码管改用1602液晶,虽然成本上升很多,但让用户有多的选择,使设计的档次上升,并且扩大了用户范围。
本次设计采用的是STC12C5A60S2单片机,此款性能强大,资源充足,仅仅实现这些功能,有点大材小用了。
整体功能设计还可以进一步改良,按现在的设计,一旦断电(比如更换电源),那么原先更改的闹钟时间又会恢复到初始状态,即每次更换电池就要设置一次闹钟时间,很不方便。
关于整点闹铃和报时,用蜂鸣器来实现,若再加一个模块来实现语音报时、室温显示等,也可通过GPRS模块直接采集网络时间保证时间的精准,这样会更具智能化特点,也可提高其实用性。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STC89C52 数字 电子钟 设计