单片机课程设计电子时钟Word下载.docx

上传人:b****5 文档编号:19873652 上传时间:2023-01-11 格式:DOCX 页数:24 大小:201.40KB
下载 相关 举报
单片机课程设计电子时钟Word下载.docx_第1页
第1页 / 共24页
单片机课程设计电子时钟Word下载.docx_第2页
第2页 / 共24页
单片机课程设计电子时钟Word下载.docx_第3页
第3页 / 共24页
单片机课程设计电子时钟Word下载.docx_第4页
第4页 / 共24页
单片机课程设计电子时钟Word下载.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

单片机课程设计电子时钟Word下载.docx

《单片机课程设计电子时钟Word下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计电子时钟Word下载.docx(24页珍藏版)》请在冰豆网上搜索。

单片机课程设计电子时钟Word下载.docx

1.2设计思路

采用C语言程序设计结合硬件电路设计方法,利用Lab6000实验箱来实现数字电子钟的设计。

1)提出方案

根据设计要求,可将本次设计分为3个模块进行:

1)时钟显示模块:

主要用于时间的正确显示。

2)校时模块:

此模块用于时钟的校对,以完成用户更改时间的需求。

3)闹钟模块:

用于实现闹钟的时间设置和定点闹铃的功能。

2)方案论证

时钟显示模块中,利用可编程定时器中断进行秒计时,将时间显示在6位数码管上。

校时模块主要利用键盘上5个键的控制完成各项功能,并在数码管上动态显示改变结果,完成设置后进入时钟显示模块。

闹钟模块的设置过程与校时模块相似,但设置完成进入时间显示模块后则等待闹铃时间,到规定时间后,通过数码管闪烁及蜂鸣器的鸣响来实现定点闹铃提醒功能。

总设计原理框图如下图1.2所示:

图1.2总设计原理框图

1.3实验环境

·

硬件环境:

Lab6000实验箱,PC机。

软件环境:

WAVE应用软件。

第2章详细设计方案

2.1硬件电路设计

硬件电路由MCS51单片机,可编程键盘,六位数码管以及蜂鸣器四部分组成,如图2.1所示。

图2.1硬件电路连线图

MCS51单片机由CPU、振荡器和时序电路、4KB程序存储器、128字节数据存储器、两位16位定时器/计数器、64KB总线扩展控制、可编程并行I/O、可编程全双工串行口组成。

可编程键盘与数码管经过MC1314反向驱动连接,做LED的位选通信号,需将KEY/LED_CS接到响应的地址译码器CS0上,位码输出的地址为8002H,段码输出地址为8004H,键盘行码都会地址为8001H。

音频放大电路则通过P1_0口产生的脉冲产生不同频率的声音。

2.2主程序设计

主程序主要用于系统初始化:

设置定时器初值、工作方式等参数,开启中断进入时钟显示状态,等待定时器中断。

具体流程图如图2.2所示。

图2.2主程序流程图

2.3功能模块的设计与实现

根据上述电子钟的设计原理与方案,软件设计可分为以下几个功能模块实现:

1)定时器模块的设计与实现

定时器模块即定时器中断服务子程序,完成刷新计时缓冲区的功能。

系统使用6MHz的晶振。

由于定时器工作在方式0时最大定时时间为不足1s,程序采用定时器与软件循环相结合的定时方法。

设定时器0工作在方式0,每隔100ms溢出中断一次,则循环中断10次延时时间是1s,以达到秒增加的效果。

程序运行开始后,定时器中断程序与其他子程序并发执行,在完成其他功能的过程中,时钟也正常运行,更大降低时钟误差。

具体流程图如图2.3所示:

图2.3定时器“秒”计时模块

2)时钟显示模块的设计与实现

此模块主要用于时钟的显示,六位数码管以“时时.分分.秒秒”显示当前时间,按键A输出“------”进入校时模式,按键E输出已设定闹钟并进入闹钟模式。

具体流程图如图2.4所示。

图2.4时钟显示模块

3)设置小时模块的设计与实现

设置小时模块中,主要完成按键校时功能,每按一次B键,小时+1,并以“H-时时”在数码管上显示过程。

可按键C进入设置分钟模块,D键完成设置,时钟正常显示,在设置小时模块中,除B、C、D键,其他键均为无效操作。

校时模块和闹钟模块都可以进入设置小时模块中,因此进入模块会自动判别,如果闹钟设置标志位alarm=0,时钟小时变化,若alarm=1,则闹钟设置小时变化,最终调整到需要的数字为止。

若alarm=1,完成设置后,将闹钟开启标志位alarm_on=1,表示闹钟为开启状态,时钟正常显示,反之直接进入时钟显示模块。

运用键盘的过程中,采用固定列逐行扫描的方式,判断键位低电平时,则按键按下,高电平时则为抬起。

在校时过程中,需对按键是否抬起进行判断,用来避免因系统扫描过于频繁,而导致的小时更改不受控制,仅当按键抬起后小时加1。

