51单片机实现电子时钟功能1602液晶显示.docx
《51单片机实现电子时钟功能1602液晶显示.docx》由会员分享,可在线阅读,更多相关《51单片机实现电子时钟功能1602液晶显示.docx(18页珍藏版)》请在冰点文库上搜索。
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当写一个字符,整屏显示左移(N=1)或右移(N=0),以得到光标不移动而屏幕移动的效果。
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数据/命令选择端(H/L)5R/W读写选择端(H/L)6E使能信号7D0Data1/08D1Data1/09D2Data1/010D3Data1/011D4Data1/012D5Data1/013D6Data1/014D7Data1/015BLK背光源正极16BLK背光源负极
实际操作:
:
:
先写光标程序;写两个子程序,一个写数据,一个写指令:
先进性两个宏定义,再位申明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_data(lcdrs=1),需用延时子函数。
Ucharcodetable[]={“”}
注意:
为了使得黑托不出现,应该屏幕全部清零writer_com(0x01)。
?
?
?
?
?
?
?
xdata:
外部地址空间
1.1设计要求
利用单片机最小系统设计一个电子时钟,显示方式为**:
**:
**,并且可以任意修改时间。
1.2系统组成
原理框图如图1.1
图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[]="2011-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应用程序设计.国防工出版社.2011
[2]吴立新.实用电子技术手册.机械工业出版社.2003
[3]胡汉才.单片机原理及其接口技术.北京:
清华大学出版社,2004.
附录
图1实验电路PCB图
(注:
可编辑下载,若有不当之处,请指正,谢谢!
)