定时闹钟课程设计大作业DOC.docx
- 文档编号:16575132
- 上传时间:2023-07-14
- 格式:DOCX
- 页数:28
- 大小:224.78KB
定时闹钟课程设计大作业DOC.docx
《定时闹钟课程设计大作业DOC.docx》由会员分享,可在线阅读,更多相关《定时闹钟课程设计大作业DOC.docx(28页珍藏版)》请在冰点文库上搜索。
定时闹钟课程设计大作业DOC
微型计算机控制
技术大作业
设计题目:
定时闹钟课程设计
院系:
计算机科学与信息工程学院
学生姓名:
曹紫莹
学号:
201103010036
专业班级:
计算机科学与技术(嵌入式方向)11-1
指导教师:
赵凯
2014.06.07
1、课程内容要求及目的1
1.1设计题目1
1.2设计要求1
1.3能显示时时-分分-秒秒。
1
1.4能够设定定时时间、修改定时时间。
1
2、设计实现方案2
2.1原理2
2.2原理及工作过程说明2
3、硬件设计3
3.1主控芯片AT89C51的设计3
3.2时钟电路部分设计4
3.3LCD显示电路部分5
4、软件设计6
4.1软件设计概述6
4.2主函数的设计6
4.3.1程序初始化7
4.3.2闹钟的实现8
4.3.3显示程序8
5、实验总结及心得体会23
6、参考文献24
基于单片机的定时闹钟
1、课程内容要求及目的
1.1设计题目
基于单片机的定时闹钟
1.2设计要求
1、能显示时时-分分-秒秒。
2、能够设定定时时间、修改定时时间。
3、定时时间到能发出报警声或者启动继电器,从而控制电器的启停。
1.3LCD电子闹钟的特点和功能介绍
时钟是将小时、分钟、秒钟显示于人的肉眼的计时装置。
而单片机模块中最常见的正是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用。
而LCD电子定时闹钟是以单片机为基础的数字电路实现对时、分、秒的数字显示的数字计时装置,它的计时周期为24小时,另外应有校时功能和一些显示日期、闹钟等附加功能。
一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”,“星期”计数器、校时电路、报时电路和振荡器组成。
目前电子钟广泛用于各种私人和公众场合,成为我们生活、工作和学习中不可缺少的好帮手。
由于时钟的实用性和在人们生活中的重要性,所以尝试设计以单片机为核心的数字时钟是很有意义的。
钟表原先的报时功能已经原不能满足人们日益增长的要求,现代的电子时钟多带有类似自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、通断动力设备、甚至各种定时电气的自动启用等功能,本设计中LCD电子时钟采用LCD显示时间和日期年月,直观实用,而且可以方便的校调,附带的万年历和定时功能也是很方便和实用的。
2、设计实现方案
2.1原理
本LCD定时闹钟,是以单片机及外围接口电路为核心硬件,辅以其他外围硬件电路,用汇编语言设计的程序来实现的。
根据C51单片机的外围接口特点扩展相应的硬件电路,然后根据单片机的指令设计出数字钟相应的软件,再利用软件执行一定的程序来实现数字钟的功能。
由于采用集成芯片性的单片机来制作电子钟,这样设计制作简单而且功能多、精确度高,也可方便扩充其他功能,实现也十分简单。
本设计是利用AT89C51单片机为主控芯片,由LCD、晶振、电阻、电容、发光二极管、开关、喇叭等元件组成硬件电路,通过编写软件程序来实现和控制的数字定时闹钟。
如图2.1所示。
图2.1
2.2原理及工作过程说明
使用AT89C51单片机结合字符型LCD显示器设计一个简易的定时闹钟LCD时钟。
定时闹钟的基本功能如下:
●显示格式为“时时:
分分”。
●由LED闪动来做秒计数表示。
●一旦时间到则发出声响,同时继电器启动,可以扩充控制家电的开启和关闭。
程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00:
00”,按下操作键K1~K4动作如下:
(1)K1—设置现在的时间。
(2)K2—显示闹钟设置的时间。
(3)K3—设置闹铃的时间。
(4)K4—闹铃ON/OFF的状态设置,设置为ON时连续三次发出“哗”的一声,设置为OFF发出“哗”的一声。
设置当前时间或闹铃时间如下。
(1)K1—时调整。
(2)K2—分调整。
(3)K3—设置完成。
(4)K4—闹铃时间到时,发出一阵声响,按下本键可以停止声响。
本题目的难点在于4个按键每个都具有两个功能。
3、硬件设计
3.1主控芯片AT89C51的设计
在本LCD电子闹钟设计中就是采用利用我们熟悉的AT89C51单片机为主控芯片。
AT89C51单片机由微处理器,存储器,I/O口以及特殊功能寄存器SFR等部分构成。
其存储器在物理上设计成程序存储器和数据存储器两个独立的空间,片内程序存储器的容量为4KB,片内数据存储器为128个字节。
89C51单片机有4个8位的并行I/O口:
P0口,P1口,P2口和P3口。
各个接口均由接口锁存器,输出驱动器,和输入缓冲器组成。
P1口是唯一的单功能口,仅能用作通用的数据输入/输出口。
P3口是双功能口除了具有数据输入/输出功能外,每条接口还具有不同的第二功能,如P3.0是串行输入口线,P3.1口是串行输出口线。
在需要外部程序存储器和数据存储器扩展时,P0可作为分时复用的低8位地址/数据总线,P2口可作为高8位的地址总线。
P3口也可作为AT89C51的一些特殊功能口,同时为闪烁编程和编程校验接收一些控制信号.
3.2时钟电路部分设计
AT89C51系列的单片机的时钟方式分为内部方式和外部方式。
内部方式就是在单片机的XTAL1和XTAL2的两引脚外接晶振,就够成了自激振荡器在单片机内部产生时钟脉冲信号。
外部时钟方式是把外部已经有的时钟信号引入到单片机内部。
时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。
在一个单片机应用系统中,时钟有两方面的含义:
一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间。
本LCD电子闹钟设计是采用内部时钟方式,用一个12MHz晶振和两个30Pf瓷片电容组成,为单片机提供标准时钟,其中两个瓷片电容起微调作用.其电路图见图3.1。
图3.1
而之所以采用高性能的振荡电路,因为:
1.单片机电子钟的计时脉冲基准是由外部晶振的频率经过12分频后提供,采用内部的定时/计数器来实现计时功能。
所以,外接晶振频率精确度直接影响电子钟计时的准确性。
2.单片机电子钟利用内部定时/计数器溢出产生中断(12M晶振一般为50ms)再乘以相应的倍率来实现秒、分、时的转换。
大家都知道从定时/计数器产生中断请求到响应中断需要3-8个机器周期,定时中断子程序中的数据入栈和重装定时/计数器的初值还需要占用数个机器周期,还有从中断入口转到中断子程序也要占用一定的机器周期。
3.3LCD显示电路部分
为了获得更好的效果本设计并没有采用常见的LED,而是采用了型号为1602的LCD。
LCD有LED数码显示更好的更的直观效果,也更加经久耐用。
液晶显示模块体积小功耗低、显示内容丰富,现在字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件之一了。
本LCD是2行16列液晶可显示2行16列英文字符,有8位数据总线D0-D7,RS,R/W,EN三个控制端口(共14线),工作电压为5V。
没背光,和常用的1602B功能和引脚一样(除了调背光的二个线脚).该模块也可只用
D4-D7作为四位数据分两次传送。
这样的话可以节省MCU的I/O口资源。
引脚说明,见表3.1。
VDD:
电源正极,4.5-5.5V,通常使用5V电压;
VL:
LCD对比度调节端,电压调节范围为0-5V。
接正电源时对比度最弱,接地电源时对比度最高,但对比度过高时会产生“鬼影”,因此通常使用一个10K的电位器来调整对比度或者直接串接一个电阻到地;
RS:
MCU写入数据或者指令选择端。
MCU要写入指令时,使RS为低电平;MCU要写入数据时,使RS为高电平;
R/W:
读写控制端。
R/W为高电平时,读取数据;R/W为低电平时,写入数据;
E:
LCD模块使能信号控制端。
写数据时,需要下降沿触发模块。
D0-D7:
8位数据总线,三态双向。
如果MCU的I/O口资源紧张的话,该模块也可以只使用4位数据线D4-D7接口传送数据。
本充电器就是采用4位数据传送方式;
BLA:
LED背光正极。
需要背光时,BLA串接一个限流电阻接VDD,BLK接地,实测该模块的背光电流为50mA左右;
BLK:
LED背光地端.
表3.1LCD显示屏引脚说明
编号
符号
引脚说明
编号
符号
引脚说明
1
VCC
电源地
9
D2
双向数据口
2
VDD
电源正极
10
D3
双向数据口
3
VL
对比度调节
11
D4
双向数据口
4
RS
数据/命令选择
12
D5
双向数据口
5
R/W
读/写选择
13
D6
双向数据口
6
E
模块使能端
14
D7
双向数据口
7
D0
双向数据口
15
BLK
背光源地
8
D1
双向数据口
16
BLA
背光源正极
4、软件设计
4.1软件设计概述
这里用汇编的单片机程序构成了本LCD电子闹钟的软件系统。
该程序实现时间及定时(时间以0点0分0秒为基准计算,闹铃定时以0时0分为基准计算)的显示,有外中断0和五个开关实现校时,闹钟功能。
其中程序的晶振频率为12MHz,最小计时单位为1/20秒。
主芯片p0.1-p0.7输出数据到LCD数据总线,p3.0-2.2输出LCD控制信号,P2.1输出声音信号,.P1.0-P1.3输入外部控制信号,整个软件系统也是根据这个关系连接成一个完整的系统。
4.2主函数的设计
本LCD电子闹钟的的主程序流程图如图4.1所示:
图4.1
4.3.1程序初始化
在系统开始上电时,需要.首先初始化液晶:
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)
4.3.2闹钟的实现
闹钟功能的实现涉及到两个方面:
闹铃时间设定和是否闹铃判别与相应处理。
闹铃时间设定模块的设计可参照时间设定模块,这里着重阐述闹铃判别与处理模块的设计问题。
闹铃判别与.闹铃处理的关键在于判别何时要进行闹铃。
当时十位、时个位、分十位、分个位中任一位发生改变(进位)时,就必须进行闹铃判别。
程序设计思想如图4.2。
图4.2
4.3.3显示程序
显示程序包括时钟显示和定时显示程序。
具体程序见附录。
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。
要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,表4.1是TC1602EL液晶模块的内部显示地址。
表4.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
附录1定时闹钟仿真电路图
附录2定时闹钟的控制程序代码
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitkey4=P1^3;
sbitlcden=P2^2;
sbitlcdrs=P2^0;
sbitlcdrw=P2^1;
sbitjdq=P2^3;
sbitled=P2^4;
sbitsound=P2^5;
inta,b,i,min,hour,minge,minshi,hourge,hourshi,amin,ahour,aminge,aminshi,ahourge,ahourshi,sec,secshi,secge;
//unsignedcharcodex[]={0xFF,0xC7,0x83,0x01,0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,0xFF};
//unsignedcharcodez[]={0xFF,0xE3,0xC1,0x80,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0x7F,0xFF,0xFF};
ucharcodetable1[]={'0','1','2','3','4','5','6','7','8','9'};
ucharcodetable2[]="Time:
00:
00:
00";
ucharcodeAlarm_1[]="Alarm:
00:
00";
ucharcodenul[]="";
ucharnum1,num2;
bitflag=0;
voiddelay(unsignedintxms)//延时程序
{
uinti,j;
for(i=xms;i>0;i--)
for(j=124;j>0;j--);
}
voidwrite_com(ucharcom)//LCD命令控制,写指令函数
{
delay(5);
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_data(uchardate)//LCD数据控制,写数据函数
{
delay(5);
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidtime()//设置时间函数
{
while
(1)
{
if(key1==0)
{
delay(10);
if(key1==0)
{
if(hour==23)//"时"设置
hour=0;
else
hour++;
hourge=hour%10;
hourshi=hour/10;
write_com(0x0f);
delay
(2);
write_com(0x80+6);
write_data(table1[hourge]);//"时"个位写入LCD第二行第6位
delay(5);
write_com(0x80+5);
delay
(2);
write_data(table1[hourshi]);//"时"十位写入LCD第二行第5位
while(!
key1);
//delay
(1);
}
}
if(key2==0)
{
delay(10);
if(key2==0)
{
if(min==59)//"分"设置
min=0;
else
min++;
minge=min%10;
minshi=min/10;
write_com(0x0f);
write_com(0x80+9);
write_data(table1[minge]);//"分"个位写入LCD第二行第9位
delay
(1);
write_com(0x80+8);
write_data(table1[minshi]);//"分"十位写入LCD第二行第8位
delay
(1);
while(!
key2);
}
}
if(key3==0)
{
delay(10);
if(key3==0)
{
write_com(0x0c);//整体显示,关光标,不闪烁
TR1=1;//定时计数器1启动
while(!
key3);
break;//key3松开时,显示时间"时""分"位均已设置完毕
}
}
}
}
voidalarm()//设置闹钟时间函数
{
while
(1)
{
if(key1==0)
{
delay(10);
if(key1==0)
{
if(ahour==23)//闹钟"时"设置
ahour=0;
else
ahour++;
ahourge=ahour%10;
ahourshi=ahour/10;
write_com(0x0f);
//delay
(2);
write_com(0x80+0x40+8);
write_data(':
');
write_com(0x80+0x40+7);
write_data(table1[ahourge]);
delay
(1);
write_com(0x80+0x40+6);
//delay
(2);
write_data(table1[ahourshi]);
delay
(1);
while(!
key1);
}
}
if(key2==0)//闹钟"分"设置
{
delay(10);
if(key2==0)
{
if(amin==59)
amin=0;
else
amin++;
aminge=amin%10;
aminshi=amin/10;
write_com(0x0f);
//delay
(2);
write_com(0x80+0x40+10);
write_data(table1[aminge]);
delay
(1);
write_com(0x80+0x40+9);
//delay
(2);
write_data(table1[aminshi]);
delay
(1);
while(!
key2);
}
}
if(key3==0)
{flag=~flag;
delay(10);
if(key3==0)
{
write_com(0x0c);
write_com(0x80+0x40);
for(i=0;i<11;i++)
write_data(nul[i]);
while(!
key3);
break;//设置结束,此时LCD第二行无数据显示,只有第一行有时间显示
}
}
}
}
voidkeyscan()//键盘扫描
{
if(key1==0)
{
delay(10);
if(key1==0)
{
while(!
key1);//key1键松开后执行下一行程序
time();//调用time()函数,即时间设置
}
}
elseif(key2==0)
{
delay(10);
if(key2==0)
{
while(!
key2)
{
ahourge=ahour%10;
ahourshi=ahour/10;
write_com(0x80+0x40+7);
write_data(table1[ahourge]);
delay(5);
write_com(0x80+0x40+6);
delay
(2);
write_data(table1[ahourshi]);
aminge=amin%10;
aminshi=amin/10;
write_com(0x80+0x40+10);
write_data(table1[aminge]);
delay(5);
write_com(0x80+0x40+9);
delay
(2);
write_data(table1[aminshi]);
write_com(0x80+0x40);
for(i=0;i<11;++i)
write_data(Alarm_1[i]);//显示闹钟设置的时间
}
write_com(0x80+0x40);
for(i=0;i<11;i++)
write_data(nul[i]);//key2松开后,LCD只有第一行显示时间,闹钟设置时间不显示
}
}
elseif(key3==0)
{
delay(10);
if(key3==0)
{
while(!
key3);//表示闹钟时间设置退出
ahourge=ahour%10;
ahourshi=ahour/10;
write_com(0x80+0x40+7);
write_data(table1[ahourge]);
delay(5);
write_com(0x80+0x40+6);
delay
(2);
write_data(table1[ahourshi]);
aminge=amin%10;
aminshi=amin/10;
write_com(0x80+0x40+10);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 定时 闹钟 课程设计 作业 DOC