定时闹钟单片机课程设计.docx

上传人:b****7 文档编号:15946683 上传时间:2023-07-09 格式:DOCX 页数:29 大小:281.28KB
下载 相关 举报
定时闹钟单片机课程设计.docx_第1页
第1页 / 共29页
定时闹钟单片机课程设计.docx_第2页
第2页 / 共29页
定时闹钟单片机课程设计.docx_第3页
第3页 / 共29页
定时闹钟单片机课程设计.docx_第4页
第4页 / 共29页
定时闹钟单片机课程设计.docx_第5页
第5页 / 共29页
定时闹钟单片机课程设计.docx_第6页
第6页 / 共29页
定时闹钟单片机课程设计.docx_第7页
第7页 / 共29页
定时闹钟单片机课程设计.docx_第8页
第8页 / 共29页
定时闹钟单片机课程设计.docx_第9页
第9页 / 共29页
定时闹钟单片机课程设计.docx_第10页
第10页 / 共29页
定时闹钟单片机课程设计.docx_第11页
第11页 / 共29页
定时闹钟单片机课程设计.docx_第12页
第12页 / 共29页
定时闹钟单片机课程设计.docx_第13页
第13页 / 共29页
定时闹钟单片机课程设计.docx_第14页
第14页 / 共29页
定时闹钟单片机课程设计.docx_第15页
第15页 / 共29页
定时闹钟单片机课程设计.docx_第16页
第16页 / 共29页
定时闹钟单片机课程设计.docx_第17页
第17页 / 共29页
定时闹钟单片机课程设计.docx_第18页
第18页 / 共29页
定时闹钟单片机课程设计.docx_第19页
第19页 / 共29页
定时闹钟单片机课程设计.docx_第20页
第20页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

定时闹钟单片机课程设计.docx

《定时闹钟单片机课程设计.docx》由会员分享,可在线阅读,更多相关《定时闹钟单片机课程设计.docx(29页珍藏版)》请在冰点文库上搜索。

定时闹钟单片机课程设计.docx

定时闹钟单片机课程设计

定时闹钟—单片机课程设计

 

课程设计

 

设计题目:

基于单片机的定时闹钟

院系:

电气工程

专业:

电子信息工程

年级:

姓名:

指导教师:

年月日

 

课程设计任务书

专业电子信息工程姓名学号

开题日期:

2014年月日完成日期:

2014年12月日

题目基于单片机的定时闹钟

一、设计的目的

本次电子课程设计是一个基于单片机的定时闹钟,其主要的目的是为了学习和巩固单片机知识,使对已学过的基础知识能有更深入的理解,对所学的知识能够达到学以致用,此外还对汇编语言进行复习。

总的来说,课程设计是培养我们综合运用所学知识,发现、提出、分析和解决实际问题的能力。

综合以上因素,结合自身的实际情况我选择了在生活中应用广泛,同时对人们的生活,学习,工作占重要地位的闹钟。

二、设计的内容及要求

本课程设计以AT89C51芯片为核心,辅以必要的外围电路,设计了一个结构简单,功能齐全的电子时钟。

硬件方面,基于单片机结合时钟电路,按键电路等设计电路,其中设置了四个按键实现了对时间的调整,这四个按键有两种功能,这也是设计过程中的一个难点。

软件方面采用C语言编程。

整个电子钟系统能完成时间的显示、调时、校时和三组定时闹钟的功能。

然后,使用Keil单片机模拟调试软件,测试程序的可行性并用Proteus进行仿真,最后得到仿真结果,验证是否达到设计的要求和效果。

三、指导教师评语

四、成绩

指导教师(签章)

年月日

一.设计方案及介绍

1.设计方案:

本课程设计的定时闹钟是以单片机以及外围接口电路为核心,再加上相关的外围电路,结合汇编语言设计的程序来实现的,有功能多,精确度高等特点,实现起来也比较简单。

2.设计介绍:

(1)时钟是将小时、分钟、秒钟显示于人的肉眼的计时装置,此次课程设计的LCD电子定时闹钟是基于单片机的数字电路实现对时、分、秒的数字显示的数字计时装置,它的计时周期为比较习惯的24小时制,此外应有校时功能和一些显示日期、闹钟等附加功能。

