单片机课程设计电子时钟Word下载.docx
《单片机课程设计电子时钟Word下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计电子时钟Word下载.docx(24页珍藏版)》请在冰豆网上搜索。
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
课程设计总结:
做了两周的课程设计,有很多的心得体会,因为单片机已经很久没复习,刚拿到题目,不知道从哪入手,后来通过对书本的回顾,加深了对单片机的记忆。
有些知识会迁移和联系模电数电。
课堂教学考虑到大多数同学的需求,主要强调“基本”——基本知识、基本理论、基本方法、基本技能。
而这次设计正是为我们提供了一个深入学习、探索的机会,成为课堂教学的有益补充。
此次课程设计让我更深刻地体会到课堂的学习对于真正地操作还相差很远,需要锻炼自学能力才能真正解决实际生活中的问题,而理论的学习只有在实践中才能对知识有更好的认识和理解