51单片机实现电子时钟功能1602液晶显示.docx
《51单片机实现电子时钟功能1602液晶显示.docx》由会员分享,可在线阅读,更多相关《51单片机实现电子时钟功能1602液晶显示.docx(17页珍藏版)》请在冰豆网上搜索。
51单片机实现电子时钟功能1602液晶显示
第一章设计要求及系统组成
一、基本操作时序:
读状态:
输入:
RS=L,RW=H,E=H输出:
D0~D7=状态字
写指令:
输入:
RS=L,RW=L,D0~D7=指令码,E=高脉冲输出:
无
读数据:
输入:
RS=H,RW=H,E=高脉冲输出:
D0~D7数据
写数据:
输入:
RS=H,RW=L。
D0~D7=数据,E=高脉冲输出:
无
二、、、状态字说明:
STA7D7\STA6D6\STA5D5\STA4D4\STA3D3\STA2D2\\STA1D1
STA0-6:
当前数据地址指针的数值
STA7:
读写操作使能1表示禁止,0表示允许
对控制器每次进行读写操作之前,都必须进行读写检测,确保STA7为0;但是我们可以进行延时进行实现。
RAM地址映射:
LCD16字*2行
00010203040506070808090A0B0C0D0E0F…27
4041424F50…67
指令说明:
1.初始化设置1.显示模式设置指令码:
00111000<0x38)
功能:
设置16*2显示,5*7点阵,8位数据接口
必须开显示2.显示开、关及光标设置指令码:
00001DCB,功能:
D=1开显示;D=0关显示;C=1显示光标;B=1光标闪烁;B=0光标不显示000001NS:
功能:
N=1当读或写一个字符后地址指针加1,且光标加1;N=0相应的减1;S=1当写一个字符,整屏显示左移S=0当写一个字符,正屏显示不移动。
数据控制:
控制器内部设有一个数据地址指针,用户可通过它们来访问内部的全部80字节RAM
4.2.1数据指针设置:
指令码:
80H+地址码<0-27H,第二行开始:
40H-67H)4..2.2读数据,写数据
其它设置:
01H:
显示清屏:
1.数据指令清零2所有显示清零02H:
显示回车:
1.数据清零
如何进行连接:
实际操作中,液晶接到,第一管脚是D,第二管脚是VCC,15和16是背光,D0-D7是数据口,接到单片机的P0口,P0口接了两个锁存器,液晶,D/A,具有高阻状态的都可以随便接,没有影响,,第六管脚是LCDEN相当于E,使能信号,它接P3^4,R/W接地,表示低电平,因为我们只进行写操作,RS接2实验板上的P3^5。
只需这两端口便足以控制液晶,2和3是偏压信号,一端接地,
接口信号说明:
编号:
1VSS<符号表示)电源地<引脚说明)2VDD电源正极3VL液晶显示偏压信号4RS数据/命令选择端实际操作:
:
:
先写光标程序;写两个子程序,一个写数据,一个写指令:
先进性两个宏定义,再位申明LCDEN与RS;为了电量充足。
初始化时关断数码管,定义数码管的两个锁存端,dula与wela,P2^6与P2^7,先写主函数<调用初始化函数,在调用数据子函数<’1’),从右向左滚动进来
Code:
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
1
S/C
R/L
x
x
S/R
R/L
描述
0
0
光标左移
0
1
光标右移
1
0
显示左移,光标跟着左移
1
1
显示右移,光标跟着右移
),再写初始化函数(先关断数码管,在进行显示模式设置,显示开、关及光标设置,设计数据>,接着写命令子函数writer——com<开始操作时序,写指令,P0口送的指令码,接着需要延时一段时间让E变成高电平,在持续一段时间,E再变低),它由所用的指令直接调用即可。
。
。
。
。
。
。
。
。
。
。
。
再写一个写数据的子函数writer_dataUcharcodetable[]={“”}
注意:
为了使得黑托不出现,应该屏幕全部清零writer_com(0x01>。
?
?
?
?
?
?
?
xdata:
外部地址空间
1.1设计要求
利用单片机最小系统设计一个电子时钟,显示方式为**:
**:
**,并且可以任意修改时间。
1.2系统组成
原理框图如图1.1
1602显示模块
图1.1系统原理框图
第二章系统设计方案
2.1系统设计方案
电路原理图如图2.1所示
图2.1电路原理图
2.2电路模块组成及其工作原理
2.2.1时钟电路
系统时钟源由内部时钟方式产生,时钟电路由12MH晶振和两个30PF瓷片电容组成,构成自激振荡,形成振荡源提供给单片机。
电容可在5PF到30PF之间选择,电容的大小对振荡频率有微小影响,可起频率微调作用。
时钟电路如图2.2所示
图2.2时钟电路
2.2.2复位电路
单片机复位有上电复位和手动复位两种方式,上电复位是接通电源后利用RC充电来实现复位。
手动复位是通过人为干预,强制系统复位。
复位电路如图2.3所示,可以实现上电复位和手动复位功能。
图2.3复位电路
2.2.3按键电路
在单片机的P1.0、P1.1、P1.2三个I/O口接三个简易按键,通过不断检测按键状态,识别按键的按下顺序和次数即可实现时间的任意修改。
按键电路如图2.4所示。
2.2.41602液晶显示模块电路
本设计是通过对1602液晶显示屏的控制来实现时间的显示。
1602液晶显示模块的驱动如下所述:
图2.41602液晶屏实物图
1602采用标准的16脚接口,其中:
第1脚:
VSS为地电源
第2脚:
VDD接5V正电源第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线
第15~16脚:
空脚
1602显示屏的时序图如图2.5。
图2.51602时序图
1602液晶显示屏与单片机的连线图如图2.6所示。
图2.61602与单片机连线图
第三章程序设计及其调试
3.1程序设计
程序设计如下:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitlcdrs=P2^0。
sbitlcswr=P2^1。
sbitlcden=P2^2。
sbits1=P1^0。
sbits2=P1^1。
sbits3=P1^2。
sbitrd=P3^7。
ucharcount,s1num。
charmiao,shi,fen。
ucharcodetable[]="2018-6-14TUN"。
ucharcodetable1[]="00:
00:
00"。
voiddelay(uintz>
{
uintx,y。
for(x=z。
x>0。
x-->
for(y=110。
y>0。
y-->。
}
voidwrite_com(ucharcom>
{
lcdrs=0。
lcswr=0。
P0=com。
delay(5>。
lcden=1。
delay(5>。
lcden=0。
}
voidwrite_date(uchardate>
{
lcdrs=1。
lcden=0。
P0=date。
delay(5>。
lcden=1。
delay(5>。
lcden=0。
}
voidinit(>
{
ucharnum。
lcden=0。
write_com(0x38>。
write_com(0x0c>。
write_com(0x06>。
write_com(0x01>。
write_com(0x80>。
for(num=0。
num<15。
num++>
{
write_date(table[num]>。
delay(5>。
}
write_com(0x80+0x40>。
for(num=0。
num<12。
num++>
{
write_date(table1[num]>。
delay(5>。
}
TMOD=0x01。
TH0=(65536-50000>/256。
TL0=(65536-50000>%256。
EA=1。
ET0=1。
TR0=1。
}
voidwrite_sfm(ucharadd,uchardate>
{
ucharshi,ge。
shi=date/10。
ge=date%10。
write_com(0x80+0x40+add>。
write_date(0x30+shi>。
write_date(0x30+ge>。
}
voidkeyscan(>
{
rd=0。
if(s1==0>
{
delay(5>。
if(s1==0>
{s1num++。
while(!
s1>。
if(s1num==1>
{
TR0=0。
write_com(0x80+0x40+10>。
write_com(0x0f>。
}
}
if(s1num==2>
{
write_com(0x80+0x40+7>。
}
if(s1num==3>
{
write_com(0x80+0x40+4>。
}
if(s1num==4>
{
s1num=0。
write_com(0x0c>。
TR0=1。
}
}
if(s1num!
=0>
{
if(s2==0>
{
delay(5>。
if(s2==0>
{
while(!
s2>。
if(s1num==1>
{
miao++。
if(miao==60>
miao=0。
write_sfm(10,miao>。
write_com(0x80+0x40+10>。
}
if(s1num==2>
{
fen++。
if(fen==60>
fen=0。
write_sfm(7,fen>。
write_com(0x80+0x40+7>。
}
if(s1num==3>
{
shi++。
if(shi==24>
shi=0。
write_sfm(4,shi>。
write_com(0x80+0x40+4>。
}
}
}
if(s3==0>
{
delay(5>。
if(s3==0>
{
while(!
s3>。
if(s1num==1>
miao--。
if(miao==-1>
miao=59。
write_sfm(10,miao>。
write_com(0x80+0x40+10>。
}
if(s1num==2>
{
fen--。
if(fen==-1>
fen=59。
write_sfm(7,fen>。
write_com(0x80+0x40+7>。
}
if(s1num==3>
{
shi--。
if(shi==-1>
shi=23。
write_sfm(4,shi>。
write_com(0x80+0x40+4>。
}
}
}
}
}
voidmain(>
{
init(>。
while(1>
{
keyscan(>。
}
}
voidtimer0(>interrupt1
{
TH0=(65536-50000>/256。
TL0=(65536-50000>%256。
count++。
if(count==18>
{
count=0。
miao++。
if(miao==60>
{
miao=0。
fen++。
if(fen==60>
{
fen=0。
shi++。
if(shi==24>
{
shi=0。
}
write_sfm(4,shi>。
}
write_sfm(7,fen>。
}
write_sfm(10,miao>。
}
}
3.2实验调试
实验过程中出现了很多的问题,经过反复的程序修改和调试,最终完成了本设计的要求,实现了电子时钟功能。
在电路焊接前,通过protues单片机仿真软件多次调试和仿真,得出了正确的实验结果。
Protues仿真图如图3.1所示。
图3.1protues仿真图
结论
经过两周的课程设计,不断的测试与分析,最终完成了电子时钟的设计与制作。
在实验的设计及仿真测试时,当没有得出正确的实验现象是,必须冷静、沉着的思考问题的来源,切勿太过紧张。
在电路的焊接过程,须仔细再仔细,案部分焊接导线,切勿乱了头绪。
这样才能在电路制作过程中减少许多不必要的错误。
本次设计组要是程序设计部分,在程序设计过程中,出现了很多的问题,经过和组员的多次讨论与研究、,并参阅了一些电子资料,解决的很多难题。
此课程设计主要考察了对单片机技术原理及程序设计基础等知识。
理论结合实践,使得在平时学习的单片机技术知识有了一个新的认识。
此次设计的电子时钟是一个典型的单片机应用实例。
通过本次设计,使得对单片机技术有了进一步的认识,并且对此产生了浓厚的兴趣,为以后的学习打下了坚实基础。
通过和组员的共同努力,成功的完成此次课程设计,在排除问题过程中,体验了程序设计及电路设计制作的艰辛,更能够体会到成功的喜悦。
参考文献
[1]张先庭.单片机原理、接口与C51应用程序设计.国防工出版社.2018
[2]吴立新.实用电子技术手册.机械工业出版社.2003
[3]胡汉才.单片机原理及其接口技术.北京:
清华大学出版社,2004.
附录
图1实验电路PCB图