可编程作息时间控制器设计.docx

上传人:b****8 文档编号:9173523 上传时间:2023-05-17 格式:DOCX 页数:48 大小:232.47KB
下载 相关 举报
可编程作息时间控制器设计.docx_第1页
第1页 / 共48页
可编程作息时间控制器设计.docx_第2页
第2页 / 共48页
可编程作息时间控制器设计.docx_第3页
第3页 / 共48页
可编程作息时间控制器设计.docx_第4页
第4页 / 共48页
可编程作息时间控制器设计.docx_第5页
第5页 / 共48页
可编程作息时间控制器设计.docx_第6页
第6页 / 共48页
可编程作息时间控制器设计.docx_第7页
第7页 / 共48页
可编程作息时间控制器设计.docx_第8页
第8页 / 共48页
可编程作息时间控制器设计.docx_第9页
第9页 / 共48页
可编程作息时间控制器设计.docx_第10页
第10页 / 共48页
可编程作息时间控制器设计.docx_第11页
第11页 / 共48页
可编程作息时间控制器设计.docx_第12页
第12页 / 共48页
可编程作息时间控制器设计.docx_第13页
第13页 / 共48页
可编程作息时间控制器设计.docx_第14页
第14页 / 共48页
可编程作息时间控制器设计.docx_第15页
第15页 / 共48页
可编程作息时间控制器设计.docx_第16页
第16页 / 共48页
可编程作息时间控制器设计.docx_第17页
第17页 / 共48页
可编程作息时间控制器设计.docx_第18页
第18页 / 共48页
可编程作息时间控制器设计.docx_第19页
第19页 / 共48页
可编程作息时间控制器设计.docx_第20页
第20页 / 共48页
亲,该文档总共48页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

可编程作息时间控制器设计.docx

《可编程作息时间控制器设计.docx》由会员分享,可在线阅读,更多相关《可编程作息时间控制器设计.docx(48页珍藏版)》请在冰点文库上搜索。

可编程作息时间控制器设计.docx

可编程作息时间控制器设计

信息工程学院

课程设计报告书

 

题目:

可编程作息时间控制器设计

专业:

电子信息科学与技术

班级:

学号:

学生姓名

指导教师:

 

2013年5月13日

信息工程学院课程设计任务书

学号

学生姓名

专业(班级)

设计题目

可编程作息时间控制器设计

低电压驱动蜂鸣器

5V外部稳压电源供电

1602LCD显示日期和时间

LED提示闹钟到来

(1)按照给定的时间模拟控制,实现广播、上下课打铃、灯光控制(屏幕显示)。

(2)具备日期和时钟显示。

文字报告字数大约在2000字,页数在20页左右

(1)整体设计构思

(2)查阅有关资料

(3)编写调试程序

(4)画出电路图

(5)装载程序,查看结果

[1]《单片机原理及应用(第二版)》张毅刚彭喜元彭宇北京高等教育出版社

[2]刘和平.单片机编程与入门.重庆大学出版社,,111-122

[3]陈明荧.89C51单片机课程设计实训教材.清华大学出版社,,102-118

 

指导教师签字

教研室主任签字

年月日

学生姓名:

学号:

专业(班级):

电子

课程设计题目:

可编程作息时间控制器设计

指导教师评语:

 

 

成绩:

指导教师:

年月日

信息工程学院课程设计成绩评定表

摘要

本设计是可编程作息时间控制器设计,由单片机AT89C51芯片和LCD、LED显示器,辅以必要的电路,构成一个单片机四路可调闹钟。

电子钟可采用数字电路实现,也可以采用单片机来完成。

LCD显示“时”,“分”,LED亮灯来表示闹钟的到来,定时时间到能发出警报声。

现在是自动化高度发达的时代,特别是电子类产品都是靠内部的控制电路来实现对产品的控制,达到自动运行的目的,这就需要我们这里要做的设计中的电器元件及电路的支持。

