电子钟设计.docx

上传人:b****5 文档编号:7272511 上传时间:2023-01-22 格式:DOCX 页数:20 大小:71.19KB
下载 相关 举报
电子钟设计.docx_第1页
第1页 / 共20页
电子钟设计.docx_第2页
第2页 / 共20页
电子钟设计.docx_第3页
第3页 / 共20页
电子钟设计.docx_第4页
第4页 / 共20页
电子钟设计.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

电子钟设计.docx

《电子钟设计.docx》由会员分享,可在线阅读,更多相关《电子钟设计.docx(20页珍藏版)》请在冰豆网上搜索。

电子钟设计.docx

电子钟设计

第一章电子时钟功能及设计方案

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;i

d+=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()

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

当前位置:首页 > 农林牧渔 > 林学

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

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