基于单片机的电子闹钟的设计文档格式.docx

上传人:b****6 文档编号:20838426 上传时间:2023-01-25 格式:DOCX 页数:30 大小:1.21MB
下载 相关 举报
基于单片机的电子闹钟的设计文档格式.docx_第1页
第1页 / 共30页
基于单片机的电子闹钟的设计文档格式.docx_第2页
第2页 / 共30页
基于单片机的电子闹钟的设计文档格式.docx_第3页
第3页 / 共30页
基于单片机的电子闹钟的设计文档格式.docx_第4页
第4页 / 共30页
基于单片机的电子闹钟的设计文档格式.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

基于单片机的电子闹钟的设计文档格式.docx

《基于单片机的电子闹钟的设计文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机的电子闹钟的设计文档格式.docx(30页珍藏版)》请在冰豆网上搜索。

基于单片机的电子闹钟的设计文档格式.docx

液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。

液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。

2.2、实时时间计算模块

AT89S52单片机内部带有定时/计数功能,此定时功能是通过对外部晶振的脉冲进行计数,从而达到计时功能,使用12MHz的晶振就能实现高精度的计时,因此可以利用此功能实现计时。

2.3、按键控制模块

本设计用到的键盘有4个独立按键,分别为时间调整按键、闹钟调整按键和两个时间加减按键。

以此控制时间的调整和闹钟时间的调整。

2.4、声音报警模块

此模块采用无源蜂鸣器实现,通过编写相应的程序,当满足要求时,给蜂鸣器提供不同频率的方波,使其发出不同频率的声音,把不同频率的声音按一定的时序输出,从而发出音乐。

2.5、总体设计:

总体框架如图2-1所示:

图2-1总体硬件框架图

总体构思如图2-2所示:

图2-2总体构思框架图

三、硬件设计

3.1、单片机最小系统

3.1.1、时钟信号的产生

89C52芯片内部有一个高增益法相放大器,用于构成振荡器。

反相放大器的输入端为XTAL1,输出端为XTAL2,两端跨接石英晶体及两个电容就可以构成稳定的自己振荡器,电路如图3-1所示。

图3-1晶振电路

3.1.2、复位电路

复位操作有上电自动复位和按键手动复位两种方式,本设计采用按键电平复位,结构如图3-2所示。

图3-2复位电路

3.2、液晶显示模块

3.2.1、1602液晶引脚图及连线电路

图3-31602液晶显示器

3.2.2、一般1602字符型液晶显示器实物图

字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。

下面以长沙太阳人电子有限公司的1602字符型液晶显示器为例,介绍其用法。

一般1602字符型液晶显示器实物如图3-4

图3-41602液晶显示器实物图

3.3、矩阵键盘

本设计采用4个独立按键控制,按键的接口、序号及接线图如下图所示:

图3-5独立按键连线电路图

3.4、蜂鸣器电路

本课程设计使用的蜂鸣器是有源蜂鸣器,通过对给蜂鸣器一定频率的方波,驱动蜂鸣器蜂鸣器发出相应频率的声音,其中方波可对端口进行连续取反实现,取反频率由定时器控制,驱动电路如下图所示:

图3-6蜂鸣器连线电路图

3.5、电源指示灯部分

电源指示灯部分包括一个开关,发光二级管和限流电阻。

当电源接通时发光二级管点亮,表明电路已上电。

电源指示灯原理图如图3-7所示:

图3-7电源指示灯原理图

3.6、STC89C52芯片

STC89C52是一个低功耗,高性能CMOS8位单片机,片内含具有如下特点:

40个引脚(引脚图如图1-1所示),4kBytesFlash片内程序存储器,128bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDTC)电路,片内时钟振荡器。

此外,STC89C52设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。

空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。

同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。

单片机引脚图如图3-8所示:

图3-8单片机引脚图

3.7、整体电路原理图

整体电路原理图如图3-9所示:

图3-9总体电路原理图

3.8、Lockmaster硬件电路

图3-10硬件电路正面视图

图3-11硬件电路背面视图

四、程序流程图

程序主要流程如图4-1所示,时间、日期、闹钟设置部分流程如图4-2所示。

图4-1程序流程图

图4-2程序流程图时间、日期设置部分

图4-3程序流程图闹钟设置部分

五、

系统仿真与调试

5.1、Proteus仿真原理图

Proteus软件是英国electronics公司出版的EDA工具软件。

它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。

它是目前最好的仿真单片机及外围器件的工具。

Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。