在这次设计中主要是用AT89S51来进行定时,也结合着其他辅助电路实施控制,在定时的时候,按一下控制小时的键对小时加一;按一下控制分钟的键对分钟加一;到达预设的时间,此电路就会发出报警声音提示已经到点。

关键字:

四路可调闹钟AT89C51LCD

 

 

1任务提出与方案论证

单片机型号的选择

通过对多种单片机性能的分析,最终认为AT89C51是最理想的电子时钟开发芯片。

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,而且它与MCS-51兼容,且具有4K字节可编程序存储器和1000次擦写循环,数据保留时间为10年,是最好的选择。

按键的选择

本次设计按照题目要求使用独立式按键。

由于按键较少,在修改时间或设置闹铃时间时就不能直接输入,只能通过加或减完成,稍为麻烦一些,但其程序简单。

显示器的选择

选用1602LCD液晶显示器。

计时部分的选择

如果使用时钟芯片,系统就不怕掉电且时间精确。

但这种芯片比较贵,况且,设计本系统主要是为了学习单片机程序的编写和调试以及设计硬件电路的一些方法,因此采用软件的方法来计时而没有采用价格较高的时钟芯片。

 

2总体设计

系统总框图

原理及工作过程说明

制作一个可编程作息时间控制器闹钟,当4路闹钟中的任一路到时,均会点亮灯、打铃。

如有需求,可对程序进行调整,增加闹钟的路数及到时后的处理方式。

定时闹钟的基本功能如下。

(1)显示时钟时间,格式为“时时:

分分”,并可重新设置。

(2)显示闹铃时间,格式为“时时:

分分”,且显示闪烁以便与时钟时间相区分。

闹铃时间可重新设置。

(3)程序执行后工作指示灯LED闪烁,表示时钟工作为时钟显示模式.LCD显示的初始时间为“23:

58”。

按下K2,闪烁显示的“00:

00”为闹铃的时间,单击K3又返回时钟显示模式。

时钟从“23:

58”开始计时,定时时间“00:

00”到时,继电器开关接通,控制电器的开启,且可发出声响(可控)。

时钟与闹铃时问的设置可通过4个功能按键Kl~K4实现,具体说明如下。

(1)时钟时间的设置:

首先单击Kl进入时钟设置模式。

此时每单击一下Kl,则小时增l,单击一下K2,则分钟增1,再单击K3则设置完成,返回时钟显示模式。

此时小时和分钟均已发生变化。

(2)闹铃的时间设置:

首先单击,K3进入闹铃的设置模式。

此时每单击一下Kl,则小时增1,单击一下K2,则分钟增l,最后单击.K3则设置完成,返回闹铃显示模式。

此时闹铃的小时和分钟均已发生变化。

(3)K4的功能:

闹钟更换。

(4)K2单独的功能:

显示闹铃时间。

系统电路图

3详细设计

主程序部分的设计

程序部分主要采用了程序结构的模块化设计,避免了一些函数的不必要的重复书写,使程序变得单间易懂。

程序在执行时,主程序要须通过调用子函数就可完成相应的功能。

主程序流程图如下图3-1。

图3-1主程序流程图

独立式键盘的接口电路

在单片机应用系统中,有时只需要几个简单的按键向系统输入信息。

这时,可将每个按键接在一根I/O接口线上,这种方式的连接称为独立式键盘。

每个独立式按键单独占有一根I/O接口线,每根I/O接口线的工作状态不会影响到其他I/O接口线。

这种按键接口电路配置灵活,硬件结构简单,但每个按键必须占用一根I/O接口线,I/O接口线浪费较大。

故只在按键数量不多时采用这种按键电路。

在此电路中,按键输入都采用低电平有效。

1602LCD液晶显示器

1602LCD的基本参数及引脚功能

1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图3-3-1所示:

图3-3-11602LCD尺寸图

1602LCD主要技术参数:

显示容量:

16×2个字符

芯片工作电压:

工作电流:

模块最佳工作电压:

字符尺寸:

×(W×H)mm

引脚功能说明

1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表3-1所示:

表3-1:

引脚接口说明表

编号

