定时闹钟设计1.docx
《定时闹钟设计1.docx》由会员分享,可在线阅读,更多相关《定时闹钟设计1.docx(26页珍藏版)》请在冰豆网上搜索。
![定时闹钟设计1.docx](https://file1.bdocx.com/fileroot1/2023-3/1/37f205ab-2151-4d70-841f-280b79e8a913/37f205ab-2151-4d70-841f-280b79e8a9131.gif)
定时闹钟设计1
定时闹钟的设计
学生姓名:
学生学号:
指导教师:
所在学院:
专业班级:
中国·
2014年6月
信息技术学院
课程设计任务书
信息技术学院院专业级,学号姓名
一、课程设计课题:
定时闹钟的设计
二、课程设计工作日自2014年6月15日至2014年7月1日
三、课程设计进行地点:
四、程设计任务要求:
(详细内容见课程设计文档)
1.课题来源:
指导老师下发
2.目的意义:
此次设计的目的是培养同学们系统地运用已学的理论知识解决实际问题的能力和查阅资料的能力,以及一定的自学能力和独立分析问题、解决问题的能力,能通过独立思考、查阅工具书、参考文献,寻找解决方案;通过完成所选题目的分析与设计,达到技术性能要求。
3.基本要求:
设计基于单片机的定时闹钟,可以实现时分秒的显示、以及定时等基本功能。
能够设定定时时间,并实现修改定时的功能。
定时时间到应能发出报警声。
课程设计评审表
指导教师评语:
成绩:
签字:
日期:
目录
1设计任务要求…………………………………………………….………
2方案设计………………………………………………………….………
3单元电路设计…………………………………………………….………
4元件选择(要求计算元件参数)………………………………….………
5整体电路(标出原元件型号和参数、画出必要波形图)………………
6说明软件程序设计……………………………………………………….
7困难问题及解决措施…………………………………………….………
8总结与体会……………………………………………………………….
9致谢……………………………………………………………….………
10参考文献……………………………………………………….………...
1.设计要求
1.1目的:
此次设计的目的是培养同学们系统地运用已学的理论知识解决实际问题的能力和查阅资料的能力,以及一定的自学能力和独立分析问题、解决问题的能力,能通过独立思考、查阅工具书、参考文献,寻找解决方案;通过完成所选题目的分析与设计,达到技术性能要求。
1.2要求:
(1)设计基于单片机的定时闹钟,可以实现时分秒的显示、以及定时等基本功能。
(2)能够设定定时时间,并实现修改定时的功能。
(3)定时时间到应能发出报警声。
1.3规定:
设计硬件线路,用protel画图。
按单元电路详细说明硬件线路设计思路,元件参数,选取根据。
附详细的元件清单。
总结设计过程和设计体会。
1.4内容:
这一次课程设计,所设计的是一个定时闹钟,能显示时-分-秒,能够设计定时时间,修改定时时间,并且定时时间到了能发出报警声。
设计的部分分为软件及硬件,软件部分写出闹钟的工作方式以及它是如何工作的,而硬件部分是软件的载体,画出正确的电路图然后在软件的控制下才能使设计的定时闹钟正常工作。
1.5完成时间:
3周。
2.设计方案原理图
3.各部分电路设计
3.1主电路
主电路主要就是芯片的运行,加载程序后,在外部时钟的作用下,将按照程序运行,从而可以实现设计的要求,进行时钟时间和定时时间的调整,并且能够在到达定时时间后控制蜂鸣器发出声响。
图1主电路
3.2显示电路
显示电路即可以让我们看到时间的调整和定时时间的调整,显示调整后的时间。
图2显示电路
3.3内部时钟方式的电路
单片机内部有一个用于构成振荡器的高增益反向放大器,它的输入端为芯片引脚XTAL1,输出端为引脚XTAL2。
这两个引脚跨接石英晶体和微调电容,构成一个稳定的自激振荡器。
时钟频率可以影响单片机的速度。
单片机的各功能部件的运行都以时钟控制信号为基准
图3内部时钟方式的电路
3.4按键及蜂鸣器电路
按键可以对时间进行调整,蜂鸣器可以在到达定时的时间时提醒我们。
图4按键及蜂鸣器电路
4.元件选择
4.1芯片AT89C52
AT89C52是ATMEL公司生产的低电压,高性能CMOS单片机.AT89C52提供以下标准功能:
8字节FLASH闪速存储器,256字竹内部RAM,32个I/O口线,3个16位定时/计数器,一个6向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89c52可降至OHz的静态逻辑操作,并支持两种软件可选的节电上作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器.串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位.
4.2LCD显示屏
1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点。
晶模块内部的控制器共有11条控制指令,如表所示:
表3-1:
控制命令表
序号
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清显示
0
0
0
0
0
0
0
0
0
1
2
光标返回
0
0
0
0
0
0
0
0
1
*
3
置输入模式
0
0
0
0
0
0
0
1
I/D
S
4
显示开/关控制
0
0
0
0
0
0
1
D
C
B
5
光标或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符发生存贮器地址
0
0
0
1
字符发生存贮器地址
8
置数据存贮器地址
0
0
1
显示数据存贮器地址
9
读忙标志或地址
0
1
BF
计数器地址
10
写数到CGRAM或DDRAM)
1
0
要写的数据内容
11
从CGRAM或DDRAM读数
1
1
读出的数据内容
指令3:
光标和显示模式设置I/D:
光标移动方向,高电平右移,低电平左移S:
屏幕上所有文字是否左移或者右移。
高电平表示有效,低电平则无效。
指令4:
显示开关控制。
D:
控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:
控制光标的开与关,高电平表示有光标,低电平表示无光标B:
控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:
光标或显示移位S/C:
高电平时移动显示的文字,低电平时移动光标。
指令6:
功能设置命令DL:
高电平时为4位总线,低电平时为8位总线N:
低电平时为单行显示F:
低电平时显示5×7的点阵字符。
指令9:
读忙信号和光标地址BF:
为忙标志位,高电平表示忙,此时模块不能
接收命令或者数据,如果为低电平表示不忙。
4.3蜂鸣器
有源蜂鸣器是一种一体化结构的电子讯响器,是内部自带振荡电路,只需电平驱动就可以发生的蜂鸣器,而与其对应的无源蜂鸣器内部则无振荡电路。
5.整体电路图
见附图。
6.软件程序设计
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable1[]="00:
00:
00";
sbitlcden=P2^6;//位定义
sbitlcdrw=P2^5;
sbitlcdrs=P2^4;
sbits1=P3^0;
sbits2=P3^1;
sbits3=P3^2;
sbitbeep=P3^7;//定义蜂鸣器
ucharnum,count,s1num;//显示的位数;响应中断数;按键次数;
uinti;
charshi,fen,miao,shi1,fen1,miao1;
voiddelay(uintz)//延时程序
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)//控制指令
{
lcdrs=0;//低电平时选择指令寄存器
lcdrw=0;//低电平时进行写操作
delay(5);
lcden=1;//E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令
P0=com;
delay(5);
lcden=0;
}
voidwrite_data(uchardate)//数据指令
{
lcdrs=1;
lcden=1;//均为高时是读出数据的内容
delay(5);
P0=date;
delay(5);
lcden=0;
}
voidinit()//初始化
{
lcdrw=0;
lcden=0;
delay(15);
write_com(0x38);//设置为4位总线,单行显示
delay(5);
write_com(0x38);
delay(5);
write_com(0x38);
write_com(0x38);//重复多次以确定可以正确设置
write_com(0x08);//无光标正常显示
write_com(0x01);//清显示
write_com(0x06);//光标和显示模式设置d1I/D:
光标移动方向,高电平右移d0S:
屏幕上所有文字是否左移或者右移。
低电平表示光标闪烁
write_com(0x0c);//显示开关控制。
d2D:
控制整体显示的开与关,高电平表示开显示d1C:
控制光标的开与关,低电平表示无光标B:
控制光标是否闪烁,低电平不闪烁
write_com(0x80+1);d7为高时,显示数据存储地址
TMOD=0x11;工作方式3
TH0=(65536-50000)/256;//定时时间为50ms
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//打开定时器
TR0=1;//启动定时器
write_com(0x80+4);//秒的设定
for(num=0;num<8;num++)
{
write_data(table1[num]);
delay(20);
}
write_com(0x80+0x40+4);
for(num=0;num<8;num++)
{
write_data(table1[num]);
delay(20);
}
}
voidwrite_sfm(ucharadd,uchardate)//调整时间
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);//控制指令,0x40:
字符发生器RAM地址设置进行加
write_data(0x30+shi);//数据指令,功能设置命令d4DL:
高电平时为4位总线d3N:
低电平时单行显示d2F:
低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
write_data(0x30+ge);
}
voidwrite_shedingsfm(ucharadd1,uchardate1)//设定定时时间
{
ucharshi1,ge1;
shi1=date1/10;
ge1=date1%10;
write_com(0x80+add1);//控制指令
write_data(0x30+shi1);
write_data(0x30+ge1);
}
voidkeyscan()
{
if(s1==0)
{
delay(5);
if(s1==0)
{
s1num++;
while(!
s1);//s1按下
}
}
if(s1num==1)//按下次数
{
TR0=0;//停止定时器工作
write_com(0x80+0x40+11);//调整时间设置,控制秒设定
write_com(0x0f);//d3显示开关控制。
d2D:
控制整体显示的开与关,高电平表示开显示d1C:
控制光标的开与关,高电平表示有光标d0B:
控制光标是否闪烁,高电平闪烁
}
if(s1num==2)
{
write_com(0x80+0x40+8);//控制分钟设定
write_com(0x0f);//控制光标闪烁
}
if(s1num==3)
{
write_com(0x80+0x40+5);//控制时设定
write_com(0x0f);
}
if(s1num==4)
{TR0=1;//启动定时器,定时时间的设定
write_com(0x80+11);//控制秒的设定
write_com(0x0f);//光标显示
}
if(s1num==5)
{
write_com(0x80+8);//定时分钟的设定
write_com(0x0f);
}
if(s1num==6)
{
write_com(0x80+5);//定时时的显示
write_com(0x0f);
}
if(s1num==7)
{
s1num=0;//按键次数清零
write_com(0x0c);//显示此时为无光标状态
}
if(s1num!
=0)//有按键时
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!
s2);
if(s1num==1)
{
miao++;
if(miao==60)
{
miao=0;
}
write_sfm(10,miao)//第10位进行秒的设定
write_com(0x80+0x40+11);//控制秒的设定
}
if(s1num==2)
{
fen++;
if(fen==60)
{
fen=0;
}
write_sfm(7,fen);
write_com(0x80+0x40+8);
}
if(s1num==3)
{
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(4,shi);
write_com(0x80+0x40+5);
}
if(s1num==4)
{
TR0=1;//定时器启动
miao1++;
if(miao1==60)
{
miao1=0;
}
write_shedingsfm(10,miao1);
write_com(0x80+11);
}
if(s1num==5)
{
fen1++;
if(fen1==60)
{
fen1=0;
}
write_shedingsfm(7,fen1);
write_com(0x80+8);
}
if(s1num==6)
{
shi1++;
if(shi1==24)
{
shi1=0;
}
write_shedingsfm(4,shi1);
write_com(0x80+5);
}
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!
s3);
if(s1num==1)
{
miao--;
if(miao==-1)
{
miao=59;
}
write_sfm(10,miao);
write_com(0x80+0x40+11);
}
if(s1num==2)
{
fen--;
if(fen==-1)
{
fen=59;
}
write_sfm(7,fen);
write_com(0x80+0x40+8);
}
if(s1num==3)
{
shi--;
if(shi==-1)
{
shi=23;
}
write_sfm(4,shi);
write_com(0x80+0x40+5);
}
if(s1num==4)
{
TR0=1;
miao1--;
if(miao1==-1)
{
miao1=59;
}
write_shedingsfm(10,miao1);
write_com(0x80+11);
}
if(s1num==5)
{
fen1--;
if(fen1==-1)
{
fen1=59;
}
write_shedingsfm(7,fen1);
write_com(0x80+8);
}
if(s1num==6)
{
shi1--;
if(shi1==-1)
{
shi1=23;
}
write_shedingsfm(4,shi1);
write_com(0x80+5);
}
}
}
}
voidmain()//主函数
{
init();//初始化函数
while
(1)
{
keyscan();//键盘扫描
if(count==20)//响应中断20次,时间1s
{
count=0;//清零
miao++;//秒加1
if(miao==60)//60秒时分加1
{
miao=0;
fen++;
if(fen==60)//60分时时加1
{
fen=0;
shi++;
if(shi==24)//24时时时全为0,从00:
00:
00开始计时
{
shi=0;
}
write_sfm(4,shi);//修改时
}
write_sfm(7,fen);//修改分
}
write_sfm(10,miao);//修改秒
if((shi==shi1)&&(fen==fen1)&&(miao==miao1))//蜂鸣器电路的运行
{
for(i=0;i<10;i++)
{
beep=0;//蜂鸣器响
delay(50);
beep=1;
delay(50);
}
}
}
}
}
voidtimer0()interrupt1//中断函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
}
8.总结与体会
8.1设计过程中遇到的问题及解决方法
在设计的过程中遇到问题是不可避免的,我遇到了很多问题,如下所示;
(1).做实物时无法驱动数码管显示,后来了解到可以加锁存器,如74LS253,74LS573等等,还可以加三极管用来加大电流。
当然如果换成液晶显示屏的话就不需要考虑驱动不了的问题了。
(2).烧程序时没发烧进去,需要改变最高和最低波特率,才能按照步骤把程序烧进去。
(3).仿真时没问题的电路,在做好实物时发现无法运行。
原因可能是程序出现问题,或者在连实物时线路连接错误等等都有可能。
这是很难的一部分,需要查找出原因。
在做实物的过程中我进行的很多检查,有很多连接错误,最终又重新焊接的。
(4).复位电路在实物中可以运行,但是在仿真中不能正常运行。
目前还未找到原因。
8.2设计体会
这次设计中遇到了很多问题,例如刚开始我在在仿真时程序出现了每次按按钮时总是显示测量时需要关闭仿真的字样,试了很多方法都没有找到原因,最后才知道是因为按钮太近的缘故。
很多类似的经历让我明白:
(1).在设计程序之前,务必要对所学单片机课程的内容有一个系统的了解,知道单片机片内片外的内容及其功能。
(2).设计程序关键要有一个清晰的思路和一个完整的软件流程图。
模块化的设计思想在程序设计中的作用是重大的,它可以为你提供一个比较清晰的思路,并且很容易找到头绪,不至于在编写一个程序时感觉到无从下手。
(3).在设计程序时,不能妄想一次就将整个程序设计好,"反复修改,不断改进"是程序设计的必经之路。
程序刚开始编好时,一般情况下会存在很多错误,要不断地修改,不断的改进才能达到预期的目的,编写程序的时间并不是很长,主要是花很多时间去修改程序。
(4).要养成注释程序的好习惯,让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便。
刚开始我在编写程序时,很不习惯于写注释,感觉很麻烦,而且没用,但是在修改的过程中我就遇到了较大的麻烦,以至于不得不重新的作了注释,以增加程序的易读性,从而使修改过程变得容易一些。
总之,通过这次课程设计不仅使我巩固了本课程所学的基本知识,还使我具有了撰写科研报告的初步训练能力,我相信这些能力在我以后的工作或者是再学习中一定会起到不小的作用,一切的辛苦和艰难都是值得的。
8.3对设计的建议
在设计前应该对所要实现的功能有一定的了解,定下有大概的流程图,把设计模块化,写程序时也应该一个模块一个模块的写,这样方便理解,也方便以后的检查。
在仿真和实物的过程中要了解所使用芯片的功能及引脚的排列方式,这样焊接时比较方便。
9.致谢
本设计是在指导老师朱明杰的悉心指导和严格要求下完成的,朱老师多次询问研究进程,并为我们指点迷津,帮助我开拓研究思路,并解答了我们许多的疑问,在这里衷心感谢朱明杰老师。
同时,我还要感谢同组同学对我的帮助和指点,没有他们的帮助和提供资料,没有他们的鼓励和加油,这次毕业设计就不会如此的顺利进行。
此次毕业设计历时三个月,是我大学学习中遇到过的时段最长、涉及内容最广、工作量最大的一次设计。
在论文即将完成之际,我的心情无法平静,从开始进入课题到论文的顺利完成,有多少可敬的师长、同学、朋友给了我无言的帮助,在这里请接受我诚挚的谢意!
最后我还要感谢珠江学院四年来对我的栽培。
10.参考文献
[1] 童百石,华成英.模拟电子技术基础[M].北京:
高等教育出版社,2006:
93-99.
[2] 孙江宏,李良玉.Protel99电路设计与应用[M].北京:
机械工业出版社,2004:
35-47.
[3] 阎石.数字电子技术基础[M].北京:
高等教育出版社,1988:
63-76.
[4] 谢宜仁.单片机实用技术问答[M].北京:
人民邮电出版社,2003:
85-96.
[5] 杨西明,朱骐.单片机编程与应用入门[M].北京:
机械工业出版社,2004:
58-75.
[6] 何宏.单片机原理与接口技术[M].北京:
国防工业出版社,2006:
123-128.
[7] 房小翠,王金凤.单片机实用系统设计技术[M].北京:
国防工业出版社,1999:
75-89.
[8] 先锋工作室.单片机程序设计实例[M].北京:
清华大学出版社,2003:
135-142.
[9] 韦宏利.语音芯片在报站器中的应用[J].现代电子技术.2003:
(13):
30-3