(2)定时闹钟采用AT89C51芯片,用C语言进行编程,在电路中通过对按键K1,K2,K3,K4进行相关设置,最后所设置的定时时间到是通过喇叭发出提示。

(3)字符型LCD(16*2)显示器显示格式“时时:

分分”

由LED闪动来做为秒计数表示,程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00:

00”,设置按键K1-K4动作如下:

K1——设置现在的时间;

K2——显示闹钟设置的时间;

K3——设置闹铃的时间;

K4——闹铃ON/OFF的状态设置,设置ON时连续三次发出“哗”的一声,off置为“哗”的一声。

设置当前时间或闹铃时间如下:

K1——时的调整;

K2——分的调整;

K3——设置完成;

K4---闹铃时间到时,发出一阵声响,按下本键可停止声响。

 

 

 

二.硬件设计

1.AT89C51单片机简介:

电子课程设计电子课程设计电子

AT89C51芯片采用了高性能的处理器结构,指令执行时间只需2到4个时钟周期,集成了许多系统级的功能,这样可大大减少元件的数目和电路板面积并降低系统的成本。

AT89C51芯片内部主要有以下部件:

8031CPU、振荡电路、总线控制部件、中断控制部件、片内Flash存储器、并行I/O接口、定时器和串行I/O接口。

电子课程设计电子课程设计电子

电子课程设计电子课程设计电子

电子课程设计电子课程设计电子

电子课程设计电子课程设计电子

电子课程设计电子课程设计电子

电子课程设计电子课程设计电子

电子课程设计电子课程设计电子

电子课程设计电子课程设计电子

电子课程设计电子课程设计电子

电子课程设计电子课程设计电子

电子课程设计电子课程设计电子

电子课程设计电子课程设计电子

电子课程设计电子课程设计电子

电子课程设计电子课程设计电子

电子课程设计电子课程设计电子

电子课程设计电子课程设计电子

2.时钟电路:

结合时钟方式内部方式和外部方式的特点进行分析。

内部方式就是在单片机的XTAL1和XTAL2两引脚外接晶振,就构成了自激振荡器在单片机内部产生时钟脉冲信号,外部方式是把外部已有的时钟信号引入到单片机内部。

最后选择内部方式,即在单片机的XTAL1和XTAL2两引脚外接晶振,就构成了自激振荡器在单片机内部产生时钟脉冲信号,如图所示:

电子课程设计电子课程设计电子喇叭:

由P2.4控制,使得它能在定时

电子课程设计电子课程设计电子喇叭:

由P2.4控制,使得它能在定时

电子课程设计电子课程设计电子喇叭:

由P2.4控制,使得它能在定时

电子课程设计电子课程设计电子喇叭:

由P2.4控制,使得它能在定时

电子课程设计电子课程设计电子喇叭:

由P2.4控制,使得它能在定时

电子课程设计电子课程设计电子喇叭:

由P2.4控制,使得它能在定时

电子课程设计电子课程设计电子喇叭:

由P2.4控制,使得它能在定时

电子课程设计电子课程设计电子

电子课程设计电子课程设计电子

电子课程设计电子课程设计电子

电子课程设计电子课程设计电子

电子课程设计电子课程设计电子

            时钟电路

3.按键电路

(1)

独立按键:

(2)按键电路:

 

4.LCD显示

考虑到LCD比LED效果更直观,且经久耐用,性能指标高,故采用LCD显示

5.喇叭:

由P2.4控制,使得它能在定时时间发出提示。

喇叭:

由P2.4控制,使得它能在定时

喇叭:

由P2.4控制,使得它能在定时

喇叭:

由P2.4控制,使得它能在定时

喇叭:

由P2.4控制,使得它能在定时

喇叭:

由P2.4控制,使得它能在定时

喇叭:

由P2.4控制,使得它能在定时

 

6.电路图

基于以上分析整理已经各部分的有机组成,最后完成电路图,硬件部分大致完成。

如下所示:

注:

K1-设置现在时间和调整小时

K2-设置现在时间分钟和闹铃时间分钟

