资源描述
单片机课程设计
汇报题目: 基于单片机LCM1602液晶控制
—— 万年历显示设计
所在系部: 信息和电气工程
所在专业: 通信本
所在班级: 1001
姓 名 : 曹怀宝
学 号 : 3615276
指导老师: 陈勇
完成时间: 7月 3日
基于单片机LCM1602液晶控制
——万年历显示设计
1.设计目标
该设计是基于AT89C52单片机电子万年历系统,采取LCD1602液晶屏实现显示。显示年月 日星期温度等,双行显示,。显示年、月、日、星期、时间,可设置,设置功效。总而言之此时钟含有读取方便、显示直观、功效多样、电路简练、等优点,符合电子仪器仪表发展趋势,含有宽广市场前景。
2.设计原理及相关说明
设计原理:利用DS1302读取系统中日期以立即间信息,并分别利用P1.1端口和P3.3端口将相关信息传送至STC12C5A60S2 主芯片之中,利用P0端口使之显示于LCD1602液晶显示器上,四个按键分别置于P1口5、6、7端口能够对时间进行控制修改。具体请参阅第三节芯片介绍。
2.2总体设计框图
日历时钟系统设计框图图1所表示:
DS1302
At89C52
键扫描电路
LCD 1602
DS18B20
蜂鸣器
图1 电子万年历系统设计框图
3 各芯片设计及其调用
3.1 STC12C5A60S2 单片机主控模块
STC12C5A60S2介绍
STC12C5A60S2是STC生产单时钟/机器周期(1T)单片机,是高速、低功耗、超强抗干扰新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成
MAX810专用复位电路,2路PWM,8路高速10位A/D转换
1、 增强型8051CPU,1T(1024G),单时钟机器周期
2、 工作电压5.5-3.5V
3、1280字节RAM
4、通用I/O口,复位后为:准双向口/弱上拉
可设置成四种模式:准双向口/弱上拉,强推挽/强上拉,仅为输入/高阻,开漏每个I/O口驱动能力均可达成20mA,但整个芯片最大不要超出120mA
5、 有EEPROM功效
6、看门狗
7、内部集成MAX810专用复位电路
8、外部掉电检测电路
9、时钟源:外部高精度晶体/时钟,内部R/C振荡器常温下内部R/C
振荡器频率为:5.0V
单片机为:11~17MHz 3.3V
单片机为:8~12MHz 针对电机控制,强干扰场所。
对应电路图中单片机周围电路,图为89C51
用protus软件仿真图使用是89c51
3.2 LCD 1602 液晶显示模块
液晶显示模块
3.2.1引脚及接口说明
1602采取标准16脚接口,其中:
第1脚:VSS为电源地
第2脚:VDD接5V电源正极
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时能够经过一个10K电位器调整对比度)。
第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。
第6脚:E(或EN)端为使能(enable)端。
第7~14脚:D0~D7为8位双向数据端。
第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。
2 LCD1602特征
+5V电压,对比度可调 内含复位电路 提供多种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多个功效 有80字节显示数据存放器DDRAM 内建有192个5X7点阵字型字符发生器CGROM 8个可由用户自定义5X7字符发生器CGRAM
3.2.2 LCD1602模块内部结构
LCM1602内部关键寄存器有:输入/输出缓冲器,指令寄存器(Instuction Register,即IR),指令译码器,数据寄存器(Data Register,即DR),地址计数器(Address Counter,即AC),忙标识(Busy Flag,即BF)和显示数据存放器(Display Data RAM,即DDRAM),字符发生器(Character Generate ROM,即CGROM)。
其各个单元功效作用以下:
1. 输入/输出缓冲器,用于缓存输入/输出数据和控制信号。
2. 指令寄存器(IR),为八位寄存器。用于存放LCD指令、DDRAM或CGROM地址。数据输入步骤:数据存入DR,然后将该数据地址和指令存入IR,最终将该数据输入到DDRAM或CGROM。读取数据步骤:将该数据地址和指令存入IR,DR取得该地址数据。
3. 指令译码器,将IR里指令进行译码,以获取DDRAM或CGROM地址。
4. 数据寄存器(DR),连接LCM内部数据总线和缓存DDRAM或CGROM存取数据。当CPU读取DR内容后,DR能自动加载下一个地址内容。
5. 地址计数器(AC),连接LCM内部数据总线和缓存DDRAM或CGROM存取数据地址。当存取DDRAM或CGROM数据地址,AC能自动加载下一个存放地址。
6. 忙标识(BF),表示LCM目前状态。若BF=1,则表示LCM处于忙绿状态,无法接收外部数据或指令。
7. 显示数据存放器(DDRAM),存放所要显示数据ASCII码,依据该ASCII码地址,即可到CGROM里找到该字符显示编码。
8. 字符发生器(CGROM),是一个只读存放器,预制全部数据ASCII码。其存放编码表以下(表3-5):
另外,还有自定义字符发生器,串行/并行数据转换器,光标闪烁控制电路,时序产生电路,偏压产生电路,共同端驱动电路和段驱动电路等。
3.5 蜂鸣器
本设计采取是无源蜂鸣器以下图:
图13 无源蜂鸣器
3.6 键盘接口
键盘接口电路图,此次设计中,按键有3个,每个按键各占用一根I/O线,各按键相互独立,相互工作状态互不影响,用查询法完成按键功效。
图1键盘接口电路
5 EPROM
EPROM是一个含有可擦除功效,擦除后即可进行再编程ROM内存,写入前必需先把里面内容用紫外线照射它IC卡上透明视窗方法来清除掉。这一类芯片比较轻易识别,其封装中包含有“石英玻璃窗”,一个编程后EPROM芯片“石英玻璃窗”通常使用黑色不干胶纸盖住, 以预防遭到阳光直射。
EPROM芯片可反复擦除和写入,处理了PROM芯片只能写入一次弊端。EPROM芯片有一个很显著特征,在其正面陶瓷封装上,开有一个玻璃窗口,透过该窗口,能够看到其内部集成电路,紫外线透过该孔照射内部芯片就能够擦除其内数据,完成芯片擦除操作要用到EPROM擦除器。EPROM内资料写入要用专用编程器,而且往芯片中写内容时必需要加一定编程电压(VPP=12—24V,随不一样芯片型号而定)。EPROM型号是以27开头,如27C020(8*256K)是一片2M Bits容量EPROM芯片。EPROM芯片在写入资料后,还要以不透光贴纸或胶布把窗口封住,以免受到周围紫外线照射而使资料受损。 EPROM芯片在空白状态时(用紫外光线擦除后),内部每一个存放单元数据全部为1(高电平)。
4 .系统软件设计
4.1 时间程序
使用中止并定时器T0方法1,时分秒计数,采取24时钟表示法,时计满23则回0,分秒计满59则回0,键盘输入可调,为4*4对地独立键盘中某三个键,其中一个为功效键,用于调整时分秒,另外两个键用于调整数字使之上调和下调,其中日期可显示初始化程序,不可调,另外能够显示星期。
初始化时,只需经过P1口中低两位读取
5 .调试
5.1 调试步骤
调试分为硬件调试和软件调试。硬件调试关键是检验硬件电路是否有短路、断路和虚焊等,首先接上电源,电源指示灯亮了以后,检测一下单片机电源脚有没有电源输入,假如有这说明焊接无误,然后能够用万用表检验各个元器件管脚之间焊接,检验过程中需要细心和耐心。硬件调试无误后,进行软件调试。
5.2 性能分析
将程序烧入单片机后,在proteus软件中进行仿真。。经过测试制作完成后电子万年历,只有部分功效实现,它能显示年、月、日等,但显示不稳定,设计中硬件或软件有待修正。
6 .心得
首先拿到板子,依据电路图和板子,画电路图,并生成PCB图。
然后将板子焊接,注意焊接方法,避免虚焊和过分焊接。
在对芯片管脚功效和使用方法有充足了解后,依据设计要求设计硬件电路,包含单片机控制电路、存放电路、键盘扫描电路、显示电路。然后经过软件编程,实现了对年、月、日、时、分、秒、星期自动调整,用按键进行控制,用液晶模块进行显示。
用PROTUS仿真实现相关软件仿真,芯片采取最普遍89C51,用KEIL软件编写程序,编写程序前,能够先查阅网上相关资料,比如LCD芯片原理图,相关能够借鉴程序等。自己编写,然后生成hex文件,仿真实现。
用焊接好板子,将文件烧录进去,调试,查错。可能会出现LCD屏幕不显示,或出现一行黑一行白现象,可能是插反了,或驱动程序有问题,这时候需要依据实际板子需要,调整延迟时间,等等。
调试成功。电子万年历能够正常显示时间并进行时间调整,基础完成了预期要实现目标。
附录1 系统电路原理图
SCH文件——选择自上而下文件画法,可能有些器件摆放有点乱
单片机级复位电路
数码管和4*4矩阵
ISP和电源接口
LED灯
蜂鸣器和lcd屏
顶层文件
附录2,PCB图
附录四:PCB3D图
附录3 实物图
附录4 系统程序清单
/*******************************************************************************************
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#include"24c02.h"
/***********LCM1602 IO口位定义***********/
sbit RS=P2^2;
sbit RW=P2^1;
sbit EN=P2^0;
/*************独立控制按键位定义*****************************************************/
sbit key1=P1^5;//功效
sbit key2=P1^6;//加
sbit key3=P1^7;//减
/*************蜂鸣器IO口定义*****************************************************/
sbit Speaker=P2^6;//接蜂鸣器接口
sbit RedLed=P2^7;
uchar key1n,count;
uint hour,minute,second;
uchar code tab[]=" -7-2 THU ";//定义初始上电时液晶默认显示状态
/*************延时子函数,延时z毫秒*****************************************************/
void delay(uint z)
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<110;j++);
}
void di()
{
Speaker=0;
delay(400);
Speaker=1;
}
////////////////////////////////////////////////////// //
/*******************LCD1602相关子函数******************/
///////////////////////////////////////////////////////
/*************
函数功效:LCD1602写命令函数
入口参数:com
出口参数:
*****************************************************/
void write_com(uchar com)
{
RS=0;
RW=0;
EN=0;
P0=com;
delay(5);
EN=1;
delay(5);
EN=0;
}
/*************
函数功效:LCD1602写数据函数
入口参数:dat
出口参数:
*****************************************************/
void write_data(uchar dat)
{
RS=1;
RW=0;
EN=0;
P0=dat;
delay(5);
EN=1;
delay(5);
EN=0;
}
/*************
函数功效:时分秒显示函数
入口参数:
出口参数:
*****************************************************/
void DisplayTime(uchar add,uchar dat)
{
uint i,j;
i=dat/10;
j=dat%10;
write_com(0x80+0x40+add);
write_data(0x30+i);
write_data(0x30+j);
}
/*************
函数功效:LCM1602初始化
入口参数:
出口参数:
*****************************************************/
void init_LCD1602()
{
uchar i;
EN=0;
minute=0;
hour=0;
second=0;
key1n=0;
count=0;
init_24c02();
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);//日历显示固定符号从第一行第1个位置以后开始显示
for(i=0;i<15;i++)
{
write_data(tab[i]);//向液晶屏写日历显示固定符号部分
delay(5);
}
write_com(0x80+0x40+6);//写出时间显示部分两个冒号
write_data(':');
delay(5);
write_com(0x80+0x40+9);
write_data(':');
delay(5);
second=read_add(1);//首次上电从AT24C02中读取出存放数据
minute=read_add(2);
hour=read_add(3);
DisplayTime(10,second);//分别送去液晶显示
DisplayTime(7,minute);
DisplayTime(4,hour);
TMOD=0x01;//设置定时器0工作模式1
TH0=(65536-50000)/256;//定时器装初值
TL0=(65536-50000)%256;
EA=1; //开总中止
ET0=1; //开定时器0中止
TR0=1; //开启定时器0
}
/////////////////////////////////////////////////////////////////
/**************按键扫描4*4独立对地矩阵**************************/
/////////////////////////////////////////////////////////////////
/*************
函数功效:独立对地键盘扫描
入口参数:
出口参数: ;
*****************************************************/
void KeyScan()
{
if(key1==0)
{
delay(5);
if(key1==0)//第一次被按下时
{
key1n++;
while(!key1);
di();
RedLed=0;
di();
RedLed=1;
if(key1n==1)//第一次被按下时
{
TR0=0; //关闭定时器
write_com(0x80+0x40+10);//光标定位到秒位置
write_com(0x0f); //光标开始闪烁
}
if(key1n==2)//第二次按下光标闪烁定位到分钟位置
{
write_com(0x80+0x40+7);
}
if(key1n==3)//第三次按下光标闪烁定位到小时位置
{
write_com(0x80+0x40+4);
}
if(key1n==4)//第四次按下
{
key1n=0;//统计按键数清零
write_com(0x0c);//取消光标闪烁
TR0=1; //开启定时器使时钟开始走
}
}
}
if(key1n!=0)//只有功效键被按下后,增加和减小键才有效
{
if(key2==0)
{
delay(5);
if(key2==0)//增加键确定被按下
{
while(!key2);//按键释放
di();//每当有按键释放蜂鸣器发出滴声
RedLed=0;
delay(10);
RedLed=1;
if(key1n==1)//若功效键第一次按下
{
second++; //则调整秒加1
if(second==60)//若满60后将清零
second=0;
DisplayTime(10,second);//每调整一次送液晶显示一下
write_com(0x80+0x40+10);//显示位置重新回到调整处
write_add(1,second); //数据改变立即存入24C02
}
if(key1n==2)//若功效键第二次按下
{
minute++;//则调整分钟加1
if(minute==60)//若满60后将清零
minute=0;
DisplayTime(7,minute);//每调整一次送液晶显示一下
write_com(0x80+0x40+7);//显示位置重新回到调整处
write_add(2,minute);//数据改变立即存入24C02
}
if(key1n==3)//若功效键第三次按下
{
hour++;//则调整小时加1
if(hour==24)//若满24后将清零
hour=0;
DisplayTime(4,hour);;//每调整一次送液晶显示一下
write_com(0x80+0x40+4);//显示位置重新回到调整处
write_add(3,hour);//数据改变立即存入24C02
}
}
}
if(key3==0)
{
delay(5);
if(key3==0)//确定减小键被按下
{
while(!key3);//按键释放
di();//每当有按键释放蜂鸣器发出滴声
RedLed=0;
delay(10);
RedLed=1;
if(key1n==1)//若功效键第一次按下
{
second--;//则调整秒减1
if(second==-1)//若减到负数则将其重新设置为59
second=59;
DisplayTime(10,second);//每调整一次送液晶显示一下
write_com(0x80+0x40+10);//显示位置重新回到调整处
write_add(1,second);//数据改变立即存入24C02
}
if(key1n==2)//若功效键第二次按下
{
minute--;//则调整分钟减1
if(minute==-1)//若减到负数则将其重新设置为59
minute=59;
DisplayTime(7,minute);//每调整一次送液晶显示一下
write_com(0x80+0x40+7);//显示位置重新回到调整处
write_add(2,minute);//数据改变立即存入24C02
}
if(key1n==3)//若功效键第二次按下
{
hour--;//则调整小时减1
if(hour==-1)//若减到负数则将其重新设置为23
hour=23;
DisplayTime(4,hour);//每调整一次送液晶显示一下
write_com(0x80+0x40+4);//显示位置重新回到调整处
write_add(3,hour);//数据改变立即存入24C02
}
}
}
}
}
/*************
函数功效:主函数
入口参数:
出口参数:
调用子程序:
*****************************************************/
void main()
{
init_LCD1602(); //液晶屏初始化
while(1)
{
KeyScan();
}
}
/*************
函数功效:中止+键值
入口参数:
出口参数:
*****************************************************/
void timer0() interrupt 1 //取得并显示日历和时间
{
TH0=(65536-50000)/256;//再次装定时器初值
TL0=(65536-50000)%256;
count++; //中止次数累加
if(count==20) //20次50毫秒为1秒
{
count=0;
second++;
if(second==60)//秒加到60则进位分钟
{
second=0;//同时秒数清零
minute++;
if(minute==60)//分钟加到60则进位小时
{
minute=0;//同时分钟数清零
hour++;
if(hour==24)//小时加到24则小时清零
{
hour=0;
}
DisplayTime(4,hour);//小时若改变则重新写入
write_add(3,hour);//数据改变立即存入24C02
}
DisplayTime(7,minute);//分钟若改变则重新写入
write_add(2,minute);//数据改变立即存入24C02
}
DisplayTime(10,second);//秒若改变则重新写入
write_add(1,second);//数据改变立即存入24C02
}
}
展开阅读全文