定时闹钟课程设计大作业

更新时间:2023-06-12 01:10:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

微型计算机控制 技术大作业

设计题目: 院 学生姓名: 学 号: 专业班级: 指导教师:

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.3 LCD显示电路部分............................................ 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.3 LCD显示电路部分

为了获得更好的效果本设计并没有采用常见的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.1 LCD显示屏引脚说明

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 程序初始化

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

void TimeInit()

{

write_com(0x01); write_com(0x80);

//初始化1602液晶 //设置现实初始坐标

//显示年月日

for(num=0;num<9;num++) { }

write_com(0x80+0x40+6); write_date(':'); delay(5);

write_date(table[num]); 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 定时闹钟的控制程序代码

#include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit key1=P1^0;

sbit key2=P1^1; sbit key3=P1^2; sbit key4=P1^3; sbit lcden=P2^2; sbit lcdrs=P2^0; sbit lcdrw=P2^1; sbit jdq=P2^3;

sbit led=P2^4; sbit sound=P2^5; int

a,b,i,min,hour,minge,minshi,hourge,hourshi,amin,ahour,aminge,aminshi,ahourge,ahourshi,sec,secshi,secge; //unsigned

char

code

x[]={0xFF,0xC7,0x83,0x01,0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,0xFF}; //unsigned

char

code

z[]={0xFF,0xE3,0xC1,0x80,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0x7F,0xFF,0xFF};

uchar code table1[]={'0','1','2','3','4','5','6','7','8','9'}; uchar code table2[]="Time:00:00:00 " uchar code Alarm_1[]="Alarm:00:00 "; uchar code nul[]=" "; uchar num1,num2; bit flag=0;

void delay(unsigned int xms) {

;

//延时程序

uint i,j;

for(i=xms;i>0;i--) for(j=124;j>0;j--);

}

void write_com(uchar com) { }

void write_data(uchar date) { }

void time() {

while(1)

//LCD命令控制,写指令函数

delay(5) ; lcdrs=0; P0=com; delay(5); lcden=1; delay(5); lcden=0;

//LCD数据控制,写数据函数

delay(5); lcdrs=1; P0=date; delay(5); lcden=1; delay(5); lcden=0;

//设置时间函数

{

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位

}

if(key3==0) {

delay(10); if(key3==0) {

write_com(0x0c); //整体显示,关光标,不闪烁 TR1=1; //定时计数器1启动 while(!key3);

break; //key3松开时,显示时间"时"" }

delay(1); while(!key2);

分"位均已设置完毕

}

}

}

}

void alarm() //设置闹钟时间函数 {

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(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]);

break; //设置结束,此时LCD第二行无数据

显示,只有第一行有时间显示

}

}

}

}

void keyscan() {

//键盘扫描

if(key1==0) {

delay(10);

if(key1==0) {

while(!key1); //key1键松开后执行下一行程序 time(); //调用time()函数,即时间设置

}

}

else if(key2==0) {

delay(10);

if(key2==0) {

while(!key2) {

ahourge=ahour%10; ahourshi=ahour/10; write_com(0x80+0x40+7); write_data(table1[ahourge]);

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

只有第一行显示时间,闹钟设置时间不显示

}

}

else if(key3==0) {

delay(10);

if(key3==0) {

while(!key3); //表示闹钟时间设置退出

ahourge=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]); //显示闹钟设置时间

alarm(); //调用闹钟时间设置函数

}

else if(key4==0)

//以下进行闹铃开关的设置

delay(5);

if(key4==0) {

while(!key4); a=a+1;

if(a%2==0) //闹钟"on" {

}

}

}

{ } sound=1;

sound=~sound; //蜂鸣器发出3次"哗"的响声 delay(200);

else if(a%2==1) //闹钟"off" { }

sound=1;

sound=0; //蜂鸣器发出1次"哗"的响声 delay(300); sound=1; delay(300);

void lcd_init() //LCD初始化函数 {

lcden=0; lcdrw=0;

write_com(0x38); //设置8位格式,2行,5×7 write_com(0x0c); //整体显示,关光标,不闪烁 write_com(0x06); //设定输入方式,增量不转移 write_com(0x01); //清除屏幕显示 delay(2); write_com(0x80);

for(i=0;i<16;i++) {

write_data(table2[i]); //写入显示时间数据

本文来源:https://www.bwwdw.com/article/j6w1.html

Top