K3-设置闹铃时间和设置现在时间完成

K4-闹铃响后切断电源

三.软件

1.软件设计思路:

设计的程序最终的目的是要实现时间显示,定时的显示,开关实现校时以及闹钟的功能。

根据要实现的功能,又要避免了一些函数的不必要的重复,使程序变得单间易懂,软件设计程序部分主要采用程序结构的模块化来优化设计。

在执行程序时,主程序要须通过调用子函数就可完成相应的功能。

其中主芯片:

P0.0-P0.7输出数据到LCD数据总线;

P1.0-P1.3输入外部控制信号;

P2.0-P2.2输出LCD控制信号;

P2.3输出LED-Right灯显示秒;

P2.4输出声音信号;

XTAL1、XTAL2输出内部时钟电路(即晶振电路)。

2.

主体思路流程图:

 

3.电子闹钟的主程序流程图,如图所示:

 

4.程序初始化

在系统开始上电时,需要首先初始化液晶:

voidTimeInit()

{

write_com(0x01);//初始化1602液晶

write_com(0x80);//设置现实初始坐标

for(num=0;num<9;num++)//显示年月日

{

write_date(table[num]);

delay(5);

}

write_com(0x80+0x40+6);//写出时间显示部分的两个冒号

write_date(':

');

delay(5);

write_com(0x80+0x40+9);

write_date(':

');

delay(5);

write_sfm(4,shi);//分别送去液晶显示

write_com(0x80+0x40+4);

write_sfm(7,fen);

write_com(0x80+0x40+7);

write_sfm(10,miao);

write_com(0x80+0x40+10)

5.实现闹钟

1)实现闹钟涉及到两方面:

a)闹钟时间的设定;

b)是否响应闹钟判别以及相应的处理。

2)关键:

判别什么时候进行闹铃。

3)闹钟判别的条件:

当时十/个位、分十/个位中任意一位发生改变(即进位)时,就必须进行闹铃判别。

4)判别处理的流程图:

 

四.仿真结果

1.程序清单

#include

#defineuintunsignedint

#defineucharunsignedchar

uintmiao,fen,fen1,shi,shi1,flag1,flag2,flag3,aa,K1num,K2num,K3num,K4num,N;//K1num-K1按键被按下的标记变量,K2num-K2按键被按下的标记变量,K3num=0-K3按键被按下的标记变量

ucharcodetable[]="TIMINGCLOCK";//定义初始上电时液晶默认显示状态

sbitK1=P1^0;//四个按键

sbitK2=P1^1;

sbitK3=P1^2;

sbitK4=P1^3;

sbitrs=P2^0;

sbitlcden=P2^2;

sbitled=P2^3;//发光二极管控制端

sbitbeep=P2^4;//蜂鸣器控制端

sbitrelay=P2^5;//继电器控制端

voiddelay(uintz)//延时函数

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

voidwrite_com(ucharcom)//液晶写命令函数

