数字钟设计报告 精品.docx

上传人:b****5 文档编号:28113721 上传时间:2023-07-08 格式:DOCX 页数:13 大小:248.28KB
下载 相关 举报
数字钟设计报告 精品.docx_第1页
第1页 / 共13页
数字钟设计报告 精品.docx_第2页
第2页 / 共13页
数字钟设计报告 精品.docx_第3页
第3页 / 共13页
数字钟设计报告 精品.docx_第4页
第4页 / 共13页
数字钟设计报告 精品.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

数字钟设计报告 精品.docx

《数字钟设计报告 精品.docx》由会员分享,可在线阅读,更多相关《数字钟设计报告 精品.docx(13页珍藏版)》请在冰豆网上搜索。

数字钟设计报告 精品.docx

数字钟设计报告精品

一、设计目的

本次综合应用课程设计的目的是训练我们把理论运用于实际的能力,加深对模拟电路、数字电路、微机原理、单片机(嵌入式、DSP、PLC)等相关课程理论知识的分析理解。

通过实践把原理分析与工程设计结合,掌握软硬件系统设计的基本方法和一般规则,提高综合应用能力,培养我们的创新思维和实践能力。

因此我们做的时钟只是一个简单的时钟设计,是用单片机AT89C52完成主要功能的简单设计,有最一般的时钟的功能。

此次课程设计,有助于我们对电子线路知识的整合和电子线路设计能力的训练,还有课程设计完成后的答辩的准备,为后继课程的学习和毕业设计打下一定的基础。

二、设计内容与方案

(1)本次设计时钟电路,最初的设想方案是用AT89C52单片机芯片控制外围电路,用6位共阴数码管显示时间,用上拉电阻来驱动数码管的显示,用喇叭进行整点报时,单片机编程用汇编语言。

但由于在编程过程中,汇编语言指令多、编程难,因此改为用C语言编程。

在用C语言编程来实现用按键转换12小时制和24小时制的时候遇到了困难,因此又把按键改为开关。

另外学校只有4位和2位及1位的共阳数码管,因此又把6位共阴数码管换掉,同时接受老师的建议,把数码管的驱动电路改为数码管的段选用74LS245来驱动。

最后在领元件的时候老师说单片机也不能驱动喇叭,把喇叭换成蜂鸣器。

(2)仿真时的设计方案是:

使用AT89C52单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂;使用键盘键上的按键来调整时钟的时、分以及键盘上的开关实现12小时制和24小时制的转换;用一蜂鸣器来进行整点报时;同时使用C语言编程,使得编程变得更容易;用一个4位和一个2位共阳数码管来显示时间,且数码管的段选用74LS245来驱动,位选用74LS04驱动。

这样通过四个模块:

键盘、单片机芯片、蜂鸣器、数码管显示即可满足设计要求。

硬件选择

(1)单片机的选择 选用AT89c52单片机,并配备12MHz晶振,复位电路采用上电复位。

(2)显示电路选择 采用软件译码动态显示,P3.0-P3.3作数码管的位选口。

P1.0-P1.6作数码管的段选口。

考虑直接用单片机I/O口作位选时驱动功率不够,

(3)电源选择 采用直流5V电源供电。

(4)选择器的选择74ls04。

(5)CTC89c52单片机是一种低功耗,高性能的片内含有4KB可编程/擦除只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的8位COMS微控制器,使用高密度,非易失存储技术制造,并且与AT89C52引脚和指令系统完全兼容。

芯片上的FLASH允许在线编程或采用通用的非易失存储编程器对存储器重复编程。

三、基本功能描述

(1)、要求准确显示“时”、“分”、“秒”,24小时制;

(2)、具有整点报时功能,在每小时59分51秒、53秒、55秒、57秒发出低音,59秒整发出高音;

(3)、系统工作符合一般时钟要求。

整个电路的工作流程为:

单片机内部计数器持续计数,得到的数据通过程序的控制转化成时间,并通过对输出端口输出不同的高低电平来控制数码管和蜂鸣器的工作。

与此同时,单片机还在不停地扫描连接键盘的输入端口,通过得到输入端口的不同电平来判断键盘的工作情况,再通过程序的控制来影响数码管和蜂鸣器的工作

四、设计原理示意图

此电路包括以下四个部分:

单片机,键盘,报时电路及显示电路。

设计原理示意图

五、仿真电路连接图

设计的电路主要由四模块构成:

单片机控制电路,显示电路、报时电路以及调时电路。

该电路的单片机复位采用上电复位,即给电路一通电,电路就从程序最初设置的状态开始工作。

为了方便检测报时,我们把时钟的初始值设为00点59分48秒,当电路一通电,数码管就显示此值,三秒后蜂鸣器开始发音报时,并按59分51秒、53秒、55秒、57秒发出低音,59秒整发出高音的规律发音。

6、各芯片器件管脚图

(1)4位共阳数码管引脚图

【附】LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。

共阴和共阳极数码管,它们的发光原理是一样的,只是它们的电源极性不同而已。

 

(2)2位共阳数码管引脚图

 

(3)74LS04管脚图

(4)74LS245管脚

 

(5)主程序流程图

(6)AT89C52单片机

AT89c52单片机采用40条引脚双列直插式器件,引脚除5V(

40脚)和电源地(

20脚)外,其功能分为时钟电路、控制信号、输入/输出三大部分,逻辑框图及引脚图分别如图2.4(a)(b)所示

(a)(b)

区别:

AT89C52单片机的内部硬件结构中除了程序存储器由FLASH取代了87C51单片机的EPROM外,其余部分完全相同

