1课程设计总体目标
1.1 功能 由单片机AT89C51芯片和LCD显示器,辅以必要的的电路,构成一个可编程作息时间控制器。电子钟采用采用单片机来完成,LCD显示“时”,“分”,LED闪动来做秒计数,定时时间到能发出相应的提示,从而能够实现作息时间控制。现在是自动化高度发达的时代,特别是电子类产品都是靠内部的控制电路来实现对产品的控制,达到自动运行的目的,这就需要我们这里要做的设计中的电器元件及电路的支持。
(1)在keiluVision和proteus上编写软件完成设计。
(2)以AT89C51单片机为核心结合字符型LCD显示器的可编程作息时间控制器。
(3)按照给定的时间模拟控制,实现广播、上下课打铃、灯光控制(屏幕显示),同时具备日期和时钟显示。
(4)上机调试程序。
(5)写出设计报告。
1.2 总体系统结构可编程作息时间控制器是由简单的一路闹钟的基础上增加至四路可调闹钟,从而实现依次执行作息时间的提醒任务。系统主顿是由时间程序和闹钟程序所构成,由显示模块、时钟模块以及阑钟模块三大部分组成。其中时钟运算模块要对时、分、秒的数值进行操作,并且秒算到60时,要自己清零并向分进11分算到60时,要自己清零并向时进1,时算到24时,要清零,这样,才能循环记时。并在不同状态下使得四个按键有着不同的功能,从而实现系统时间的调整,同时可以在不同状态下可以调整闹钟的时间。当定时到达时LCD将显示出现在的闹钟是哪一路,响铃一分钟,并可以通过按键提前结束闹钟,恢复到时间显示状态。
使用7890单片机结合字符型LCD显示器设计一个简易的可编程作息时间控制器,若LCD选择有背光显示的模块,在夜晚或黑暗的场合中也可使用。程序执行后工作指示灯LED闪动,表示程序开始执行,同时显示系统时间。作息时间控制器是由4路可调闹钟组成,从而实现打铃等功能。当四路闹钟中的任一路到时,均会点亮灯、打铃。其中操作键KI~K4的功能分别为。设置限制的时间/时的调整、显示闹钟设置的时间/分的调整、设置闹钟的时间/设置完成、闹钟更换。
2硬件设计
2.1硬件电路芯片的选择系统主要是由AT89C51单片机、1602LCD液晶显示器以及其他重要元件组成,按键作为系统的控制输入端,可以进行时间、 闹钟等内容的设定,并通过液晶显示器显示出时间等内容。
AT89C5单片机本设计的核心硬件就是8051芯片,这里选择了AT9C51, AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(PPEROM Falsh Progr amable and Erasable Read only Me的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用AMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,AMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
引脚及其功能:
P0口: P0口为一个8位漏级开路双向I/O口,每脚可吸收STTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口.:P1口是一个内部提供上拉电阻的8位双向I70. PI口缓冲器能接收输出4TTL门电流。PI口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
P2口: P2口为一个内部上拉电阻的8位双向I/O口,P2口缓仲器可接收,输出4个TL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2 口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进时,P2口输出地址的高八位。在结出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2 口在PLAH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阳的双向1/0口,可接收输出4个TTL门电流。 当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3 口也可作为AT89051的一些特殊功能口,如下所示,
P3口管脚备选功能
P3.0 RXD(串行输入口)
P3.1 TXD( 串行输出口)
P3.2 /INTO( 外部中断0)
P3.3 /INT1(外 部中断1)
P3.4 TO(记时器 0外部输入)
P3.5 T1(记2时器1外部输入)
P3.6 /MR( 外部数据存储器写选通)
P3.7 /RD(外 部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输人编程脉冲。在平时,ALE 端以不变的领率周期输出正脉冲信号。此频率为振荡器频率的1/6。因此它可用作对外部输出的脉神或用于定时目的。然而要注意的是,每当用作外部数据存储器时,将跳过一个ALE脉神。如想禁止ALE的输出可在SFREH地址上置0。此时,ALE只有在执行MOVX,MOVC指令是ALB才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
PSEN外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
EA/VPP当/EA 保持低电平时,则在此期间外部程序存储器(000H-FFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTA1反向振荡放大器的输入及内部时钟I作电路的输入。
XTA2来自反向振荡器的输出。
P1.0口接K1按键,P1.1口接K2按键,P1.2日接K3按键,P1.3口接K4按键,P2.0口接RS口, P2.1口接RW口, P2.2口接B口,P2.3口接发光二极管D2阳极,P2.4口接发光二极管D1阳极,P2.5口接电阻R3,P3口的8个口依饮和LCD的数据口D0~D7。
LMO16L 液晶模块采用HD44780控制器。HD44780 具有简单面功能较强的指令集,可以实现字符移动、闪烁等功能。UMOLEL 与单片机MOU Micrcontroller Unit)通讯可采用8位或者4位并行传输两种方式。H44780控制器由两个8位寄存器、指令寄存器( IR)和数据寄存器(DR)、忙标志(FP)、显示数据RMDDRM)、字符发生器ROM (OCROM)、字符发生器RAM (CGRAM)、地址计数器(AC)。IR用于寄存指令码,只能写入不能读出: DR用于寄存数据,数据由内部操作自动写入CORAM和CORAM或者暂存从LCRAM和CRAM读出的数据。BF为1时,液晶模块处干内部处理模式,不响应外部操作指令和接受效据。DDRAM 用来存储显示的字符,能存储80个字符码。OGROM由8位字符码生成5*7点阵字符160种和5*10点阵字符32种,8位字符编码和字符的对应关系,可以查看参考文献[3]中的表4.CGRAM是为用户编写特殊字符留用的,它的容量仅64字节。可以自定义8个547点阵字符或者4个5*10点阵字符。AC可以存储ORA和OGRM的地址,如果地址码随指令写入IR.则IR自动把地址码装入AC. 同时选择LORAM或者CGRM单元。UMO16L 液晶模块的引脚功能见表:
第1脚,VsS为地电源。
第2脚: V0DD换5V正电源。
第3脚: VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚,RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚,R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚: B端为使能端,当已端由高电平跳变成低电平时,液品模块执行命令。
第7~14脚,00~D07为8位双向数据线。
将reepack-8的1口接电源,2"8口顺序和P3口相连接,并和LCD的数据口D1D7相接,VSS接地,VID接电源,VEE接滑动变阻器,RS口接P2.0口,RW口接P2 .1口,B口接P2.2口。
2.2外围电路
(1)独立式键盘的接口电路。在单片机应用系统中,有时只需要几个简单的按键向系统输入信息。这时,可将每个按键接在一根1/0接口线上,这种方式的连接称为独立式键盘。每个独立式按键单独占有一根I/0接口线,每根I/O接口线的工作状态不会影响到其他I/接口线 。这种按键接口电路配置灵活,硬件结构简单,但每个按键必须占用一根I/0接口线,I/0 接口线浪费较大。故只在按键数量不多时采用这种按键电路。在此电路中,按键输入都采用低电平有效。上拉电阻保证了按键断开时,I/0 接口线有确定的高电平。当I/0接口内部有上拉电阻时,外电路可以不配置上拉电阻。
(2) 蜂鸣器:将蜂鸣器的一端电源,另一端接至晶闸管集电极,当需要闹钟响时,P2.5 将发出有规律的电平使得晶闸管导通,从而使得蜂鸣器发出声响。
(3) respack-8:上拉电阻键K1~K4分别与单片机的P1.0~P1.3口相接。
3 软件设计
可编程作息时间控制器软件编程主要包括系统初始化、系统时间校正、系统时间设定、作息时间设定、响铃处理、逻辑控制以及1602LCD液晶显示,整个程序中响铃的合理处理以及显示部分是核心部分,只有处理好闹钟的及时响应才会使得整个可编程作息时间控制器按照预定的设计进行工作,同时各个模块逻辑上合理分配又将是整个功能实现的基础。
3.1各模块子程序流程3.1.1系统初始化程序
bit K1=P1^0; sbit rw=P2^1;
sbit k2=P1^1; sbit leden=P2^2;
sbit K3=P1^2; sbit LED2=P2^3;
sbit K4=P1^3; sbit led=P2^4;
sbit rs=P2^0; sbit beep=P2^5;
TH0=(65536-50000)/256; TLO= (65536-50000)%256;
此段程序主要是是定义电路的外部接口,包括KI^K4按键,LCD的rs口、rwD、广播控制端LBD2、发光二极管控制端led以及蜂呜器控制端beep.将定时器0的工作模式选择为工作方式1,同时给定时器装初值,并且开始计数。
3.1.2系统时间校正程序: fen+t;
THo=(65536-50000)/256; if(fen==60)
TL0=(65536-50000)%256; {fen=0;
aa++ shi++;
if(aa==20) if(shi==24)
{aa=0; {shi=0;}
Miao++; mite_ sfm(9, shi);
if(miao==60) write_ sfm(12, fen);}}
{miao=0;
首先初始化时定时器开始工作,当计时时间到时进入中断服务,由于方式1没有自动装初值的功能,因此需再次装入初值,每一次所定的时间为50ms,通过软件计数的方法,当计数达到20次时刚好1秒钟,如果计数不到20次,则再次给定时器装入初值,直到计数达到20次,把计数初值清零,并再次向计数器装初值,重复执行之前操作,同时分加一,并显示,如果分为60时则不显示,先清零然后将时加一,再显示分,如果时不是24时,则直接通过LCD显示出来,如果时刚好为24时,则现需要清零,然后在用LCD显示出来。
3.1.3系统时间设定程序:
if(K1==0) while(!K2);
while(!K1) fen++;
TRO=0; if(fen==60)
if (K1==0) fen=0;
shi++, if(K3==0)
if(shi==24) shi=0; TRO=1;
if (K2==0)
当K1被按下时,则修改系统的的时间,同时定时器停止工作。开始时,光标停留在分钟上,当再次按下K1时,光标将会跳到小时并且小时位的时间将会加一,如果时位的数等于24时,则自动清零,从零开始再往上加,如果按下K2键按下则分钟自动加一,如果分钟达到60时则自动清零,从零开始往上加,并通过LCD显示出此时的状态。当按下K3键时,则退出系统时间的更改,并启动定时器工作,开始通过LCD在第二行显示出修改后的时间。此程序主要的作用就是通过人为的方法来设定系统的时间,使得系统时间满足实际需要。
3.1.4作息时间设定程序
if (K3==0) if(shi2==24)
while(!K3); shi1=0;
write_ sfm(12, fen1); write_ sfm(9,shi1);
write_ sfm(9,shil); if(K2==0)
if(K2==0) {while(K2)
{write_ sfm(12, fen1); fen1++;
write sfm(9, shi1); if(fen1==60)
while(!K2); fen1=0,
write_ sfm(12, fen); write_ sfm(12, fen1),
write_ sfm(9, shi); if(K3==0)
if (K1==0) write_ sfm(12, fen);
while(!K1); write_ sfm(9, shi);
Shi1++,
由于可编程时间控制器是由四路闹钟构成的。所以只要通过逻辑上的先后顺序便可以实现,并且这四路闹钟设定上都是相同的,因此在这里将四路闹钟选择其中的第路做介绍。 当通过K4键进入闹钟设定电路后,如果处于广播的闹钟时间设定时,此时如果没有按下任何开关键,LCD将显示此时的闹钟标志“GB”并且再其后面显示现在的系统时间,在没有按下K3键之前,如果按下K2键,则LCD将显示此处闹钟时间,并且在其前面有此路标志,如“CB”,松开按键K2时,LCD将显示之前的状态,如果按下首次按下K3键,则开始修改闹钟的时间,此时光标在分钟上闪烁,此时按下K2键则修改闹钟的分钟,如果分等于60时,则自动清零,否则继续往上加:如果按下K1键则修改闹钟的小时,如果小时数等于24,则自动清零,否则继续往上加。当第二次按下K3键,则完成次闹钟的设定,并显示之前的状态,如果继续按K4键则切换到下一路闹钟.也可以进行上述的操作,或者返回系统时间界面。
3.1.5 响铃处理程序:
if((((fen=fen1)&&(shi==shi1))||(fene==fen2)&&(shi=shi2)||((fen=fen3)&&(shi==shi3))||((fen==fen4)&&(shi==shi4))&&(flag2==1))
if((fen==fen1)&&shi==shi1)&(flag2==1))
ifl((((fen=fen1)&&(shi=sh1)&&(flag2==0)||((fen-1==fen1)&&(shi==shi1)))&&(flag4==0))
if((fen==fen2)& &(shi==shi2)& (flag2==1))
if((((fen=fen2)&&(shi==shi2)&&(flag2==0))||(fen-1==fen2)&&(shi==sh2)))&&(flag4==0))
if( (fen==fen3) &&(shi==shi3)&&flag2==1))
if((((fen==fen3)&&(shi==shi3)&&(flag2==0))||((fen-1=fen3)&&(shi=shi3)))&&(flag4==0))
if( (fen=fen4)&&(shi==shi4)&&(flag2==1))
if((((fen=fen4)&&(shi==shi4)&&(flag2==0)||(fen-1==fen4)&&(shi==shi4))&& (flag4==0))
if(K4==0&&flag3==0)
当四个定时闹钟任意一路到达时,在没有按下响铃终止键K4时,flag2都等于1,此时闹钟响起,同时使得fla3等于0.在闹钟响闹完一个周期后将继续向下执行,并且根据以后程序的判定是哪一路闹钟在响闹,执行这一路所要求的内容,但是不论哪一路时间到都会响铃并且灯闪,不同的是根据判断选择出时间到的那一路并通过LCD显示出来闹钟时间及某路闹钟:此时若按下K4键,则使得flag2等于0.当进行是否闹钟响闹时将会不在响应,也就是闹钟被手动关闭,从而不需要一定要响铃一分钟后在关闭闹钟,实现手动关断闹钟的功能。当闹钟关断过后将及时跳出,并且使得LCD显示当前的时间。使得可编程时间控制器能够在响铃时能够显示当前的闹铃及时间,同时可以手动关断闹铃,并且当闹铃关断过后可以跳出当前显示返回到系统时间。
3.1.6逻辑控制while(1) {K4num++;
{if ((K4==0)&& (flag3==1)) if(K4num==5)
K4num=0; flag4=1;}
if(K4num==0) if (K4num==3)
{time() ; {xiake();
flag4=0; } flag4=1;}
if(K4num==1;) if (K4num==4)
{guangbo(); {dengkong() ;
flag4=1;} flag4=1;}
if(K4num==2) clock();}}
{shangke();
只有当没有一路闹钟响闹时才会执行此程序,因为在闹钟响闹时K4键将会作为闹钟的停止的功能键使用,所以只有在没有闹钟响闹时,K4键才会早为闹钟的更换,同时变量K4num将作为K4键所处的闹钟或者系统时间区别出来,以实现逻辑上的合理。系统刚启动时,按键K4处于系统时间状态,在此状态下可以利用之前所介绍的功能进行所需要的修改,当第一次按下K4键时,就会进入广播定时的控制口,此时可以根据需要修改所要定的时间,并可以显示自己所定的闹钟时间,再次按下K4键时,将会进入上课定时的闹钟,和之前的闹钟一样,可以进行相同的操作,当再次按下K4键时将进入下课闹铃状态,然后将要进入的的是灯光控制定时,此时Knum4为4,当再次按下K4键时,将经过判断清零,重新开始,以此来实现按键K4可以更换闹钟的功能,同时更改闹钟时间的功能。
3.1.71602LC液晶显示VSS引脚接地,VDD提供电源,VEE接滑动变阻器来控制液晶屏的对比度。RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
程序:
void write_ com (uchar com) void write_ date (uchar date)
{rs=0; {rs=1;
rw=0; rw=0;
lcden=0; lcden=0;
P3=com, P3=date;
lcden=1; lcden=1;
lc den=0; } lcden=0; }
当需要将内容显示到LCD显示器上之前,首先要向液晶显示器输入写命令函数,有上硬件分析可以得到LCD液晶显示上一排地址从80H'SFH,-共16位,下面一排地址从COH~CFH,同样是16位,所以在进行液晶显示之前首先确定要将结果在哪一位上显示,然后在调用液晶写数据函数,只有两者结合使用才会得到想要的结果。
4心得通过此次的单片机课程设计让我学到了许多新的知识,让我受益匪浅,其中对1602LCD液晶显示器有了非常深刻的认识。