符号

引脚说明

编号

符号

引脚说明

1

VSS

电源地

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

BLA

背光源正极

8

D1

数据

16

BLK

背光源负极

第1脚:

VSS为地电源。

第2脚:

VDD接5V正电源。

第3脚:

VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。

第4脚:

RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:

R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。

当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。

第6脚:

E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:

D0~D7为8位双向数据线。

第15脚:

背光源正极。

第16脚:

背光源负极。

10.8.2.31602LCD的指令说明及时序

1602液晶模块内部的控制器共有11条控制指令,如表3-2所示:

表3-2:

控制命令表

序号

指令

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

读出的数据内容

1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。

(说明:

1为高电平、0为低电平)

指令1:

清显示,指令码01H,光标复位到地址00H位置。

指令2:

光标复位,光标返回到地址00H。

指令3:

光标和显示模式设置I/D:

光标移动方向,高电平右移,低电平左移S:

屏幕上所有文字是否左移或者右移。

高电平表示有效,低电平则无效。

指令4:

显示开关控制。

D:

控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:

控制光标的开与关,高电平表示有光标,低电平表示无光标B:

控制光标是否闪烁,高电平闪烁,低电平不闪烁。

指令5:

光标或显示移位S/C:

高电平时移动显示的文字,低电平时移动光标。

指令6:

功能设置命令DL:

高电平时为4位总线,低电平时为8位总线N:

低电平时为单行显示,高电平时双行显示F:

低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。

指令7:

字符发生器RAM地址设置。

指令8:

DDRAM地址设置。

指令9:

读忙信号和光标地址BF:

为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。

指令10:

写数据。

指令11:

读数据。

与HD44780相兼容的芯片时序表如下:

表3-3:

基本操作时序表

读状态

输入

RS=L,R/W=H,E=H

输出

D0—D7=状态字

写指令

输入

RS=L,R/W=L,D0—D7=指令码,E=高脉冲

输出

读数据

输入

RS=H,R/W=H,E=H

输出

D0—D7=数据

写数据

输入

RS=H,R/W=L,D0—D7=数据,E=高脉冲

输出

读写操作时序如图3-3-2和3-3-3所示:

图3-3-3读操作时序

图3-3-3写操作时序

1602LCD的RAM地址映射及标准字库表

液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。

要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,图3-3-4是1602的内部显示地址。

图3-3-41602LCD内部显示地址

例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?

这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+B(80H)=B(C0H)。

在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。

每次输入指令前都要判断液晶模块是否处于忙的状态。

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图3-3-5所示,这些字符有:

阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”

图3-3-5字符代码与图形对应图

1602LCD的一般初始化(复位)过程

延时15mS

写指令38H(不检测忙信号)

延时5mS

写指令38H(不检测忙信号)

延时5mS

写指令38H(不检测忙信号)

以后每次写指令、读/写数据操作均需要检测忙信号

写指令38H:

显示模式设置

写指令08H:

显示关闭

写指令01H:

显示清屏

写指令06H:

显示光标移动设置

写指令0CH:

显示开及光标设置

闹钟子函数

闹钟时间的判别主要是通过设定时间与实时时间对逐位对比确定是否进行闹铃。

其工作流程图如下图3-4。

图3-4

 

4总结

通过自己的不懈努力,我终于完成了设计的任务要求。

功能上基本达标:

时钟的显示,日期显示,调时功能、校时功能、闹铃功能、闹钟设功能。

其精确可以满足日常生活显示时间的需要。

在本次设计的过程中,我发现很多的问题,虽然以前没有做过这样的设计但通过这次设计我学会了很多东西,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,比如写一个程序看其功能很少认为编写程序简单,但到编程的时候才发现一些细微的知识或低级错误经常犯做不到最后常常失败,所以有些东西只有学精弄懂并且要细心才行,只学习理论有些东西是很难理解的,更谈不上掌握。

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

 

参考文献

[1]《单片机原理及应用(第二版)》张毅刚彭喜元彭宇北京高等教育出版社