7、总程序

#include

sbitBUZ=P3^3;

sbitHOURADD=P3^0;//小时加1

sbitMITADD=P3^1;//分钟加1

sbitchange=P3^2;//进制转换

unsignedinttmcnt;//定时器计数

unsignedinth=0,m=59,s=50;//h为小时,m为分钟,s为秒钟

unsignedcharcodeseg7[]=

{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管0-9码值

unsignedcharcodedisp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位扫描

unsignedchardatadisdata[6];

voidDelayms(intms)//延时函数

{

while(ms)

{

unsignedchari;

for(i=0;i<120;i++);

ms--;

}

}

voiddisplay()//扫描显示

{unsignedchari;

disdata[0]=h/10;//数据处理,小时高位

disdata[1]=h%10;//小时低位

disdata[2]=m/10;//分钟高位

disdata[3]=m%10;//分钟低位

disdata[4]=s/10;//秒钟高位

disdata[5]=s%10;//秒钟低位

for(i=0;i<6;i++)//循环显示

{

P1=0xff;

P1=seg7[disdata[i]];

P2=disp[i];

Delayms

(2);//显示延时

}

}

 

voidtime0(void)interrupt1using0//时间计数函数

{

TH0=0xfc;//计数器高八位赋初值

TL0=0x18;//计数器低八位赋初值

if(++tmcnt==1000)//计数1000次1秒

{

tmcnt=0;

s++;

if(s==60)

{

s=0;

m++;

if(m==60)

{

m=0;

h++;

if(change==0&&h==12)//按下进制转换键为12进制

{h=0;}

if(change==1&&h==24)//未按下进制转换键为24进制

{h=0;}

}

}

}

}

voidvoice()//发声函数

{

if((m==59)&&(s==51))//判断时间符合低音条件

{

BUZ=~BUZ;

Delayms(80);

}

if((m==59)&&(s==53))//判断时间符合低音条件

{

BUZ=~BUZ;

Delayms(80);

}

if((m==59)&&(s==55))//判断时间符合低音条件

{

BUZ=~BUZ;

Delayms(80);

}

if((m==59)&&(s==57))//判断时间符合低音条件

{

BUZ=~BUZ;

Delayms(80);

}

if((m==59)&&(s==59))//判断时间符合高音条件

{

BUZ=~BUZ;

Delayms(55);

}

}

voidkeyscan()//键盘扫描

{

if(change==0)//判断是否按下进制转换键,

{

Delayms(10);

if(change==0&&h>=12)//若h>12,则执行h-12,转换成12进制

{h=h-12;}

}

if(HOURADD==0)//判断是否按下小时加1键

{

Delayms(10);

if(HOURADD==0)

{

while(HOURADD==0);

h++;

if(h==24)

{h=0;}

}

}

if(MITADD==0)//判断是否按下分钟加1键

{

Delayms(10);

if(MITADD==0)

{

while(MITADD==0);

m++;

if(m==60)

{m=0;}

}

}

}

main()

{unsignedinttime();

TMOD=0x01;//软件启动计数器、工作方式为方式1

EA=1;

ET0=1;//允许定时计数器中断

TR0=1;//启动计数

while

(1)

{keyscan();//扫描键盘

display();//显示

voice();//发声

}

}

八、仿真蜂鸣器发音的调试

打算用喇叭发音,因为驱动带不起问题,就换成了蜂鸣器。

在用蜂鸣器进行仿真调试时,我们发现蜂鸣器不发音。

把蜂鸣器的高位端电压改为5v,发音频率改为14,蜂鸣器始终不发音。

我们通过网上查阅资料,最后把蜂鸣器自身的频率调大,更换为6568三极管,蜂鸣器终于响了。

在交换着两个元件时对其驱动电压、自身频率、发音频率均需作出改变。

9、硬件调试

我们给硬件通电,数码管显示全8,蜂鸣器一直发音,及蜂鸣器和数码管的每一位每一段都一直导通,而且数码管的显示很微弱。

仔细检查我们的硬件电路,首先检查出来的错误是驱动芯片74LS245的接地端未接地,将其接地以后再通电,数码管仍然显示全8,蜂鸣器仍然一直发音,但数码管的显示要亮一些了。

数码管和蜂鸣器一直导通的原因,我们怀疑是震荡电路没起作用或者单片机是坏的。

我们先检测震荡电路的情况,用示波器测出来的信号杂乱无章,于是我们又检测震荡电路的连接情况,发现震荡电路未接地。

将其接地后再测试,数码管仍然显示全8,蜂鸣器仍然一直发音,但有高低电平的震荡信号。

找同学帮我们检查,他指出我们段选用的P0端口没有接上拉电阻,单片机只有P1和P2端口自带上拉电阻,P0口必须外接上拉电阻。

我们把数码管的段选改为P1口,测试出仍然是相同的情况。

在多次改正错误仍无果之后,我们全面仔细地检查了我们的硬件电路,并没有其他错误。

又写了一个直接给P1口赋上高低电平的简单程序,用万用表测出P1口全为高电平,又测试了其他端口,也是全高。

我们认真分析了出现这种情况的原因:

首先我们的显示模块和发音电路没有错,因为数码管有显示,蜂鸣器有发音;其次我们的震荡电路没有错,因为测试出有震荡信号;程序没有错,因为我们仿真成功了的;最后得出单片机是坏的这一结论。

最后我们换了一块单片机再测试,终于成功了

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

当前位置:首页 > 人文社科 > 法律资料

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

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