一款由89C2051设计的电子钟
- 格式:docx
- 大小:11.51 KB
- 文档页数:2
1 LED点阵显示系统简介随着图形点阵LED显示模块在各行各业的逐步使用,使得人机界面变得越来越直观形象,尤其对于国内大多数需要有汉字和图形显示的用户来说,显示界面的友好与否,将直接影响到其产品的形象和市场竞争力。
本文所介绍的点阵LED显示屏,显示汉字和各种常见字符等信息,可广泛应用于各种场所。
具有结构简单、安装方便、字型美观、图案清析。
采用高性能单片机控制,性能稳定,可靠性高,具有掉电保护功能,可完全脱机运行,可以显示约2000个文字。
经过一条RS-232串口线与电脑连接更换信息,操作简单,使用方便。
2 LED点阵显示系统的硬件设计LED点阵显示系统由计算机、RS-232通讯电路、控制电路和LED点阵显示电路构成,结构框图如图1所示。
图1 LED点阵显示电路构成结构框图上位计算机可选择工业控制计算机或者普通个人计算机。
单块条屏由控制电路和驱动显示电路组成。
控制电路负责与上位机通信,可根据通信距离的远近选用RS- 232或RS-485标准总线接口。
本电路采用RS-232接口的3脚(TXD)和5脚(GND),计算机向控制电路发送汉字或字符内码;控制电路存储该内码并在字库中对应汉字或字符点阵,向驱动电路发送行列选通信号;显示驱动电路负责根据行列选通信号,向指定LED发光器件提供驱动电流。
2.1 显示控制电路控制部分以单片机89C51为核心,辅以外围电路,完成串行通信、外部存储器读取、行列选通信号输出等任务。
为使计算机与控制电路能够随时通信,需要单片机89C51与89C2051与其它器件之间可以通信。
当89C2051接收到计算机发送的数据信号时,通过 P3.2脚向89C51发送中断信号,此时该脚作为I/O口。
而后89C51响应该中断,并通过P1口接收来自89C2051P1口的数据。
在 PC机内部,汉字是以机内码的形式存储的,每个汉字占两个字节。
单片机89C51将采集来的数据放到串行E2PROM(24LS32)中,P3.3接 SDA和P3.4接SCL。
简易电子钟的制作硬件设计序言单片机具有体积小、可靠性高、功能强、灵活方便等许多优点,故可以广泛应用于各个领域包括家庭生活必需品,对各行各业的产品更新换代起到了重要的推动作用。
而此次设计的简易电子钟就是一个很典型的例子电子钟在生活中非常有用,尤其是多路定时功能。
市场上有许多电子钟的专用芯片如:LM8363、LM8365等,但它们功能单一,电路连接复杂。
不便于制作。
用单片机配合计时软件,可制成功能任意的电子钟,而且可以做到硬件简单、成本低廉。
在本文中主要对软件进行阐述。
首先根据硬件的设计方案确定软件方案,然后对硬件作简要介绍后设计出总的流程图,其次根据总的流程图画出各部分的子流程图然后写出程序,再次对调试中所出现的问题进行分析并解决,最后对本次的设计结果进行分析,提出优点和不足之处,然后总结。
第1章绪论1.1电子钟的概述电子钟在生活中非常有用,尤其是多路定时功能。
市场上有许多电子钟的专用芯片如:LM8363、LM8365等,但它们功能单一,电路连接复杂。
不便于制作。
用单片机配合计时软件,可制成功能任意的电子钟,而且可以做到硬件简单、成本低廉。
1.2 数字钟的系统分析单片机的使用主要表现在以下三个方面:1、数字钟的结构简单,并且具备最小单片机系统的基本构成。
2、数字钟电路中使用了单片机系统中最为常用的输入输出设备:按键开关和数码管。
3、数字钟程序可以反映单片机系统中定时器和中断的用法。
单片机系统中的定时和中断是单片机最重要的资源,也是应用最为广泛的功能。
数字钟程序主要就是利用定时器和中断实现计时和显示功能。
按要求,本次的毕业设计要求完成的内容包括:1、时钟精度:±30秒/天。
2、可进行时、分、秒的调整。
3、采用六位数字显示。
4、具有报时功能。
添加的功能:数字钟闹铃功能。
上面所提到的技术指标的意义,主要包含了:1、定时器的使用:本设计中通过实现24小时时钟和秒表,充分说明了单片机定时器使用方法。
利用TA89C2051设计的电子琴方案声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单片机某个口线不断的输出“高”“低”电平,则在该口线上就能产生一定频率的方波,将该方波接上喇叭就能发出一定频率的声音,若再利用程序控制“高”“低”电平的持续时间,就能改变输出波形的频率,从而改变音调。
乐曲中,每一音符对应着确定的频率,表1给出C调时各音符频率。
如果单片机某个口线输出“高”“低”电平的频率和某个音符的频率一样,那么将此口线接上喇叭就可以发出此音符的声音。
本系统就是根据此原理设计,对于AT89C2051单片机来说要产生一定频率的方波大致是先将某口线输出高电平然后延时一段时间再输出低电平,如此循环的输出就会产生一定频率的方波,通过改变延时的时间就可以改变输出方波的频率,而单片机延时主要有两种方法:第一种方法是使用循环语句来实现延时,让单片机循环的执行某条指令然后根据单片机每条指令运行的时间以及循环的次数来计算延时时间。
如下所示:在上面的延时程序中可以看出:DJNZ指令执行时间为2个机器周期,MOV 指令执行时间为1个机器周期,对于单片机的晶振频率为12MHz时机器周期为1 μ s。
因此可以根据这些指令的执行时间和每条指令的循环次.数计算出以上的延时程序延时时间大约为50ms。
但这种方法的计算的延时时间不是很准确并且为达到一定的延时时间先必须进行很复杂的运算。
所以在延时时间要求不严格的时候才采用这种方法。
但对于电子琴电路由于每个音符的频率值要求比较严格,变化范围不能太大,因此产生方波的频率也要求比较严格,不能采用延时程序来产生此方波。
第二种方法是使用单片机的定时/计数器延时。
AT89C2051单片机内部有两个16位的定时/计数器T0和T1,单片机的定时/计数器实际上是个计数装置它既可以对单片机的内部晶振驱动时钟计数也可以对外部输入的脉冲计数,对内部晶振计数时称为定时器,对外部时钟计数时称为计数器。
当对单片机的内部晶振驱动时钟计数时,每个机器周期定时/计数器的计数值就加1,当计数值达到计数最大值时计数完毕并通知单片机的CPU;对外部输入的时钟信号计数时,外部时钟的每个时钟上升沿定时/计数器的计数值就加1,当计数值达到计数最大值时计数完毕并通知单片机的CPU。
1设计目标 02方案论证与对比 02.1单片机的型号选择 02.2数码管显示工作原理 (1)3系统硬件电路的设计 (2)3.1键盘电路设计 (2)3.2主控模块89C2051 (2)3.3总体硬件原理图 (3)4系统软件设计 (4)4.1系统软件概述 (4)1设计目标功能:电子时钟能够显示时、分、秒位时间的功能,还可以进行时、分、秒的校对,而且其片选的灵活性强,并且是以单片机为核心来设计的。
2方案论证与对比2.1单片机的型号选择通过对多种单片机性能的分析以及成本的考虑,最终认为89C2051是最理想的电子时钟开发芯片。
89C2051是由ATMEL公司推出的一种小型单片机。
95年出现在中国市场。
其主要特点为采用Flash存贮器技术,降低了制造成本,其软件、硬件与MCS-51完全兼容,可以很快被中国广大用户接受,其程序的电可擦写特性,使得开发与试验比较容易。
在引脚的驱动能力上面,89C2051具有很强的下拉能力,P1,P3口的下拉能力均可达到20mA.相比之下,89C51/87C51的端口下拉能力每脚最大为15mA。
但是限定9脚电流之和小于71mA.这样,引脚的平均电流只9mA。
89C2051驱动能力的增强,使得它可以直接驱动LED数码管。
89C2051片内含有2k字节的Flash程序存储器,128字节的片内RAM,与80C31内部完全类似。
由于2051内部设计全静态工作,所以允许工作的时钟为0~20MHz,也就是说,允许在低速工作时,不破坏RAM内容。
相比之下,一般8031对最低工作时钟限制为3.5MH z,因为其内部的RAM是动态刷新的。
所以89c051为最好的选择2.2数码管显示工作原理数码管是一种把多个LED显示段集成在一起的显示设备。
有两种类型,一种是共阳型,一种是共阴型。
通常的数码管又分为8段,即8个LED显示段,这是为工程应用方便如设计的,分别为A、B、C、D、E、F、G、DP,其中DP 是小数点位段。
A89C2051 是我公司设计、生产的高性能8 位单片机。
其指令系统与MCS-51 兼容,内部功能、引脚功能、引脚排列以及引脚的电气特性与AT89C2051 兼容,可直接替换AT89C2051以及与其兼容的芯片。
A89C2051 支持独立或关联的两道程序同时运行。
执行第1 道程序的性能是AT89C2051 的1.27 倍,第1 道和第2 道程序同时运行时的处理能力最高可达到AT89C2051 的2.55 倍。
主要性能指标指令兼容MCS-51,引脚兼容AT89C2051。
2KB 内部Flash 程序存储器,20000 次擦写周期。
3.0~5.5V 工作电压。
0Hz~24MHz 工作频率。
两级程序存储器加密机制。
128×8B 内部SRAM。
15 个可编程I/O 端口,20mA 吸入电流,可直接驱动LED。
6 个中断源。
2 个16 位定时器/计数器。
1 个可编程UART。
SPI 编程接口。
1 个内置高精度模拟比较器。
低功耗设计,且支持空闲和掉电模式。
功能和特点A89C2051 片内包含2K 字节程序存储器(Flash),128 字节数据存储器(SRAM)个16,2 1115位定时/计数器,个 5 向量两级中断机制,套两道程序核处理引擎,个I/O 端口驱动器,1 个全双工串行通信端口,1 个精密模拟比较器,振荡器及时钟电路。
A89C2051 的工作频率为0Hz~24MHz,并支持空闲和掉电两种软件可设置的节电工作方式。
空闲方式停止CPU 的工作,但维持SRAM、定时器/计数器、串行通信口及中断机制继续工作;掉电方式停止振荡器工作,切断片内所有时钟,SRAM 中的内容维持不变。
A89C2051 实现了单核双任务并行处理,可以只运行单道程序,也可同时执行关联或非关联的两道程序。
执行第 1 道程序的性能是兼容芯片的 1.27 倍,同时执行两道程序的处理能力最高可达到兼容芯片的 2.55 倍。
引脚说明A89C2051 的引脚排列及其复用功能如图1 所示。
基于89C2051的4位显示万年历时钟2007-05-03 12:24/*Copyright(c) by 彬彬 2007*//*文件名称:基于89C2051的4位显示万年历时钟.C*//*当前版本:1.0*//*作者:彬彬*//*完成日期:2007年3月*//*备注:按键一为功能键,按一下调年,按两下调月,按三下调日,按四下调时,按五下调分*//* 按六下退出,或者在任何时候按键四退出设定状态。
在设定状态键二加一,键三减一*//* 键四退出,正常状态键二显示年,键三显示月日,键四显示星期和秒*//* 星期根据日期计算得出,其已全部调试通过,为了时间精确,要调一个误差值*/#include<reg2051.h>#include<stdio.h>#include<absacc.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar codeled_xs[12]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff,0x fd};uchar data led_data[4];volatile uchar data a; //定义按键一志标volatile uchar data month=4; //定义月并赋初值volatile uchar data date=29; //定义日并赋初值volatile uchar data week; //定义星期并赋初值volatile uchar data hour; //定义时volatile uchar data min; //定义分volatile uchar data sec=0; //定义秒volatile uint data zn=0; //定义中间存储变量volatile uint data year=2007; //定义年并赋初值sbit md=P3^7; //定义秒点sbit k1=P1^0; //定义按键一sbit k2=P1^1; //定义按键二sbit k3=P1^2; //定义按键三sbit k4=P1^3; //定义按键四sbit hs=P1^4; //定义显示片选信号一sbit hg=P1^5; //定义显示片选信号二sbit ms=P1^6; //定义显示片选信号三sbit mg=P1^7; //定义显示片选信号四bit sans; //定义闪烁标志bit b; //定义按键二标志bit c; //定义按键三标志bit w; //定义按键四标志bit x; //定义24小时到标志bit y; //定义日期加一标志keyscan(); //申明键盘扫描函数void display(); //申明显示函数void chushihua(void); //申明初始化函数void delay_10ms(void); //申明10ms延时函数dateadd(); //申明日期加函数datesub(); //申明日期减函数weekjs(); //星期计算函数void main(void){weekjs(); //计算初值星期几x=y=0; //日期加初始化chushihua(); //调初始化函数,初始化定时器,中断do{keyscan(); //键盘扫描display(); //调用显示函数if((!y)==x)dateadd(); //判断是否有24小时,有就调用日期加函数}while(1); //先调用显示键盘}void chushihua(void) //初始化函数{TMOD=0x02; //定时器0以方式2工作,自动重装初值IE=0x82; //开总中断和TO中断TH0=0x06; //T0高位置初值TL0=0x06; //T0低位置初值TR0=1; //启动TO}timer0 () interrupt 1 //T0中断函数{if(zn<4000){zn++;if(zn==2000)sans=!sans;}else {zn=0;sec++;sans=!sans;if(sec==60){sec=0;min++;if(min==60){min=0;hour++;if(hour==24){hour=0;x=!x;}}}}}void display(){uchar k;uint d;uchar e;SCON=0x00;P1=0x0f;if((a!=0)&&sans){led_data[3]=10;led_data[2]=10;led_data[1]=10;led_data[0]=10;}else {switch(a){case 0 :led_data[3]=hour/10;led_data[2]=hour%10;led_data[1]=min/10;led_data[0]=min%10;break;case 1 :led_data[3]=year/1000;d=year%1000;led_data[2]=d/100;e=d%100;led_data[1]=e/10;led_data[0]=e%10;break;case 2 :led_data[3]=month/10;led_data[2]=month%10;led_data[1]=10;led_data[0]=10;break;case 3 :led_data[3]=10;led_data[2]=10;led_data[1]=date/10;if(led_data[1]==0)led_data[1]=10;led_data[0]=date%10;break;case 4 : led_data[3]=hour/10;led_data[2]=hour%10;led_data[1]=10;led_data[0]=10;md=0;break;case 5 : led_data[3]=10;led_data[2]=10;led_data[1]=min/10;led_data[0]=min%10;md=0;break;default: break;}}if(b){led_data[3]=year/1000;d=year%1000;led_data[2]=d/100;e=d%100;led_data[1]=e/10;led_data[0]=e%10;}else if(c){led_data[3]=month/10;led_data[2]=month%10;led_data[1]=date/10;if(led_data[1]==0)led_data[1]=10;led_data[0]=date%10;}else if(w){led_data[3]=week;led_data[2]=11;led_data[1]=sec/10;led_data[0]=sec%10;}if((led_data[3]==0)&&(!w))led_data[3]=10; k=led_data[3];SBUF=led_xs[k];while(!TI){}TI=0;hs=1;for(k=0;k<255;k++){_nop_();_nop_();_nop_();} hs=0;k=led_data[2];SBUF=led_xs[k];while(!TI){}TI=0;hg=1;for(k=0;k<255;k++){_nop_();_nop_();_nop_();} hg=0;k=led_data[1];SBUF=led_xs[k];while(!TI){}TI=0;ms=1;for(k=0;k<255;k++){_nop_();_nop_();_nop_();} ms=0;k=led_data[0];SBUF=led_xs[k];while(!TI){}TI=0;mg=1;for(k=0;k<255;k++){_nop_();_nop_();_nop_();} mg=0;if(!(a||b||c||w)){SBUF=0xff;while(!TI){}TI=0;ms=1;mg=1;md=sans;for(k=0;k<255;k++){_nop_();_nop_();}P1=0x0f;md=1;}}keyscan(){uchar key_value,reread_key;P1=0x0f;key_value=P1&0x0f;if(key_value!=0x0f){delay_10ms();reread_key=P1&0x0f;if(key_value==reread_key){switch(key_value){case 0x0e : if(!(b||c||w)){a++;if(a==6)a=0;} else b=c=w=0;break;case 0x0d : switch(a){case 0 : b=!b;c=w=0;break;case 1 : year++;break;case 2 : if(month<12)month++;else month=1;break; case 3 : dateadd();break;case 4 : hour++;if(hour==24)hour=0;break;case 5 : min++;if(min==60)min=0;break;default: break;}break;case 0x0b : switch(a){case 0 : c=!c;b=w=0;break;case 1 : year--;break;case 2 : month--;if(month==0)month=12;break; case 3 : datesub();break;case 4 : hour--;if(hour==0xff)hour=23;break; case 5 : min--;if(min==0xff)min=59;break; default: break;}break;case 0x07 : if(a==0){w=!w;b=c=0;}else{a=0;b=c=w=0;}break;default : break;}P1=0x0f;reread_key=P1&0x0f;while(key_value==reread_key){reread_key=P1&0x0f;display();}}}}void delay_10ms(void){uchar o,p,q;for(o=5;o>0;o--)for(p=4;p>0;p--)for(q=248;q>0;q--);}datesub(){switch(month){case 1 : date--;if(date==0) date=31;break;case 2 : date--;if(((year%4==0)&&(date==0))==1)date=29; else if(date==0) date=28;break;case 3 : date--;if(date==0) date=31;break;case 4 : date--;if(date==0) date=30;break;case 5 : date--;if(date==0) date=31;break;case 6 : date--;if(date==0) date=30;break;case 7 : date--;if(date==0) date=31;break;case 8 : date--;if(date==0) date=31;break;case 9 : date--;if(date==0) date=30;break;case 10: date--;if(date==0) date=31;break;case 11: date--;if(date==0) date=30;break;case 12: date--;if(date==0) date=31;break;default: break;}weekjs();}weekjs(){uchar c,m,wk,pd,yz;uint y,p;if(month==1){m=13;y=year-1;}else if(month==2){m=14;y=year-1;}else {y=year;m=month;}c=y/100;yz=y%100;wk=2*c+1;p=26*(m+1);pd=p/10;pd=pd+yz+(yz/4)+(c/4)+date;if(pd>wk)week=(pd-wk)%7;else if(pd<wk){week=(7-((wk-pd)%7));if(week==7)week=0;}else week=0;}dateadd(){switch(month){case 1 : date++;if(date==32){date=1;if(a!=3)month++;}break;case 2 :date++;if(((year%4==0)&&(date==30))==1){date=1;if(a!=3)month++;} else if(date==29){date=1;if(a!=3)month++;}break;case 3 : date++;if(date==32){date=1;if(a!=3)month++;}break;case 4 : date++;if(date==31){date=1;if(a!=3)month++;}break;case 5 : date++;if(date==32){date=1;if(a!=3)month++;}break;case 6 : date++;if(date==31){date=1;if(a!=3)month++;}break;case 7 : date++;if(date==32){date=1;if(a!=3)month++;}break;case 8 : date++;if(date==32){date=1;if(a!=3)month++;}break;case 9 : date++;if(date==31){date=1;if(a!=3)month++;}break;case 10: date++;if(date==32){date=1;if(a!=3)month++;}break;case 11: date++;if(date==31){date=1;if(a!=3)month++;}break;case 12: date++;if(date==32){date=1;if(a!=3)month++;}break; default: break;}if(month==13){month=1;year++;}y=x;weekjs();}电路图我没有找到89C2051,我就用C51来代替了。
电子时钟基于AT89c51单片机的设计电子时钟原理图开机显示仿真图: 当按下仿真键时电子时钟开机页面显示第一行显示JD12102Class--16,第二行显示动态TINE:12:00:04。
电子时钟调时间仿真图:当按下K1为1次时,光标直接跳到电子时钟的秒,可以按下K2进行调节。
当按下K1为2次时,光标直接跳到电子时钟的分,可以按下K2进行调节。
当按下K1为3次时,光标直接跳到电子时钟的时,可以按下K2进行调节。
当按下K1为4次时,光标直接跳完,电子时钟可以进行正常计时。
电子时钟闹钟调节仿真:当按下K3为1次时,直接跳到闹钟显示界面00:00:00,按下K2可以对闹钟的秒进行调节。
当按下K3为2次时,可以调到分,按下K2可以对闹钟的分进行调节。
当按下K3为3次时,可以调到时,按下K2可以对闹钟的时进行调节。
当按下K3为4次时,直接跳到计时界面,对闹钟进行到计时,时间到可以发出滴滴声。
#include<reg51.h>#define uchar unsigned char //预定义一下#define uint unsigned intuchar table[]="JD12102Class--21"; //显示内容sbit lcden=P3^4; //寄存器EN片选引脚sbit lcdrs=P3^5; //寄存器RS选择引脚sbit beep=P3^6; //接蜂鸣器extern void key1();extern void key2();extern void key3();uchar num,hour=12,minite,second,ahour,aminite,asecond,a,F_k1,F_k2,F_k3; //定义变量void delay(uint z) //延时{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com){lcdrs=0;P0=com; //送出指令,写指令时序delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar date){lcdrs=1;P0=date; //送出数据,写指令程序delay(5);lcden=1;delay(5);lcden=0;}void write_add(uchar add,uchar date){uchar aa,bb;aa=date/10;bb=date%10;write_com(0x80+add);write_data(0x30+aa);write_data(0x30+bb);}void init() //初始化{lcden=0;write_com(0x38); //设置16*2显示,5*7点阵write_com(0x0c); //开显示,不显示光标write_com(0x06); //地址加1,写入数据是光标右移1位write_com(0x01); //清屏write_com(0x80); //起点为第一行第一个字符开始}void display(uchar h,uchar m,uchar s) //显示设计程序{{write_com(0x80+0x16);}{write_com(0xC0+0x00);write_data('T');write_data('I');write_data('M');write_data('E');write_data(':');write_data(0x30+(h/10));write_data(0x30+(h%10));write_data(':');write_data(0x30+(m/10));write_data(0x30+(m%10));write_data(':');write_data(0x30+(s/10));write_data(0x30+(s%10));write_data(' ');write_data(' ');write_data(' ');} }void main(){init();TMOD=0X01; //设置T0定时方式1 TH0=(65535-50000)/256; //设置初值TL0=(65535-50000)%256;EA=1; //开总中断TR0=1; //启动T0ET0=1;for(num=0;num<16;num++) //依次读出数据{write_data(table[num]);}while(1){key1();key2();key3();if(ahour==hour&&aminite==minite&&second<10) //时间到闹钟响{beep=~beep;}if(F_k1==0&F_k3==0) //K1和K3按下次数为零就直接显示时分秒display(hour,minite,second);}}void timer0() interrupt 1 //T0中断函数{TH0=(65535-50000)/256; //装载计数器初值TL0=(65535-50000)%256;a++;if(a==20){ //进位设置60秒进1分,60分进1时,24时进0时a=0;second++;if(second==60){second=0;minite++;if(minite==60){minite=0;hour++;if(hour==24){hour=0;}}}}}#include <reg51.h> //调时间程序#define uchar unsigned char#define uint unsigned intsbit k1=P1^0; //定义3个变量sbit k2=P1^1;sbit k3=P1^2;extern uchar F_k1,F_k3,second,minite,hour,ahour,aminite,asecond; //预定义变量extern void write_com(uchar com);extern void write_add(uchar add,uchar date);extern void display(uchar h,uchar m,uchar s);void delay_key(int i){while(i--);}void key1(){if(k1==0) //按下K1零次时,直接计时与开机显示{delay_key(100);if(k1==0){TR0=0;while(!k1);F_k1++;if(F_k1==4){F_k1=0;write_com(0x0c);TR0=1;}}}if(F_k1==1|F_k3==1){write_com(0xC0+0x0c);write_com(0x0f);}if(F_k1==2|F_k3==2)write_com(0xC0+0x09);if(F_k1==3|F_k3==3)write_com(0xC0+0x06);}void key2(){if(k2==0){delay_key(100);while(!k2);if(F_k1==1) //按下K1一次时设置闹钟的秒{second++;if(second==60)second=0;write_add(0x4b,second);}if(F_k1==2) //按下K3两次时设置闹钟的分{minite++;if(minite==60)minite=0;write_add(0x48,minite);}if(F_k1==3) // 按下K1三次时设置闹钟的时{hour++;if(hour==24)hour=0;write_add(0x45,hour);}if(F_k3==1) //按下K3一次时设置闹钟的秒{asecond++;if(asecond==60)asecond=0;write_add(0x4b,asecond);}if(F_k3==2) //按下K3两次时设置闹钟的分{aminite++;if(aminite==60)aminite=0;write_add(0x48,aminite);}if(F_k3==3) //按下K3三次时设置闹钟的时{ahour++;if(ahour==24)ahour=0;write_add(0x45,ahour);}}}void key3(){if(k3==0){delay_key(100);if(k3==0){while(!k3);F_k3++;if(F_k3==4) //K3等于四次时直接跳入闹钟显示{F_k3=0;write_com(0x0c);}if(F_k3==1)display(ahour,aminite,asecond);}}}。
引言目前市面上的数字闹钟种类繁多,有可爱型的,有带计算器的,有数码管显示的,有液晶显示的等等,但大多数的闹钟的闹铃声都比较单调、刺耳。
本文介绍的智能闹钟主要是针对改进闹铃声的问题而设计的,具有精度高、闹铃悦耳、成本低廉、调试方便、实用性强等特点。
特别适合初学者习作,也可将其稍作修改形成产品推向市场。
1工作原理本设计的主要思路是利用单片机控制系统构成整个电路的核心,它完成整个系统的信息处理及协调功能。
考虑各功能的实现所需,本次设计主要是选用ATMEL公司的AT89C2051芯片。
AT89C2051是与8051兼容的CHMOS微控制器,其Flash存储器容量为2KB,与CHMOS工艺的8051一样,支持软件选择的空闲和掉电两种节电方式。
在电路中,AT89C2051一是要及时响应键盘引起的中断信号;二是不断循环将时间显示在数码管上;三是对设置的闹钟时间与实时时间比较,如时间相同且闹铃开启,则蜂鸣器将会响起音乐1分钟。
若要停闹,只须按一次相应的闹铃开关键即可。
2硬件电路原理图如图1所示。
2.1复位及晶体振荡电路采用按键复位电路,由一只22uF电解电容、两只10K电阻与一只按键组成。
两只20p电容与一只11.0592MHZ晶体组成振荡电路。
2.2按键电路由P3.0 ̄P3.5连接按钮,用于输入校时、定时信号和停止信号。
S1(P3.7)为手动校时的位选选择按键,可以单独显示分位、时位,且按三次显示正常。
S2(P3.0)为时钟加1键。
S3(P3.1)为时钟减1键。
S4(P3.4)为设定闹钟时的位选按键,可以单独显示分位、时位,且按三次显示正常。
S5(P3.5)为关闭闹铃键。
2.3LED显示及驱动电路此处全部选用红色高亮度共阴LED,89C2051基于89C2051的智能闹钟设计与实现林(金华职业技术学院,浙江金华321017)摘要:本文介绍了用89C2051实现智能闹钟的设计方法。
所设计的智能闹钟具有数显时间、校时、设定闹钟时间、音乐提醒等功能。
一款由89C2051设计的电子钟
一、电路原理
本电路采用89C2051 单片机设计硬件电路如图1 所示。
AT89C2051 具有2k 字节闪速可编程可擦除只读存储器(FLASH EEPROM)和128bytes 的随机存取数据存储器(RAM),可重复擦写10000 次,数据保存时间10 年,工作电压范围:2.7V~6V,工作频率:0~24MHz,15 根可编程I/0 引线,2 个16 位定时器/计数器,一个5 向量两级中断结构,个全双工串行口,一个精密模拟
比较器,两级程序加密,输出口可直接驱动LED 显示,低功耗的闲置和调电
保护工作方式,以及片内振荡器和时钟电路。
本电路的设计,充分利用了单片
机的硬件资源,结构简单。
89C2051 单片机端口设置:Pl 口分别接数码管的段码口(a~h);
P3.0、P3.1、P3.2、P3.3、分别接LED 数码管的位驱动;P3.4 接按键51,P3.5 接按键52;P3,7 驱动蜂鸣器。
C3、R15 构成上电复位电路。
Q1~Q4 为数码管显示驱动三极管。
电路中没有画出电源部分,电路中的电源
可以利用手机万用充电器作为本电路的供电部分。
二、电路功能
本时钟电路采用24 小时制,使用四位LED 数码管显示时问,DO、Dl 两位
数码管显示分钟,D2、D3 两位数码管显示小时。
电路利用D2,D3 两数码管
的小数点位做秒闪烁。
本电路只有两个操作键S1、S2。
S2 键为设置按键,每按一下,实现功能切换。
S1 键为加1 键,仅在设置模式时,S1 键有效,此键具有连击功能。
当按
键时问超过1s 后能实现自动连加。
电路具有设置时间分钟模式,设置时间小时模式,设置闹钟分钟模式,设置。