[2]刘和平.单片机编程与入门.重庆大学出版社,,111-122

[3]陈明荧.89C51单片机课程设计实训教材.清华大学出版社,,102-118

附录

#include<>

#defineuintunsignedint

#defineucharunsignedchar

sbitkey1=P1^0;

sbitkey2=P1^1;

sbitkey3=P1^2;

sbitkey4=P1^3;

sbitlcden=P3^4;

sbitlcdrs=P3^5;

sbitlcdrw=P3^6;

sbitled=P2^2;

sbitsound=P2^7;

inta,b,i,min,hour,minge,minshi,hourge,hourshi,sec,secge,secshi,cnt,cnt1,nian=2013,yue=5,ri=5,

amin1=1,ahour1,aminge1,aminshi1,ahourge1,ahourshi1,

amin2=1,ahour2,aminge2,aminshi2,ahourge2,ahourshi2,

amin3=1,ahour3,aminge3,aminshi3,ahourge3,ahourshi3,

amin4=1,ahour4,aminge4,aminshi4,ahourge4,ahourshi4;

ucharcodetable1[]={'0','1','2','3','4','5','6','7','8','9'};

ucharcodetable2[]="Time:

00:

00";

ucharcodeAlarm_1[]="Alar1:

00:

00";

ucharcodeAlarm_2[]="Alar2:

00:

00";

ucharcodeAlarm_3[]="Alar3:

00:

00";

ucharcodeAlarm_4[]="Alar4:

00:

00";

ucharcoderiqi[]="2013-05-06";

ucharnum1,num2,alarm1,alarm2,alarm3,alarm4;

bitflag=0;

voiddelay(unsignedintz)//延时程序

{

uinti,j;

for(i=z;i>0;i--)

for(j=110;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;

}

voidwrite_nian(ucharadd,uintdate)//年显示函数

{

ucharqian,bai,shi,ge;

qian=date/1000;

bai=(date-1000*qian)/100;

shi=(date-qian*1000-bai*100)/10;

ge=date%10;

write_com(0x80+0x40+add);

write_data(table1[qian]);

write_data(table1[bai]);

write_data(table1[shi]);

write_data(table1[ge]);

}

voidwrite_yue(ucharadd,uchardate)//月显示函数

{

ucharshi,ge;

shi=date/10;

ge=date%10;

write_com(0x80+0x40+add);

write_data(0x30+shi);

write_data(0x30+ge);

}

voidwrite_ri(ucharadd,uchardate)//日显示函数

{

ucharshi,ge;

shi=date/10;

ge=date%10;

write_com(0x80+0x40+add);

write_data(0x30+shi);

write_data(0x30+ge);

}

voidqi()

{

write_nian(0,nian);

write_yue(5,yue);

write_ri(8,ri);

write_com(0x80+0x40+7);

write_data('-');

write_com(0x80+0x40+4);

write_data('-');

}

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第1行第6位

delay(5);

write_com(0x80+5);

delay

(2);

write_data(table1[hourshi]);//"时"十位写入LCD第1行第5位

while(!

key1);

}

}

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松开时,显示时间"时""分"位均已设置完毕

}

}

}

}

voiddisplay1()//设置闹钟1时间函数

{

while

(1)

{

if(key1==0)

{

delay(10);

if(key1==0)

{

if(ahour1==23)//闹钟"时"设置

ahour1=0;

else

ahour1++;

ahourge1=ahour1%10;

ahourshi1=ahour1/10;

write_com(0x0f);

write_com(0x80+0x40+8);

write_data(':

');

write_com(0x80+0x40+7);

write_data(table1[ahourge1]);

delay

(1);

write_com(0x80+0x40+6);

write_data(table1[ahourshi1]);

delay

(1);

while(!

key1);

}

}

if(key2==0)//闹钟"分"设置

{

delay(10);

if(key2==0)

{

if(amin1==59)

amin1=0;

else

amin1++;

aminge1=amin1%10;

aminshi1=amin1/10;

write_com(0x0f);

write_com

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

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2