具体流程图如图2.5所示。

图2.5设置小时模块

4)设置分钟模块的设计与实现

设置分钟模块中,主要完成按键校分功能,每按一次C键,分钟+1,并以“F-分分”在数码管上显示过程。

可按键B进入设置分钟模块,D键完成设置,时钟正常显示,在设置分钟模块中,除B、C、D键,其他键均为无效操作。

设置分钟模块的设计原理与设置小时模块一致,故不在此详细说明。

5)校时模块的设计与实现

校时模块主要为选择性模块,用于用户选择进入设置小时、设置分钟和设置完成功能,由时钟显示模块中按键A进入,显示“------”表示可以进行设置,按键B选择进入设置小时模块,按键C选择进入设置分钟模块,按键D选择完成设置,返回时钟显示模块,时钟正常显示。

具体流程图如图2.6所示。

图2.6校时模块

6)闹钟模块的设计与实现

闹钟模块也为选择性模块,设计原理与校时模块基本相似,用于用户选择进入设置小时、设置分钟和设置完成功能,由时钟显示模块中按键E进入,显示当前闹钟时间表示可以进行设置,按键B选择进入设置小时模块,按键C选择进入设置分钟模块,按键D选择完成设置,开启闹钟,返回时钟显示模块,时钟正常显示。

具体流程图如图2.7所示。

图2.7闹钟模块

7)时钟模块的设计与实现

时钟模块为时钟运行的基本函数,用于对时、分、秒确立正确的进位联系和循环数值,当闹钟时间到时,数码管闪烁字样“AAAAAA”且蜂鸣器鸣响10秒钟,随后时钟正常显示,闹钟开启标志位设置为0,表示闹钟关闭,不为闹钟时间时钟均正常显示。

具体流程图如图2.8所示。

图2.8闹钟模块

第3章结果测试及分析

3.1结果测试

程序开始时间默认为00:

00:

00数码管正常显示,除A、E键均无效,按键A,数码管显示“------”进入校时模块,按键B:

数码管显示“H-01”,按键C:

数码管显示“F-01”,此时除B、C、D键均无效,按键D:

数码管显示“01:

01:

04”,时钟正常显示。

此时按键E,数码管显示“00:

00”进入闹钟模块,按键B:

数码管显示“H-01”,按键C两次:

数码管显示“F-02”,此时除B、C、D键均无效,按键D:

10”,时钟正常显示。

此时按键E,数码管静态显示“01:

02:

00”,按键D:

完成设置,正常显示。

等到数码管显示“01:

00”时,蜂鸣器鸣响,数码管显示“AAAAAA”,持续十秒钟后数码管显示“01:

11”,时钟正常显示,时间第二次到闹钟时间期间无操作则闹钟无效,重新设置完成后即可启动。

调节时间时,按键不抬起数值不发生变化,数码管无显示,抬起后调节数值加一。

3.2结果分析

对于上述的运行结果和操作过程,达到了课程设计任务书中的要求,可通过不同按键完成校时功能,并解决了系统扫描太快而导致按一次键变多个数的问题。

显示过程也与其他功能不产生冲突,在设置过程中时钟正常工作,避免了设置闹钟而导致时间不准的问题。

在按键过程中,特定状态只有可用键产生效果,避免了其他键对结果的干扰。

数码管显示清晰,不会出现闪烁或暗淡的状况。

此外还添加了闹钟功能,可根据用户需求设置,在需要时开启,解决了闹钟每天都必须响的弊端。

当按键E时显示当前设置闹钟时间,防止用户忘记设置闹钟为几点而重新设置。

参考文献

[1]谢自美.电子线路设计·

实验·

测试[M].武汉:

华中理工大学出版社,1992

[2]何立民.单片机应用系统设计[M].北京:

北京航空航天大学出版社,1993

[3]楼然笛.单片机开发[M].北京:

人民邮电出版社,1994

[4]付家才.单片机控制工程实践技术[M].北京:

化学工业出版社,2004

[5]李光才.单片机课程设计实例指导[M].北京:

北京航空航天大学出版社,2004

[6]朱定华.单片机原理及接口技术实验[M].北京:

北方交通大学出版社,2002

[7]刘湘涛,江世明.单片机原理与应用[M].北京:

电子工业出版社,2006

附录A

#include<

reg51.h>

unsignedcharxdata*p=0x8004;

//8位段码地址

unsignedcharxdata*q=0x8002;

//8位位码地址

unsignedcharhour,min,sec,i=0;

unsignedchara_hour=0,a_min=0,a_sec=0,alarm=0,alarm_on=0;