它是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台。

以下是用Proteus仿真调试图:

图5-1日期时间显示

图5-2闹钟设置

5.2、实物图

图5-5实物正面视图

5.3、使用说明

按键序号及对应具体功能为:

按键1:

时间与日期调整进入与退出键

按键2:

加一调整功能键

按键3:

减一调整功能键

按键4:

闹钟调整进入与退出键

六、设计总结及心得体会

单片机是我所学专业的主要课程之一,因此我认为单片机课程设计是十分必要而且十分重要的。

尽管刚刚拿到课程设计题目时有点迷惘,不知道如何着手,但通过上网和图书馆查阅相关资料,自己认真钻研以及虚心询问同学,终于解决了一个又一个的困难和障碍,成功完成了任务。

通过本次的单片机课程设计,不仅大大地丰富了我的理论知识,而且在实践过程中更令我学会了坚持、耐心和努力。

此次单片机课程设计需要运用到许多之前所学过的知识,令我认识到自己以前学习的一些不足之处,例如对以前所学知识的理解不够深刻,掌握得不够牢固,运用不够灵活。

这让我懂得了认真学习的重要性,以及要孜孜不倦地钻研所学过的知识,做得融会贯通,不能一览而过,不求甚解。

在边学习边动手的过程中,我对电子时钟的构造以及原理有了进一步的了解,同时也加深和巩固了我对单片机汇编语言的认识。

除此之外,由于是第一次做单片机,因此在此次课程设计的过程中,无论是电路绘制还是汇编语言编写都难免遇到了不少困难和障碍,例如汇编语言编写出错、电路元件无从入手等。

在面对困难和障碍时,我庆幸自己没有退缩和逃避,而是通过各种方法,迎难而上,以坚持、耐心和努力勇敢无畏地面对困难,克服困难,解决困难。

让我发现问题、分析问题、解决问题以及动手实践的能力都有了很大的提高,并了解到理论知识与实践相结合的重要意义。

从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的练习的过程中才能提高。

本次课程设计尽管时间不长,但从中所获,将令我受益终生

附录:

#include<

reg52.h>

#defineucharunsignedchar

#defineuintunsignedint

ucharcodetable[]="

2014-01-06MON"

;

ucharcodetable1[]="

01:

00:

00"

ucharcodetable2[7][3]={{"

MON"

},{"

TUE"

WED"

THU"

FRI"

SAT"

SUN"

}};

//定义二维字符数组

sbitRW=P2^6;

sbitEN=P2^5;

//1602液晶使能端

sbitRS=P2^7;

//1602液晶命令/数据端

sbitkey1=P1^0;

//声明s1按键

sbitkey2=P1^1;

//声明s2按键

sbitkey3=P1^2;

//声明s3按键

sbitkey4=P1^3;

//声明s4按键

sbitbeep=P3^7;

uinta,s,spak,i,flag;

//声明蜂鸣器

ucharnum1,yue,ri,keynum1,week;

//定义时分秒变量

charshi=01,fen,miao,shi1,fen1,miao1;

uintnian=2014;

//定义年变量

voiddelay(uintz)

{

uinti,j;

for(i=z;

i>

0;

i--)//定义带参数延时函数

for(j=100;

j>

j--);

}

voidwrite_com(ucharcom)//1602液晶写指令函数

