资源描述
课程设计
设计题目: 基于单片机定时闹钟
院 系: 电气工程
专 业: 电子信息工程
年 级:
姓 名:
指导老师:
年 月 日
课 程 设 计 任 务 书
专 业 电子信息工程 姓 名 学 号
开题日期: 月 日 完成日期: 12月 日
题 目 基于单片机定时闹钟
一、设计目标
此次电子课程设计是一个基于单片机定时闹钟,其关键目标是为了学习和巩固单片机知识,使对已学过基础知识能有更深入了解,对所学知识能够达成学以致用,另外还对汇编语言进行复习。总来说,课程设计是培养我们综合利用所学知识,发觉、提出、分析和处理实际问题能力。综合以上原因,结合本身实际情况我选择了在生活中应用广泛,同时对大家生活,学习,工作占关键地位闹钟。
二、设计内容及要求
本课程设计以AT89C51芯片为关键,辅以必需外围电路,设计了一个结构简单,功效齐全电子时钟。硬件方面,基于单片机结合时钟电路,按键电路等设计电路,其中设置了四个按键实现了对时间调整,这四个按键有两种功效,这也是设计过程中一个难点。软件方面采取C语言编程。整个电子钟系统能完成时间显示、调时、校时和三组定时闹钟功效。然后,使用Keil单片机模拟调试软件,测试程序可行性并用Proteus进行仿真,最终得到仿真结果,验证是否达成设计要求和效果。
三、指导老师评语
四、成 绩
指导老师 (签章)
年 月 日
一. 设计方案及介绍
1. 设计方案:本课程设计定时闹钟是以单片机和外围接口电路为关键,再加上相关外围电路,结合汇编语言设计程序来实现,有功效多,正确度高等特点,实现起来也比较简单。
2. 设计介绍:
(1) 时钟是将小时、分钟、秒钟显示于人肉眼计时装置,此次课程设计LCD电子定时闹钟是基于单片机数字电路实现对时、分、秒数字显示数字计时装置,它计时周期为比较习惯二十四小时制,另外应有校时功效和部分显示日期、闹钟等附加功效。
(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---闹铃时间到时,发出一阵声响,按下本键可停止声响。
设计难点在于4个按键每个全部含有两个功效,以最终实现菜单化输入功效。采取经过逐层嵌套循环扫描,实现嵌套式键盘输入。以对小时设置步骤为例,其步骤以下:
N
K1按下?a
Y
N
K1按下?
Y
Hour-1
N
Y
K3按下?
3. 设计框图 LCD显示
振荡电路
单片机
AT89C51
调时电路
:
按键(键盘)
喇叭
二. 硬件设计
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. 电子闹钟主程序步骤图,图所表示:
CPU系统初始化
定时0初始化
中止初始化
串口初始化
显示待机指示符
设定闹铃时间
判设置闹铃时间否?
显示刷新
开启走时
相关变量初始化
刷新显示
判时或分改变否?
秒指示
判定1秒到否?
闹铃
判是否到闹铃时间?
延时
Y
Y
Y
Y
N
N
N
N
N
N
4. 程序初始化
在系统开始上电时,需要首先初始化液晶:
void TimeInit()
{
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) 判别处理步骤图:
时十位、个位,分十位、个位改变了
设置闹铃标志
是否设置了闹铃
清除闹铃标志
判目前时间是设定时间
中止返回
中止返回
Y
N
Y
闹铃判别处理
N
四. 仿真结果
1. 程序清单
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint miao,fen,fen1,shi,shi1,flag1,flag2,flag3,aa,K1num,K2num,K3num,K4num,N; //K1num-K1按键被按下标识变量,K2num-K2按键被按下标识变量,K3num=0-K3按键被按下标识变量
uchar code table[]=" TIMING CLOCK"; //定义初始上电时液晶默认显示状态
sbit K1=P1^0; //四个按键
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
sbit rs=P2^0;
sbit lcden=P2^2;
sbit led=P2^3; //发光二极管控制端
sbit beep=P2^4; //蜂鸣器控制端
sbit relay=P2^5; //继电器控制端
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) //液晶写命令函数
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date) //液晶写数据函数
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_sfm(uchar add,uchar date) //液晶写时分秒函数
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void init() //初始化函数
{
uint num; //写液晶循环控制变量
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++) //显示闹钟标示:TIMING CLOCK
{
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
}
void keyscan() //键盘扫描函数
{
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;
}
}
}
void clock() // 闹钟函数 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);
}
else if((fen==fen1)&&(shi==shi1)&&(flag2==1)&&(K4num==1)) //闹钟响闹控制
{
beep=1; //此时闹钟响起,发出哗一声
relay=1; //闹钟时间到,则继电器开启
flag3=0; //置flag3=0,表示此时闹钟响起,按下K4键实施停止闹钟响闹语句
}
else
{
beep=0;
relay=0;
}
}
void main() //主函数
{
init();//初始化子程序
while(1)
{
keyscan();
clock();
}
}
void time0() interrupt 1 //定时器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进行设置闹铃时间,K1调整小时,K2调整分钟,K3设置成功,比如闹铃时间为02:05。
跳到现在时间,等到闹铃时间一到,喇叭响,按下K4将闹铃关掉,仿真完成。
五.总结
在碰到很多问题学会去弄懂,学会戒骄戒躁和不懈努力下,我最终完成了设计要求选题,所设计功效也基础达标。不过因为时间比较短,前期设计出现很多问题:如设计总体思绪、闹钟开启和关闭、间断蜂鸣声等。这些是软件设计时对应功效部分还不完善造成,总来说软件编程是至关关键。不过经仔细思索和查阅资料,问学长问老师最终把程序完善,才能到能实现所设计实现相关功效程序。
同时,在设计时候应该从多方面、多角度去考虑问题,而且应该深入提升时钟质量。另外,在此次设计过程中,我发觉很多问题,即使以前没有做过这么设计但经过这次设计我学会了很多东西,单片机课程设计关键就在于软件算法设计,程序并不是一件简单事,比如写一个程序看其功效极少认为编写程序简单,但到编程时候才发觉部分细微知识或低级错误常常犯做不到最终常常失败,所以有些东西只有学精弄懂而且要细心才行,只学习理论有些东西是极难了解,更谈不上掌握。
最终,从这次课程设计中,我们真真正正意识到,在以后学习中,要理论联络实际,把我们所学理论知识用到实际当中,这么才有实际意义也正是我们学习最终目标,学以致用,我想这就是我在这次课程设计中最大收获。
设计心得
总来说,课程设计是培养学生综合利用所学知识,发觉、提出、分析和处理实际问题,经过此次电子课程设计使我充足认认到了课程设计理要性和必需性,此次设计使我对已学过基础知识有了更深入了解,学会了独立思索、独立工作和对应用所学基础理论分析和处理实际问题能力有了很大提升。
这次课程设计,从选题到定题,从理论到实践,从中却学到很多很多东西,也体验很多东西。做过程中,开始碰到了不少困难问题,即使学过单片机,不过有些内容和随时间遗忘,对单片机汇编语言掌握得不好等,也就让我发觉了自己很多不足之处,那就是对以前所学过知识了解得不够深刻,掌握得不够牢靠,所以在做过程中难免会有沮丧,难过,不知所措和浮躁等消极情绪,好在最终慢慢克服调整自己情绪,向学长学姐请教。
在此次设计中,最受益一条经验就是:不懂东西,就去查资料,去请教老师,问学长,把它弄懂,埋怨是不起任何作用,只会徒增苦恼。还有就是,即使过程中会有很痛苦时候,不过要坚持,坚持总会有收获。
参考文件
[1]单片机课程设计指导书,皮大能,北京理工大学出版社,.7
[2]单片机技术基础教程和实践,夏路易,电子工业出版社,.1
[3]8051单片机实践和应用 ,吴金戎,清华大学出版社,.8
[4]基于Proteus单片机系统设计和仿真实例,蒋辉平,机械工业出版社,.7
[5]单片机Keil CX51应用开发技术[M],王为青、程国钢,人民邮电出版社,
[6]单片机系统Proteus设计和仿真[M],张靖武、周灵彬,电子工业出版社,
展开阅读全文