电子钟设计.docx
《电子钟设计.docx》由会员分享,可在线阅读,更多相关《电子钟设计.docx(20页珍藏版)》请在冰豆网上搜索。
![电子钟设计.docx](https://file1.bdocx.com/fileroot1/2023-1/22/7ff784f7-b19a-411e-a497-ed9e27544fd3/7ff784f7-b19a-411e-a497-ed9e27544fd31.gif)
电子钟设计
第一章电子时钟功能及设计方案
1.1电子时钟功能
1.1.1时钟简介
现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零。
从而达到计时的功能,是人民日常生活补课缺少的工具。
1.1.2时钟的基本特点及原理
现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。
该电子时钟由89C51,BUTTON,LCD等构成,采用晶振电路作为驱动电路,由延时程序和循环程序产生的一秒定时,达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。
而电路中唯一的一个控制键却拥有多种不同的功能,按下又松开,可以实现屏蔽数码管显示的功能,达到省电的目的;直接按下不松开,则可以通过按键实现分钟的累加,每按一次分钟加一;而连续两次按下按键不放松,则可实现小时的调节,同样每按一次小时加一。
1.1.3闹钟设计的基本特点及原理
当所设的闹钟时间与在液晶屏上所显示的时间是一样时,闹铃功能将被启动。
操作过程:
将时间与闹铃切换开关提起,LCD所显示的时间为00:
00:
00,即为闹铃的起始设计时间,当按下开关‘天++’键可实现天数的增加,没按一次,则增加一天,当按下开关‘时天++’可实现对小时的增加或调整,则增加一个小时,当按下‘分++’可实现对分钟的调整或增加,每按一次就可增加一分钟。
如闹铃设定时间为‘09:
08:
12’即9日08:
12。
当此时的时间与其相同,闹铃即被启动。
1.2设计方案
1.2.1计时方案
利用AT89S51单片机内部的定时/计数器进行中断定时,配合软件延时实现时、分、秒的计时。
该方案节省硬件成本,且能使读者在定时/计数器的使用、中断及程序设计方面得到锻炼与提高,对单片机的指令系统能有更深入的了解,从而对学好单片机技术这门课程起到一定的作用。
1.2.2显示方案
AT89S51的P0口和P2口外接由8个LED数码管(LED7~LED0)构成的显示器,用P0口作LED的段码输出口,P2口作LCD的位控输出线,P1口外接四个按键A、B、C、D构成键盘电路。
简易电子钟的功能不复杂,采用其现有的I/O便可完成。
第二章硬件介绍
2.1单片机简介
2.1.1单片机的特点
1.单片机的存储器ROM和RAM时严格区分的。
ROM称为程序存储器,只存放程序,固定常数,及数据表格。
RAM则为数据存储器,用作工作区及存放用户数据。
2.采用面向控制的指令系统。
为满足控制需要,单片机有更强的逻辑控制能力,特别是单片机具有很强的位处理能力。
3.单片机的I/O口通常时多功能的。
由于单片机芯片上引脚数目有限,为了解决实际引脚数和需要的信号线的矛盾,采用了引脚功能复用的方法,引脚处于何种功能,可由指令来设置或由机器状态来区分。
4.单片机的外部扩展能力很强。
在内部的各种功能部件不能满足应用的需求时,均可在外部进行扩展,与许多通用的微机接口芯片兼容,给应用系统设计带来了很大的方便。
2.1.289C51单片机介绍
VCC:
电源。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
89C51单片机
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚备选功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
2.3晶振电路
每个单片机系统里都有晶振,全程是叫晶体震荡器,在单片机系统里晶振的作用非常大,他结合单片机内部的电路,产生单片机所必须的时钟频率,单片机的一切指令的执行都是建立在这个基础上的,晶振的提供的时钟频率越高,那单片机的运行速度也就越快。
晶振用一种能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡。
在通常工作条件下,普通的晶振频率绝对精度可达百万分之五十。
高级的精度更高。
有些晶振还可以由外加电压在一定范围内调整频率,称为压控振荡器(VCO)。
晶振的作用是为系统提供基本的时钟信号。
通常一个系统共用一个晶振,便于各部分保持同步。
有些通讯系统的基频和射频使用不同的晶振,而通过电子调整频率的方法保持同步。
晶振通常与锁相环电路配合使用,以提供系统所需的时钟频率。
如果不同子系统需要不同频率的时钟信号,可以用与同一个晶振相连的不同锁相环来提供。
图晶振电路
2.4、定时器/计数器T0中断服务程序
T0用于计时,选中方式一,重复定时,定时时间设为50ms,定时时间到则中断,在中断服务程序中用一个计数器对50ms计数,计20次则对秒单元加一。
秒单元加到60则对分单元加一,同时秒单元清0;分单元加到60则对时单元加一,同时分单元清0;时单元加到24则对时单元清0,标
志一天时间计满。
在对各单元计数的同时,把他们的值放到存储器单元的指定位置。
2.5按键处理模块
时间按键设置:
如果按下K1键,则为当前时间,此时按下K2,则进入调时间分状态,时钟停止走动,依次按下K2可分别对年-月-星期-天-时-分-的调整,按K+和K-按键可以进行加一和减一操作;继续按K3键启动计时,即为当前调整的时间。
第三章软件仿真
3.1protues软件
3.1.1protues软件简介
ProteusISIS是英国Labcenter公司开发的电路分析与实物仿真软件。
它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:
①实现了单片机仿真和SPICE电路仿真相结合。
具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。
②支持主流单片机系统的仿真。
目前支持的单片机类型有:
68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。
③提供软件调试功能。
在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如KeilC51uVision2等软件。
④具有强大的原理图绘制功能。
总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。
本章介绍ProteusISIS软件的工作环境和一些基本操作。
3.1.2电路功能仿真
在PROTUES绘制好原理图后,调入已编译好的目标代码文件:
*.HEX,可以在PROTUES的原理图中看到模拟的实物运行状态和过程。
PROTUES是单片机课堂教学的先进助手。
PROTUES不仅可将许多单片机实例功能形象化,也可将许多单片机实例运行过程形象化。
前者可在相当程度上得到实物演示实验的效果,后者则是实物演示实验难以达到的效果。
它的元器件、连接线路等却和传统的单片机实验硬件高度对应。
这在相当程度上替代了传统的单片机实验教学的功能,例:
元器件选择、电路连接、电路检测、电路修改、软件调试、运行结果等。
课程设计、毕业设计是学生走向就业的重要实践环节。
由于PROTUES提供了实验室无法相比的大量的元器件库,提供了修改电路设计的灵活性、提供了实验室在数量、质量上难以相比的虚拟仪器、仪表,因而也提供了培养学生实践精神、创造精神的平台
随着科技的发展,“计算机仿真技术”已成为许多设计部门重要的前期设计手段。
它具有设计灵活,结果、过程的统一的特点。
可使设计时间大为缩短、耗资大为减少,也可降低工程制造的风险。
相信在单片机开发应用中PROTUES也能茯得愈来愈广泛的应用。
3.2电路原理图
3.3源程序代码
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitzhuan=P1^5;//dingyiyinjiao
sbitLED2=P2^6;sbitLED1=P1^7;//声音引脚
sbitLED=P2^7;
//时钟引脚
sbitSDA=P1^0;
sbitCLK=P1^1;
sbitRST=P1^2;
//液晶显示屏引脚
yejingpinyinjiao
sbitRS=P2^0;
sbitRW=P2^1;
sbitEN=P2^2;//K按键
sbitk1=P3^4;
sbitk2=P3^5;
sbitk3=P3^6;
sbitk4=P3^7;
ucharcodedis_alarm0[]="ALARMDHM";//定义一个字符串
uchardis_alarm1[]="TM:
00:
00:
00";//56天89时1112分
uchartian=0;
ucharshi=0;
ucharfen=0;
uchartcount=0;//一年中每个月份天数,二月天数有年份决定
ucharmonthdays[]={0,31,0,31,30,31,30,31,31,30,31,30,31};
uchar*week[]={"sun","mon","tus","wen","thu","fri","sat"};
//LCDhuanchongxianshi
ucharidatalcd_dis_buffer1[]={"DT:
2000-00-00"};
ucharidatalcd_dis_buffer2[]={"TM:
00:
00:
00"};
uchardatetime[7];//读取日期时间
uch
aradjust_index=-1;
ucharchange_flag[]="-MHDM-Y";//年-月-星期-天-时-分调整
//yanshi
//-----------------------------------------------
voiddelay(uintx)
{
uchari;
while(x--)for(i=0;i<120;i++);//空语句1us
}
//*************************驱动程序*DS_1302************8
//xieruyigezijieDS1302
voidwrite_to_DS(ucharx)
{
uchari;
for(i=0;i<8;i++)
{
SDA=x&1;CLK=1;CLK=0;x>>=1;
}
}
//-----------------------------------------------------------------
//getabytefromDS1302
ucharget_from_DS()
{
uchari,b,t;
for(i=0;i<8;i++)
{
b>>=1;t=SDA;b|=t<<7;CLK=1;CLK=0;
}
//BCDmazhuanhuan
returnb/16*10+b%16;
}
ucharread_data(ucharaddr)
{
uchardat;
RST=0;CLK=0;RST=1;
write_to_DS(addr);
dat=get_from_DS();
CLK=1;RST=0;
returndat;
}
//xiangDSmouzhidingweizhixierushuju
voidwrite_DS(ucharaddr,uchardat)
{
CLK=0;RST=1;
write_to_DS(addr);
write_to_DS(dat);
CLK=0;RST=0;
}
//settime
voidset_DS()
{
uchari;
write_DS(0x8E,0x00);//writecontrol,deleteprotete
//fen,shi,ri,yue,nian,yicixieru
for(i=1;i<7;i++)
{
write_DS(0x80+2*i,(datetime[i]/10<<4)|(datetime[i]%10));
}
write_DS(0x8E,0x80);//addprotect
}
//readcurrenttime
voidgettime()
{
uchari;
for(i=0;i<7;i++)
{
datetime[i]=read_data(0x81+2*i);
}
}
//---------***********DS_驱动结束********-------------------
//LCD控制
//读lcd状态
ucharread_lcd_state()
{
ucharstate;
RS=0;RW=1;EN=1;delay
(1);state=P0;EN=0;delay
(1);
returnstate;
}
//忙等待
voidlcd_busy_wait()
{
while((read_lcd_state()&0x80)==0x80);
delay(5);
}
//向LCD写数据
voidwrite_lcd_data(uchardat)
{
lcd_busy_wait();
RS=1;RW=0;EN=0;P0=dat;EN=1;delay
(1);EN=0;
}
//向LCD写指令
voidwrite_lcd_cmd(ucharcmd)
{lcd_busy_wait();
RS=0;RW=0;EN=0;P0=cmd;EN=1;delay
(1);EN=0;
}
//LCD初始化
voidInit_lcd()
{
write_lcd_cmd(0x38);delay
(1);
write_lcd_cmd(0x01);delay
(1);
write_lcd_cmd(0x06);delay
(1);
write_lcd_cmd(0x0C);delay
(1);
}
//设置液晶显示位置
voidset_lcd_pos(ucharp)
{
write_lcd_cmd(p|0x80);
}
//在LCDzhidinghang上显示字符串
voiddis_lcd_string(ucharp,uchar*s)//位置,字符指针
{
uchari;
set_lcd_pos(p);
for(i=0;i<16;i++)//16*2
{
write_lcd_data(s[i]);
delay
(1);
}
}
//LCD驱动结束
//闹钟显示
voidalarm_xs()//将闹钟时间转换成字符串
{
dis_alarm1[5]=tian/10+'0';
dis_alarm1[6]=tian%10+'0';
dis_alarm1[8]=shi/10+'0';
dis_alarm1[9]=shi%10+'0';
dis_alarm1[11]=fen/10+'0';
dis_alarm1[12]=fen%10+'0';
dis_lcd_string(0x00,dis_alarm0);//第一行显示字符串
dis_lcd_string(0x40,dis_alarm1);//第二行显示字符串
}//datetimechangtostring
voidformat_datetime(uchard,uchar*a)
{
a[0]=d/10+'0';a[1]=d%10+'0';
}
//-------------------------------------------------------
//瑞年判断
ucharisleapyear(uinty)
{
return(y%4==0&&y%100!
=0||(y%400==0));
}
//求weekday
voidrefreshweekday()
{
uinti,d,w=5;
for(i=2000;i<2000+datetime[6];i++)
{
d=isleapyear(i)?
366:
365;
w=(w+d)%7;
}
d=0;
for(i=1;id+=monthdays[i];d+=datetime[3];
datetime[5]=(w+d)%7+1;
}
//setyearmonthdayhourminscend++/--
voiddatetime_adjust(ucharx)
{
switch(adjust_index)
{
case6:
//nian00-99
if(x==1&&datetime[6]<99)datetime[6]++;
if(x==-1&&datetime[6]>0)datetime[6]--;
//geteryuetianshu
monthdays[2]=isleapyear(2000+datetime[6])?
29:
28;
if(datetime[3]>monthdays[datetime[4]])
datetime[3]=monthdays[datetime[4]];
refreshweekday();//refreshweekday
break;
case4:
//yue01-12
if(x==1&&datetime[4]<12)datetime[4]++;
if(x==-1&&datetime[4]>1)datetime[4]--;
//geteryuetianshu
monthdays[2]=isleapyear(2000+datetime[6])?
29:
28;
if(datetime[3]>monthdays[datetime[4]])
datetime[3]=monthdays[datetime[4]];
refreshweekday();//refreshweekday
break;
case3:
//ri
monthdays[2]=isleapyear(2000+datetime[6])?
29:
28;
if(x==1&&datetime[3]if(x==-1&&datetime[3]>0)datetime[3]--;
refreshweekday();//refreshweekday
break;
case2:
//hour
if(x==1&&datetime[2]<23)datetime[2]++;
if(x==-1&&datetime[2]>0)datetime[2]--;
break;
case1:
//minut
if(x==1&&datetime[1]<59)datetime[1]++;
if(x==-1&&datetime[1]>0)datetime[1]--;
break;
}
}
//--------------------------------------------------------------
//T0per1srefreshtheLCDT0中断
voidT0_int()