{

RW=0;

RS=0;

P0=com;

delay(5);

EN=1;

EN=0;

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

{

RS=1;

P0=date;

voidwrite_addate1(ucharadd,uintdate)//定义显示年的函数

uintqian;

ucharbai,shi,ge;

qian=date/1000;

bai=date%1000/100;

shi=date%1000%100/10;

ge=date%10;

write_com(add+0x80);

write_date(0x30+qian);

write_date(0x30+bai);

write_date(0x30+shi);

write_date(0x30+ge);

voidwrite_addate3(ucharadd3,uintdate3)//定义显示年的函数

qian=date3/1000;

bai=date3%1000/100;

shi=date3%1000%100/10;

ge=date3%10;

write_com(add3+0x80);

voidwrite_addate2(ucharadd,uchardate)//定义显示月、日、时、分、秒函数

ucharshi,ge;

shi=date/10;

voidwrite_rq(uchari)//定义显示星期的函数

{ucharx;

for(x=0;

x<

3;

x++)

{write_date(table2[i][x]);

delay(5);

}

}

voidinit()//定义初始化函数

beep=0;

flag=1;

yue=01;

ri=06;

TMOD=0x01;

//定时器0工作方式为16位

TH0=(65536-50000)/256;

//装初值

TL0=(65536-50000)%256;

EA=1;

//开总中断

ET0=1;

//开定时器0中断

write_com(0x38);

//设置16*2显示,5*7点阵,8位数据口

write_com(0x06);

//写一个字符后地址指针加1

write_com(0x0c);

//设置开显示,不显示光标

write_com(0x01);

//显示清0,数据清0

write_com(0x80);

//使指针指向第1行第1列

voidkeyscan()//定义按键函数

ucharkeynum;

if(key1==0)//s1按键被按下

{delay(3);

//去抖延时

if(key1==0)//确认s1按键被按下,进入调时间模式

{

keynum++;

while(!

key1);

//松手检测

}

if(keynum==1)//s1按下一次

{TR0=0;

//关闭定时器0

write_com(0x81);

//指针指向第1行2列

write_com(0x0f);

//开启光标显示,光标闪烁

if(keynum==2)

write_com(0x86);

//光标跳到月份

if(keynum==3)

{

write_com(0x89);

//光标跳到日

if(keynum==4)

write_com(0x8c);

//光标跳到星期

if(keynum==5)

write_com(0x80+0x40+4);

//光标跳到时

if(keynum==6)

write_com(0x80+0x40+7);

//光标跳到分

if(keynum==7)

write_com(0x80+0x40+10);

//光标跳到秒

if(keynum==8)

{

keynum=0;

//退出调时间模式

TR0=1;

//开启定时器0

write_com(0x0c);

//关闭光标显示

if(keynum)//当进入调时间模式时

{

if(key2==0)//s2按键按下

delay(5);

//去抖延时

if(key2==0)

{

if(keynum==1)

{

nian++;

//s2每按下一次年份加1

if(nian==10000)//加满清0

nian=0;

write_addate1(1,nian);

//显示年份

write_com(0x81);

//写完数据指针指向年份原来位置

}

if(keynum==2)

{

yue++;

//s2每按下一次月份加1

if(yue==13)

yue=0;

//加满清0

write_addate2(6,yue);

//显示月份

write_com(0x86);

//写完数据指针指向月份原来位置

if(keynum==3)

{ri++;

if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)//1,3,5,7,8,10,12月有31天

{

if(ri==32)//加满还原

ri=1;

}

if(yue==4||yue==6||yue==9||yue==11)//4,6,9,11月有30天

if(ri==31)

ri=1;

if(yue==2&

&

((nian%4==0&

nian%100!

=0)||nian%400==0))//闰年2月有30天

if(ri==30)

ri=1;

(nian%4!

=0)||(nian%100==0&

nian%400!

=0))//非闰年2月有31天

if(ri==29)

write_addate2(9,ri);

//显示日

write_com(0x89);

//写完数据指针指向日原来位置

if(keynum==4)

{

week++;

//s2每按下一次星期加1

if(week==7)//加满还原

week=0;

write_rq(week);

//显示星期

write_com(0x8c);

//写完数据指针指向星期原来位置

}

if(keynum==5)

{

shi++;

//s2每按下一次时加1

if(shi==24)

shi=0;

//加满还原

write_addate2(0x44,shi);

//显示时

write_com(0xc4);

//写完数据指针指向时原来位置

}

if(keynum==6)

{

fen++;

//s2每按下一次分加1

if(fen==60)

fen=0;

write_addate2(0x47,fen);

//显示分

write_com(0xc7);

//写完数据指针指向分原来位置

if(keynum==7)

miao++;

//s2每按下一次秒加1

if(miao==60)

miao=0;

//加满还原

write_addate2(0x4a,miao);

//显示秒

write_com(0xca);

//写完数据指针指向秒原来位置

while(!

key2);

//松手检测

}

}

if(key3==0)

{

delay(5);

if(key3==0)

{//s3按下时减1

if(keynum==1)

{

nian--;

if(nian==-1)

nian=9999;

write_addate1(1,nian);

write_com(0x81);

}

if(keynum==2)

{yue--;

if(yue==-1)

yue=12;

write_addate2(6,yue);

write_com(0x86);

if(keynum==3)

ri--;

if(ri==0)

{if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)

ri=31;

if(yue==4||yue==6||yue==9||yue==11)

ri=30;

if(yue==2&

=0)||nian%400==0))

ri

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

当前位置:首页 > 初中教育 > 中考

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

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