电子钟设计多功能.docx
- 文档编号:27537481
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:37
- 大小:1.92MB
电子钟设计多功能.docx
《电子钟设计多功能.docx》由会员分享,可在线阅读,更多相关《电子钟设计多功能.docx(37页珍藏版)》请在冰豆网上搜索。
电子钟设计多功能
摘要
本论文设计一个基于单片机的集电子钟、流水灯多种功能于一体的多功能电子钟。
单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。
本文的主要内容是用AT89C52单片机为核心控制元件,设计一个电子钟。
以单片机作为主控核心,与键盘、开关、扬声器等模块组成核心主控制模块,在主控模块上设有3个按键,四个开关,数码管和扬声器。
本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。
关键词:
AT89C52单片机电子钟流水灯
目录
1.引言3
2.总体设计4
2.1基本原理4
2.2系统总体框图及设计思路5
3.详细设计6
3.1硬件设计6
3.2软件设计.10
3.2.1程序设计思路11
3.2.2程序流程图12
3.2.3程序代码13
4.系统调试及分析26
5.心得体会29
参考文献30
1引言
单片微型计算机是大规模集成电路技术发展的产物,属第四代电子计算机,它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。
它的应用必定导致传统的控制技术从根本上发生变革。
因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。
1957年,Ventura发明了世界上第一个电子表,从而奠定了电子时钟的基础,电子时钟开始迅速发展起来。
现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零。
从而达到计时的功能,是人民日常生活补课缺少的工具。
现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。
2总体设计
2.1基本原理
数字时钟是本设计的最主要的部分。
根据需要,可利用两种方案实现。
方案一:
本方案采用Dallas公司的专用时钟芯片DS12887A。
该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。
为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。
当电网电压不足或突然掉电时,系统自动转换到内部锂电池供电系统。
而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。
方案二:
本方案完全用软件实现数字时钟。
原理为:
在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。
利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将十字节清零。
该方案具有硬件电路简单的特点。
但由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。
而且,由于是软件实现,当单片机不上电,程序不执行时,时钟将不工作。
基于硬件电路的考虑,本设计采用方案二完成数字时钟的功能。
2.1.1数码管显示方案
方案一:
静态显示。
所谓静态显示,就是当显示器显示某一字符时,相应的发光二极管恒定的导通或截止。
该方式每一位都需要一个8位输出口控制。
静态显示时较小的电流能获得较高的亮度,且字符不闪烁。
但当所显示的位数较多时,静态显示所需的I/O口太多,造成了资源的浪费。
方案二:
动态显示。
所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。
利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度足够快,字符才不闪烁。
显示器的亮度既与导通电流有关,也于点亮时间与间隔时间的比例有关。
调整参数可以实现较高稳定度的显示。
动态显示节省了I/O口,降低了能耗。
从节省I/O口和降低能耗出发,本设计采用方案二。
2.2系统总体框图及设计思路
3详细设计
3.1硬件设计
3.1.1电源部分
图3-2
如图3-2所示,从外部引入5.0V的直流电,为单片机、复位电路提供电源。
3.1.2复位电路
图3-3
如图3-3所示,复位电路主要由型号为1N4148的二极管,型号为10UF/16V的电解电容,型号为104的瓷片电容,10K的电阻以及按键S1构成,S1接芯片的相应引脚RST,当开关按下时引脚RST为高电平1,断开时引脚为低电平0。
3.1.3位选部分
图3-5
图3-5为位选电路,三极管的集电极接数码管的公共端,当P2口对应的引脚输出高电平时三极管导通,对应的数码管显示数据。
这样,在同一时刻,6位LED中只有选通的那1位显示出字符,而其他5位则是熄灭的。
同样,在下一时刻,只让下一位的位选线处于选通状态,而其他个位的位选线处于关闭状态,在段码线上输出将要显示字符的段码,则同一时刻,只有选通位显示出相应的字符,而其他各位则是熄灭的。
如此循环下去,就可以使各位显示出将要显示的字符。
虽然这些字符是在不同时刻出现的,而在同一时刻,只有一位显示,其他各位熄灭,但由于LED的余辉和人眼的视觉暂留作用,只要每位显示间隔足够短,则可以造成多位同时亮的假象,达到同时显示的效果。
3.1.4数码管的连接电路
图3-6
图3-6为数码管的引脚图,每位的段码线(a,b,c,d,e,f,g,dp)分别与1个8位的锁存器输出相连,由AT89S51控制组合0-9十个数据,如令其显示1则b,c引脚(即2,3引脚)送高电平,此时数码管显示1。
由于各位的段码线并联,8位I/O口输出段码对各个显示位来说都是相同的。
AT89S51是美国ATMEL公司生产的低功耗,高性能CMOS8位单片机,片内含4Kbytes的可系统编程的Flash只读程序存储器,器件采用ATMEL公司的高密度,非易失性存储技术生产,兼容标准8051指令系统及引脚。
AT89S51提供以下标准功能:
4K字节Flash闪速存储器,128字节内部RAM,32I/O口线,看门狗(WDT),两个数据指针,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
如图3-7所示,AT89S51有40引脚,双列直插(DIP)封装,所用引脚功能如下:
1.VCC——运行时加+4.5V
2.GND——接地
3.XTAL1——振荡器反相放大器及内部时钟发生器的输入端
4.XTAL2——振荡器反相放大器的输出端
5.RST——复位输入,高电平有效,在晶振工作时,在RST引脚上作用2个机器周期以上的高电平,将使单片机复位。
WDT溢出将使该引脚输出高电平,设置SFTAUXR的DISRTO位(地址8EH)可打开或关闭该功能。
DISRTO位缺省为RESET输出高电平打开状态。
6.EA/VPP——片外程序存储器访问允许信号。
欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地),如果EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。
7.P1口,P2口——P1,P2是一组带内部上拉电阻的8位双向I/O口。
运行时通过P1口控制驱动电路的工作,将数据送到数码管,显示相应的段码,为了达到减少功耗或满足端口对最大电流的限制,应加上一限流电阻。
P2.0——P2.5口控制数码管的位选,使六个数码管轮流显示数据,等于1时位选三极管导通,等于0时位选三极管截止。
8.无自锁开关——(S2-P3.7)开关接相应引脚P3.7,当开关按下时,相应引脚为低电平0,断开时引脚为高电平1。
9.PCB图:
流水灯硬件原理图
3.2软件设计.
3.2.1程序设计思路
流水灯部分为由八个灯分时点亮,并由一个开关控制其变换方式。
从硬件原理图中可以看出,如果要让接在P1.0口的LED1亮起来,那么只要把P1.0口的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平;同理,接在P1.1~P1.7口的其他7个LED的点亮和熄灭的方法同LED1。
因此,要实现流水灯功能,我们只要将发光二极管LED1~LED8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。
在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。
单片机的应用系统由硬件和软件组成,上述硬件原理图搭建完成上电之后,我们还不能看到流水灯循环点亮的现象,我们还需要告诉单片机怎么来进行工作,即编写程序控制单片机管脚电平的高低变化,来实现发光二极管的一亮一灭。
软件编程是单片机应用系统中的一个重要的组成部分,是单片机学习的重点和难点。
下面我们以最简单的流水灯控制功能即实现8个LED灯的循环点亮,来介绍实现流水灯控制的几种软件编程方法。
在主程序的开始定义了一组固定单元用来存储计数的分、秒、时的存储单元。
在主程序中,对不同的按键进行扫描,实现秒表,时间调整。
系统总体流程图如图3所示。
3.2.2程序流程图
3.2.3程序代码
1、预定义部分
#include
#definecharunsignedchar
codechartmpled[90]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80,0X81,0X82,
0X84,0X88,0X90,0XA0,0XC0,0XC1,0XC2,0XC4,0XC8,0XD0,
0XE0,0XE1,0XE2,0XE4,0XE8,0XF0,0XF1,0XF2,0XF4,0XF8,
0XF9,0XFA,0XFC,0XFD,0XFE,0XFF,0XFF,0X00,0XFF,0X00,
0X00,0XFF,0XFF,0X00,0X00,0X80,0X40,0X20,0X10,0X08,0X04,
0X02,0X01,0X81,0X41,0X21,0X11,0X09,0X05,0X03,0X83,0X43,0X23,0X13,
0X0B,0X07,0X87,0X47,0X27,0X17,0X0F,0X8F,0X4F,0X2F,0X1F,0X9F,0X5F,0X3F,
0XBF,0X7F,0XFF,0XFF,0X00,0XFF,0X00};//定义数组常量,表示流水灯的变换方式,前面加"code"表示常量在程序代码中存放,不占用RAM。
该数组为发光二极管的输出数据
Codecharli[33]={0X81,0X42,0X24,0X18,0X99,0X5A,0X3C,0XBD,0X7E,0XFF,0XFF,0XE7,0XC3,0X81,0X00,0X18,0X00,0X18,0X24,0X42,0X81,
0X99,0XA5,0XC3,0XDB,0XE7,0XFF,0XFF,0X00,0XFF,0X00};//此数组表示流水灯的另一种变换方式
charcodedis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
charcodescan_con[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
chardatatimedata[6]={0x00,0x00,0x00,0x00,0x00,0x00};
chardatadis[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
chardataconls=0x00,con04s=0x00,con=0X00;
sbitkey0=P1^0;
sbitkey1=P1^1;
sbitkey2=P1^2;
sbitbeen=P1^3;
sbitkey3=P1^4;
sbitkey4=P1^5;
sbitkey5=P1^6;
2、功能控制
通过开关控制闹铃部分
voidwen(void)
{
if(timedata[0]>=5&&timedata[1]<=4&&timedata[2]==0&&timedata[3]==0&&timedata[4]==0&&timedata[5]==0&&key3==0)
been=~been;
else
been=1;
3、数码管显示部分
本段采用的是共阴极LED数码管:
scan()
{
chark;
for(k=0;k<6;k++)
{if(key5==0)
{P0=dis_7[dis[k]];P2=scan_con[k];delay1ms
(1);P2=0xff;}
else
{P0=0xff;
break;
}
}
}
4、按键部分:
、
利用3个按键调节时钟
keyscan()
{
EA=0;
if(key0==0)
{
delay1ms(10);
while(key0==0);
if(dis[con]==10)
{dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7];}
con++;TR0=0;ET0=0;TR1=1;ET1=1;
if(con>=6)
{con=0;TR1=0;ET1=0;TR0=1;ET0=1;}
}
if(con!
=0)
{
if(key1==0)
{
delay1ms(10);
while(key1==0);
timedata[con]++;
if(timedata[con]>=10)
{timedata[con]=0;}
dis[con]=timedata[con];dis[6]=0x0a;
}
}
if(con!
=0)
{
if(key2==0)
{
delay1ms(10);
while(key2==0);
if(timedata[con]==0)
{timedata[con]=0x09;}
else{timedata[con]--;}
dis[con]=timedata[con];dis[6]=0x0a;
}
}
EA=1;
}
5、产生时钟部分:
对晶振周期计数,记满一秒产生中断,计数显示秒位加一
voidtime_intt0(void)interrupt1
{
ET0=0;TR0=0;TH0=0x3C;TL0=0XB0;TR0=1;
conls++;
if(conls==20)
{
conls=0x00;
timedata[0]++;
if(timedata[0]>=10)
{
timedata[0]=0;timedata[1]++;
if(timedata[1]>=6)
{
timedata[1]=0;timedata[2]++;
if(timedata[2]>=10)
{
timedata[2]=0;timedata[3]++;
if(timedata[3]>=6)
{
timedata[3]=0;timedata[4]++;
if(timedata[4]>=10)
{
timedata[4]=0;timedata[5]++;
}
if(timedata[5]==2)
{
if(timedata[4]==4)
{
timedata[4]=0;timedata[5]=0;
}
}
}
}
}
}
dis[0]=timedata[0];dis[1]=timedata[1];dis[2]=timedata[2];
dis[3]=timedata[3];dis[4]=timedata[4];dis[5]=timedata[5];
}
ET0=1;
}
voidtime_intt1(void)interrupt3
{
EA=0;TR1=0;TH1=0x3C;TL1=0xB0;TR1=1;
con04s++;
if(con04s==8)
{
con04s=0x00;
dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7];
}
EA=1;
}
6、流水灯控制部分:
共两个开关,一个切换数码管与流水灯的亮灭,一个用来切换流水灯自身的点亮方式
voidlsd(void)
{charn;
chari;
iii:
for(n=0;n<100;n++)
{if(key5==1)//循环输出40个数据
{if(key4==1)
{P3=~tmpled[n];//"~"这个符号是取反,因发光二极管采用共阳极,所以将数据取反再输出
delay1ms(110);//调用延时子函数,改变参数大小,调整变化速度
}
else
{P3=0XFF;
delay1ms(30);
gotowww;
}
}
else
{P3=0xff;
break;
}
}
www:
for(i=0;i<40;i++)
{if(key5==1)
{if(key4==0)
{P3=~li[i];//"~"这个符号是取反,因发光二极管采用共阳极,所以将数据取反再输出
delay1ms(200);//调用延时子函数,改变参数大小,调整变化速度
}
else
{P3=0XFF;
delay1ms(30);
gotoiii;
}
}
else
{P3=0XFF;
break;
}
}
}
整体程序部分:
#include
#definecharunsignedchar
codechartmpled[90]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80,0X81,0X82,
0X84,0X88,0X90,0XA0,0XC0,0XC1,0XC2,0XC4,0XC8,0XD0,
0XE0,0XE1,0XE2,0XE4,0XE8,0XF0,0XF1,0XF2,0XF4,0XF8,
0XF9,0XFA,0XFC,0XFD,0XFE,0XFF,0XFF,0X00,0XFF,0X00,
0X00,0XFF,0XFF,0X00,0X00,0X80,0X40,0X20,0X10,0X08,0X04,
0X02,0X01,0X81,0X41,0X21,0X11,0X09,0X05,0X03,0X83,0X43,0X23,0X13,
0X0B,0X07,0X87,0X47,0X27,0X17,0X0F,0X8F,0X4F,0X2F,0X1F,0X9F,0X5F,0X3F,
0XBF,0X7F,0XFF,0XFF,0X00,0XFF,0X00};//定义数组常量,前面加"code"表示常量在程序代码中存放,
//不占用RAM。
该数组为发光二极管的输出数据
Codecharli[33]={0X81,0X42,0X24,0X18,0X99,0X5A,0X3C,0XBD,0X7E,0XFF,0XFF,0XE7,0XC3,0X81,0X00,0X18,0X00,0X18,0X24,0X42,0X81,
0X99,0XA5,0XC3,0XDB,0XE7,0XFF,0XFF,0X00,0XFF,0X00};
charcodedis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
charcodescan_con[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
chardatatimedata[6]={0x00,0x00,0x00,0x00,0x00,0x00};
chardatadis[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
chardataconls=0x00,con04s=0x00,con=0X00;
sbitkey0=P1^0;
sbitkey1=P1^1;
sbitkey2=P1^2;
sbitbeen=P1^3;
sbitkey3=P1^4;
sbitkey4=P1^5;
sbitkey5=P1^6;
voidwen(void)
{
if(timedata[0]>=5&&timedata[1]<=4&&timedata[2]==0&&timedata[3]==0&&timedata[4]==0&&timedata[5]==0&&key3==0)
been=~been;
else
been=1;
}
delay1ms(intt)
{
inti,j;
for(i=0;i for(j=0;j<120;j++); } keyscan() { EA=0; if(key0==0) { delay1ms(10); while(key0==0); if(dis[con]==10) {dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7];} con++;TR0=0;ET0=0;TR1=1;ET1=1; if(con>=6) {con=0;TR1=0;ET1=0;TR0=1;ET0=1;} } if(con! =0) { if(key1==0) { delay1ms(10); while(key1==0); timedata[con]++; if(timedata[con]>=10) {timedata[con]=0;} dis[con]=timedata[con];dis[6]=0x0a; } } if(con! =0) { if(key2==0) { delay1ms(10); while(key2==0); if(timedata[con]==0) {timedata[con]=0x09;} else{timedata[con]--;} dis[con]=timedata[con];dis[6]=0x0a;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子钟 设计 多功能