unsignedcharLED[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

unsignedcharLED_point[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};

unsignedcharxdata*l=0x8002;

//键盘列

unsignedcharxdata*h=0x8001;

//键盘行

sbitP1_0=P1^0;

//*****************************函数声明******************************

voidDelay(unsignedcharz);

//延迟程序

voidtimer();

//秒计时器

voidled_time_display();

voidled_hour_display();

//设置小时显示

voidled_min_display();

//设置分钟显示

voidled_alarm_display();

//设置闹钟显示

voidsetting();

voidclock();

voidalarm_clock();

//*****************************秒定时器******************************

voidtimer()interrupt1using1

{

TH0=-(50000/256);

TL0=-(50000%256);

i++;

if(i==10)

{

sec++;

i=0;

}

}

//****************************数码管显示*****************************

voidled_time_display()//正常时间显示

if((*h&

0x0f)!

=0x0f)//有键按下

*l=0xfb;

0x0f)==0x07)//是否为'

A'

键:

进入时钟设置模式

setting();

*l=0xf7;

0x0f)==0x0e)//是否为'

E'

进入闹钟设置模式

alarm=1;

alarm_clock();

*q=0x20;

*p=LED[hour/10];

Delay(6);

*q=0x10;

*p=LED_point[hour%10];

*q=0x08;

*p=LED[min/10];

*q=0x04;

*p=LED_point[min%10];

*q=0x02;

*p=LED[sec/10];

*q=0x01;

*p=LED[sec%10];

//********************************************************************

voidled_alarm_display()

*p=LED[a_hour/10];

*p=LED_point[a_hour%10];

*p=LED[a_min/10];

*p=LED_point[a_min%10];

*p=0x3f;

voidled_hour_display()//设置小时

while

(1)

0x0f)==0x0b)//是否为'

B'

小时+1;

*q=0x00;

while((*h&

=0x0f)

{}

if(alarm==0)

hour++;

if(hour==24)

hour=0;

else

a_hour++;

if(a_hour==24)

a_hour=0;

elseif((*h&

0x0f)==0x0d)//是否为'

C'

进入分钟设置模式

=0x0d)

led_min_display();

D'

完成设置

if(alarm==1)

alarm=0;

alarm_on=1;

{clock();

*p=0x76;

*p=0x40;

*p=LED[hour%10];

*p=LED[a_hour%10];

voidled_min_display()//设置分钟

分钟+1

min++;

if(min==60)

min=0;

a_min++;

if(a_min==60)

a_min=0;

进入小时设置模式

=0x0b)

led_hour_display();

*p=0x71;

*p=LED[min%10];

*p=LED[a_min%10];

//*****************************延时程序*******************************

voidDelay(unsignedcharz)

unsignedchari,j;

for(i=z;

i>

0;

i--)

for(j=150;

j>

j--);

//*****************************键盘程序*******************************

voidsetting()

*q=0x3f;

//输出'

------'

表示进入设置模式

//******************************时钟程序******************************

voidclock()

for(;

hour<

24;

hour++)

min<

60;

min++)

if((a_hour==hour)&

&

(a_min==min)&

alarm_on==1)//闹钟时间到

do{

P1_0=~P1_0;

Delay(3);

*p=0x77;

}while(sec<

11);

alarm_on=0;

led_time_display();

60);

sec=0;

}min=0;

}hour=0;

//******************************闹钟程序******************************

voidalarm_clock()

led_alarm_display();

//*******************************主函数*******************************

voidmain()

TMOD=0x01;

EA=1;

ET0=1;

TR0=1;

clock();

附录B

附录C

BillofMaterialforBACKUP~3.Bom

UsedPartTypeDesignatorFootprint

======================================

10S13

11S12

21KR1R4

12S14

13S16

14S2

15S4

16S6

16MHzY1

17S1

18S3

19S5

410KR3R5R6

R7

120uFC3

122uFC4

130uFC2

174LS32U2DIP-14

174LS138U6DIP-16

174LS245U4DIP-20

274LS374U1U7DIP-20

1100R2

1103pFC1

18031AHU3DIP-40

1AS7

1BS8

1CS18

1DS19

6DPY_7-SEG_DPDS1DS2

DS3DS4

DS5DS6

1ES17

1EXECS21

1FS15

1HERES20

1LASTS22

1MODES9

1MONS11

1MOVES10

1NEXTS23

1NOTU5

1NPNQ1

1SPEAKERLS1

课程设计总结:

做了两周的课程设计,有很多的心得体会,因为单片机已经很久没复习,刚拿到题目,不知道从哪入手,后来通过对书本的回顾,加深了对单片机的记忆。

有些知识会迁移和联系模电数电。

课堂教学考虑到大多数同学的需求,主要强调“基本”——基本知识、基本理论、基本方法、基本技能。

而这次设计正是为我们提供了一个深入学习、探索的机会,成为课堂教学的有益补充。

此次课程设计让我更深刻地体会到课堂的学习对于真正地操作还相差很远,需要锻炼自学能力才能真正解决实际生活中的问题,而理论的学习只有在实践中才能对知识有更好的认识和理解

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

当前位置:首页 > 求职职场 > 社交礼仪

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

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