电子钟设计多功能.docx

上传人:b****4 文档编号:27537481 上传时间:2023-07-02 格式:DOCX 页数:37 大小:1.92MB
下载 相关 举报
电子钟设计多功能.docx_第1页
第1页 / 共37页
电子钟设计多功能.docx_第2页
第2页 / 共37页
电子钟设计多功能.docx_第3页
第3页 / 共37页
电子钟设计多功能.docx_第4页
第4页 / 共37页
电子钟设计多功能.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

电子钟设计多功能.docx

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

电子钟设计多功能.docx

电子钟设计多功能

摘要

本论文设计一个基于单片机的集电子钟、流水灯多种功能于一体的多功能电子钟。

单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。

本文的主要内容是用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;

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

当前位置:首页 > 党团工作 > 入党转正申请

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

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