{

rs=0;

lcden=0;

P0=com;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

voidwrite_date(uchardate)//液晶写数据函数

{

rs=1;

lcden=0;

P0=date;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

voidwrite_sfm(ucharadd,uchardate)//液晶写时分秒函数

{

ucharshi,ge;

shi=date/10;

ge=date%10;

write_com(0x80+0x40+add);

write_date(0x30+shi);

write_date(0x30+ge);

}

voidinit()//初始化函数

{

uintnum;//写液晶的循环控制变量

aa=0;//中断次数标志

K1num=0;//K1按键被按下的标记变量

K2num=0;//K2按键被按下的标记变量

K3num=0;//K3按键被按下的标记变量

K4num=0;

flag1=1;//控制lcd屏刷新的变量

flag2=1;//控制闹钟响闹和继电器开启关闭的标记

flag3=1;//控制闹钟响起时,按下K4停止闹钟响闹的标记

led=1;//发光二极管初始化

relay=0;//继电器初始化

N=100;//系统启动时,闹钟时间到发出的声音为连续三次发出“哗”的一声

miao=0;//系统初始化时间

fen=0;

shi=0;

fen1=1;//初始化闹钟的时间

shi1=0;

beep=0;//蜂鸣器初始化

lcden=0;//液晶使能端初始化

write_com(0x38);//1602液晶初始化,设置16*2显示。

5*7点阵,8位数据接口

write_com(0x0c);//设置开显示,不显示光标

write_com(0x06);//写一个字符后地址指针自动加1

write_com(0x01);//显示清0,数据指针清0

write_com(0x80);//将数据指针定位到第一行,第一个字处

for(num=0;num<15;num++)//显示闹钟标示:

TIMINGCLOCK

{

write_date(table[num]);

delay(10);

}

write_com(0x80+0x40+7);//写出时间显示部分的两个冒号

write_date(':

');

write_sfm(8,fen);//送去液晶显示秒,分,时

write_sfm(5,shi);

TMOD=0x01;//设置定时器0为工作方式1

TH0=(65536-50000)/256;//定时器装初值

TL0=(65536-50000)%256;

EA=1;//开总中断

ET0=1;//开定时器0中断

TR0=1;//启动定时器0

}

voidkeyscan()//键盘扫描函数

{

if(K1==0&&K3num==0)//判断K1按下,按下前没有按下K3键,则开始修改时间

{

delay(5);

if(K1==0&&K1num==0)

{

K1num=1;

while(!

K1)//判断是否松开按键,后同

if(K1num==1)

{

TR0=0;//关闭计数器0

write_com(0x80+0x40+9);//第一次按下光标定位到分钟位置

write_com(0x0f);//光标开始闪烁

}

}

}

 

if(K3==0&&K3num==0&&K1num==0)//判断K3首次被按下,则设置闹钟

{

delay(5);//延时消抖,后同

if(K3==0)

{

flag1=0;

write_com(0x80+0x40+9);//第一次按下光标定位到分钟位置

while(!

K3);

K3num=1;

write_sfm(8,fen1);//送去液晶显示定时的分,时

write_sfm(5,shi1);

write_com(0x0f);//光标开始闪烁

write_com(0x80+0x40+9);//显示位置回到调节处

}

}

if(K1==0&&K1num==1)//判断K1按下,修改系统时间的小时

{

delay(5);

if(K1==0)

{

write_com(0x80+0x40+6);//光标定位到小时位置

K1num=1;//置K1num=1

while(!

K1);

shi++;//则调整时加1

if(shi==24)shi=0;//若满24后将清零

write_sfm(5,shi);//每调节一次送液晶显示一下

write_com(0x80+0x40+6);//显示位置重新回到调节处

}

}

if(K2==0&&K1num==1)//判K2按下,修改系统时间的分钟

{

delay(5);

if(K2==0)

{

write_com(0x80+0x40+9);//光标定位到分钟位置

K1num=1;

while(!

K2);

fen++;//则调整分加1

if(fen==60)fen=0;//若满60后将清零

write_sfm(8,fen);//每调节一次送液晶显示一下

write_com(0x80+0x40+9);//显示位置重新回到调节处

}

}

if(K1num==1||K3num==1)//当设置时间或闹钟时,K3被按下设置完成。

{

if(K3==0)//判断K3按下

{

delay(5);

if(K3==0)

{

K1num=0;

K3num=0;

while(!

K3);

write_com(0x0c);//取消光标闪

TR0=1;//启动定时器使时钟开始走

flag1=1;//flag=1.则修改系统时间时液晶显示的系统时间值,flag=0,则为修改闹钟时间时,屏幕显示的是修改闹钟时间的值

write_sfm(8,fen);//送去液晶显示分,时

write_sfm(5,shi);

}

}

}

if(K2==0&&K1num==0&&K3num==0)//K2被按下时显示定时时间

{

delay(5);

if(K2==0)

{

write_sfm(8,fen1);//送去液晶显示定时的分,时

write_sfm(5,shi1);

while(!

K2);

write_sfm(8,fen);//K2松开显示当前时间

write_sfm(5,shi);

}

}

 

if(K1==0&&K3num==1)//修改小时,判断K1键按下,K3num=1,表示K3按键按下,则此时修改的是闹钟时间的小时

{

delay(5);

if(K1==0)

{

write_com(0x80+0x40+6);//光标定位到小时位置

K3num=1;

while(!

K1);

shi1++;//则调整定时的时加1

if(shi1==24)//若满24后将清零

shi1=0;

write_sfm(5,shi1);//每调节一次送液晶显示一下

write_com(0x80+0x40+6);//显示位置重新回到调节处

}

}

if(K2==0&&K3num==1)//卸螷2按下,修改闹钟时间的分钟

{

delay(5);

if(K2==0)

{

write_com(0x80+0x40+9);//光标定位到分钟位置

K3num=1;

while(!

K2);

fen1++;//则调整分加1

if(fen1==60)//若满60后将清零

fen1=0;

write_sfm(8,fen1);//每调节一次送液晶显示一下

write_com(0x80+0x40+9);//显示位置重新回到调节处

}

}

if(K4==0&&flag3==0)//当闹钟响起时,按下K4停止响闹,当闹钟响起时候flag3置为1

{

delay(5);

if(K4==0)

{

flag2=0;

flag3=1;//此处需置flag3为1,否则闹钟没有响起的时候按下K4键,程序会执行此句

}

}

if(K4==0&&flag3==1&&K4num==0)//K4按下设置闹钟的状态为ON或OFF,flag3=1,表示闹钟此时没响起。

K4num==0,表示此时为ON状态。

{

delay(5);

{

K4num=1;

}

}

if(K4==0&&flag3==1&&K4num==1)//K4按下设置闹钟的状态为ON或OFF,flag3=1,表示闹钟此时没响起。

K4num==1,表示此时为OFF状态。

{

delay(5);

{

K4num=0;

}

}

}

voidclock()//闹钟函数K4—闹铃ON/OFF的状态设置,设置为ON时连续三次发出“哗”的一声,设置为OFF发出“哗”的一?

{

if((fen==fen1)&&(shi==shi1)&&(flag2==1)&&(K4num==0))//闹钟的响闹控制

{

beep=1;//此时闹钟响起,连续三次发出哗的一声

relay=1;//闹钟时间到,则继电器启动

flag3=0;//置flag3=0,表示此时闹钟响起,按下K4键执行停止闹钟响闹语句

delay(100);//这些语句是为了使闹钟响起时,发出连续三次哗的声音

beep=0;

delay(100);

beep=1;

delay(100);

beep=0;

delay(100);

beep=1;

delay(100);

beep=0;

delay(300);

}

elseif((fen==fen1)&&(shi==shi1)&&(flag2==1)&&(K4num==1))//闹钟的响闹控制

{

beep=1;//此时闹钟响起,发出哗的一声

relay=1;//闹钟时间到,则继电器启动

flag3=0;//置flag3=0,表示此时闹钟响起,按下K4键执行停止闹钟响闹语句

}

else

{

beep=0;

relay=0;

}

}

voidmain()//主函数

{

init();//初始化子程序

while

(1)

{

keyscan();

clock();

}

}

voidtime0()interrupt1//定时器0中断服务程序

{

TH0=(65536-50000)/256;//定时器重新装入数值

TL0=(65536-50000)%256;

aa++;//中断次数累加

if(aa==20)//20次50毫秒为1秒

{

aa=0;

miao++;

led=~led;

if(miao==60)

{

miao=0;

fen++;

flag2=1;//闹钟响起时按下K4键闹钟关闭,此处应重置该变量,使下一次闹钟时间来到时,闹钟仍然可以响起

if(fen==60)

{

fen=0;

shi++;

if(shi==24)

{

shi=0;

}

if(flag1==1)

{write_sfm(5,shi);}//小时发生变化则立即吸入屏幕显示

}

if(flag1==1)

{write_sfm(8,fen);}//分钟发生变化则立即吸入屏幕显示

}

}

}

2.软件调试结果

由软件调试结果看得,软件部分无错误,在此基础上可利用ISIS进行下一步的仿真。

3.仿真结果验证

步骤:

使用ISIS软件将电路图打开,然后点击左下方的仿真开始按钮,进行仿真。

设置现在的时间。

按下K1,调整现在小时,按下K2,调整分钟,直至调整到现在时间,然后按下K3设置成功,例如02:

03。

再次按下K3进

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

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2