单片机控制的1602LCD分组独立秒表课程设计报告.docx
《单片机控制的1602LCD分组独立秒表课程设计报告.docx》由会员分享,可在线阅读,更多相关《单片机控制的1602LCD分组独立秒表课程设计报告.docx(20页珍藏版)》请在冰豆网上搜索。
单片机控制的1602LCD分组独立秒表课程设计报告
宁波工程学院
设计与讨论
课程设计报告
课题题目:
用1602LCD显示秒表
学院名称:
电子与信息工程学院
专业:
学生姓名:
3
学生姓名:
学生姓名:
指导教师:
起讫时间:
2013年1月2日至2013年1月11日
第一章技术指标
1.1整体功能要求
1.2系统结构要求
1.3设计条件
第二章整体方案设计
1.整体方框图及原理
第三章硬件设计模块
3.1相关元器件的简介
3.2晶振电路设计
3.3复位电路设计
3.4控制电路设计
3.5秒表显示电路设计
3.6整体电路图
3.7整机原件清单
第四章软件设计
第五章仿真与测试
第六章设计小结
5.1设计任务完成情况
5.2问题及改进
5.3心得体会
参考文献
第一章技术指标
1.整体功能要求
分组独立计时秒表:
设计一个单片机控制的秒表系统,利用单片机的定时器计数器定时和计数的原理,结合显示电路、LCD液晶显示器以及按键来设计计数器。
用K1键控制秒表1计时的启动与暂停,用K2键控制秒表1的复位。
用K3键控制秒表2的启动与暂停,用K4键控制秒表2的复位,每按一次按键蜂鸣器都会发出警报声。
并且秒表1,2互不影响各自计时,同时在1602LCD上显示。
2.系统结构要求:
系统结构如图2-1所示
图2-1用1602LCD设计的秒表系统框图
3.设计条件
软件要求:
uVision,protuse仿真软件
电源条件:
5V。
第二章整体方案设计
图2-1原理框图
注:
图2-1原理框图中K1键为秒表1的启动与暂停控制键,K3键为秒表1的复位键,K2为秒表2的启动与暂停控制键,K4为秒表2的复位键。
本系统中,硬件电路主要有电源电路,晶振电路,复位电路,显示电路以及一些按键电路等,本系统采用AT89C51单片机为中心器件,利用定时器计数器定时和记数的原理,结合硬件电路如电源电路,晶振电路,复位电路,显示电路,蜂鸣器电路以及一些按键电路等来设计计数器,将软、硬件有机地结合起来。
硬件系统采用PROTEUS功能来实现,简单且易于观察,在仿真中就可以观察到实际的工作状态。
第三章硬件设计模块
3.1.1AT89C51性能
AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含有4KB的可反复擦写的只读程序存储器和128字节的随机存储器。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容,由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,它为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
AT89C51功能性能:
与MCS-51成品指令系统完全兼容;4KB可编程闪速存储器;寿命:
1000次写/擦循环;数据保留时间:
10年;全静态工作:
0-24MHz;三级程序存储器锁定;128*8B内部RAM;32个可编程I/O口线;2个16位定时/计数器;5个中断源;可编程串行UART通道;片内震荡器和掉电模式。
3.1.2AT89C51各引脚功能
T89C51提供以下标准功能:
4KB的Flash闪速存储器,128B内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内震荡器及时钟电路,同时,AT89C51可降至0Hz静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作,掉电方式保存RAM中的内容,但震荡器停止工作并禁止其他所有工作直到下一个硬件复位。
AT89C51采用PDIP封装形式,引脚配置如图3所示。
图3AT89C51的引脚图
AT89C51芯片的各引脚功能为:
P0口:
这组引脚共有8条,P0.0为最低位。
这8个引脚有两种不同的功能,分别适用于不同的情况,第一种情况是89C51不带外存储器,P0口可以为通用I/O口使用,P0.0-P0.7用于传送CPU的输入/输出数据,这时输出数据可以得到锁存,不需要外接专用锁存器,输入数据可以得到缓冲,增加了数据输入的可靠性;第二种情况是89C51带片外存储器,P0.0-P0.7在CPU访问片外存储器时先传送片外存储器的低8位地址,然后传送CPU对片外存储器的读/写数据。
P0口为开漏输出,在作为通用I/O使用时,需要在外部用电阻上拉。
P1口:
这8个引脚和P0口的8个引脚类似,P1.7为最高位,P1.0为最低位,当P1口作为通用I/O口使用时,P1.0-P1.7的功能和P0口的第一功能相同,也用于传送用户的输入和输出数据。
P2口:
这组引脚的第一功能与上述两组引脚的第一功能相同即它可以作为通用I/O口使用,它的第一功能和P0口引脚的第二功能相配合,用于输出片外存储器的高8位地址,共同选中片外存储器单元,但并不是像P0口那样传送存储器的读/写数据。
P3口:
这组引脚的第一功能和其余三个端口的第一功能相同,第二功能为控制功能,每个引脚并不完全相同,如下表1所示:
表1P3口各位的第二功能
P3口各位
第二功能
P3.0
RXT(串行口输入)
P3.1
TXD(串行口输出)
P3.2
/INT0(外部中断0输入)
P3.3
/INT1(外部中断1输入)
P3.4
T0(定时器/计数器0的外部输入)
P3.5
T1(定时器/计数器1的外部输入)
P3.6
/WR(片外数据存储器写允许)
P3.7
/RD(片外数据存储器读允许)
Vcc为+5V电源线,Vss接地。
ALE:
地址锁存允许线,配合P0口的第二功能使用,在访问外部存储器时,89C51的CPU在P0.0-P0.7引脚线去传送随后而来的片外存储器读/写数据。
在不访问片外存储器时,89C51自动在ALE线上输出频率为1/6震荡器频率的脉冲序列。
该脉冲序列可以作为外部时钟源或定时脉冲使用。
:
片外存储器访问选择线,可以控制89C51使用片内ROM或使用片外ROM,
若
=1,则允许使用片内ROM,若
=0,则只使用片外ROM。
:
片外ROM的选通线,在访问片外ROM时,89C51自动在
线上产生一个负脉冲,作为片外ROM芯片的读选通信号。
RST:
复位线,可以使89C51处于复位(即初始化)工作状态。
通常89C51复位有自动上电复位和人工按键复位两种。
XTAL1和XTAL2:
片内震荡电路输入线,这两个端子用来外接石英晶体和微调电容,即用来连接89C51片内OSC(震荡器)的定时反馈回路。
3.1.31602LCD引脚接口说明
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
DataI/O
2
VDD
电源正极
10
D3
DataI/O
3
VL
液晶显示偏压信号
11
D4
DataI/O
4
RS
数据命令选择端口(H/L)
12
D5
DataI/O
5
R/W
读/写选择端(H/L)
13
D6
DataI/O
6
E
使能信号
14
D7
DataI/O
7
D1
DataI/O
15
BLA
背光源正极
8
D1
DataI/O
16
BLK
背光源负极
3.1.4引脚说明:
3脚:
VL,液晶显示偏压信号,用于调整LCD1602的显示对比度,一般会外接电位器用以调整偏压信号,此脚电压为0时可以得到最强的对比度。
4脚:
RS,数据/命令选择端,当此脚为高电平时,可以对1602进行数据字节的传输操作,而为低电平时,则是进行命令字节的传输操作。
命令字节,即是用来对LCD1602的一些工作方式作设置的字节;数据字节,即使用以在1602上显示字节。
5脚:
R/W,读写选择端。
当此脚为高电平可对LCD1602进行读数据操作,反之进
行写数据操作。
6脚:
E,使能信号,其实是LCD1602的数据控制时钟信号,利用该信号的上升沿实现对LCD1602的数据传输。
7~14脚:
8位并行数据口,使得对LCD1602的数据读写大为方便。
基本操作时序:
(1)读状态:
输入:
RS=L,RW=H,E=H;输出:
D0~D7=状态字
(2)写指令:
输入:
RS=L,RW=L,D0~D7=指令码,E=高脉冲;输出:
无
(3)读数据:
输入:
RS=H,RW=H,E=H;输出:
D0~D7=数据
(4)写数据:
输入:
RS=H,RW=L,D0~D7=数据,E=高脉冲;输出:
无
需要两个写时序:
①当我们要写指令字,设置LCD1602的工作方式时:
需要把RS置为低电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。
②当我们要写入数据字,在1602上实现显示时:
需要把RS置为高电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。
3.1.5DDRAM地址与显示位置的对应关系
1602中我们就用前16个就行了。
第二行也一样用前16个地址。
对应如下:
3.2.1晶振电路设计
如图2-3所示,这里选用12MHE的内部振荡方式,电路如下:
电容器C1,C2起稳定振荡频率,快速起振的作用,C1,C2可在20~100PF之间取,这里取20PF,接线时要使晶振振荡器尽可能接近单片机。
3.2.2复位电路设计
采用上电+按键复位电路,上电后,由于电容充电,使RST持续一段时间高电平时间。
当单片机已在运行之中时,按下复位按键也能使RST持续一段时间的高电平,从而实现上电加开关复位的操作。
这不仅能时单片机复位,而且还能使单片机的外围芯片也同时复位,当程序出现错误时,可以随时使电路复位。
复位是单片机的初始化操作。
其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。
除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位键重新启动
3.2.3控制电路设计
3.2.4秒表显示电路设计
3.2.5整体电路图
3.2.7整机原件清单
第四章软件设计
在软件设计中,一般采用模块化的程序设计方法,它具有明显的优点。
把一个多功能的复杂程序划分为若干个简单的、功能单一的程序模块,有利于程序的设计和调试,有利于程序的优化和分工,提高了程序的阅读性和可靠性,使程序的结构层次一目了然。
4.1定时器T0中断
voidTime0()interrupt1using0
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
if(++millisecond1==100)
{
millisecond1=0;
if(++second1==60)
{
second1=0;
if(++minute1==60)
{
minute1=0;
if(++hour1==24)
{
hour1=0;minute1=0;second1=0;
}
}
}
}
}
4.2定时器T1中断
voidTime1()interrupt3using1
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
if(++millisecond2==100)
{
millisecond2=0;
if(++second2==60)
{
second2=0;
if(++minute2==60)
{
minute2=0;
if(++hour2==24)
{
hour2=0;minute2=0;second2=0;
}
}
}
}
}
4.3秒表1显示
voiddisplay_s1(ucharmis,s,m,h)
{
s1_string[3]=h/10+'0';
s1_string[4]=h%10+'0';
s1_string[6]=m/10+'0';
s1_string[7]=m%10+'0';
s1_string[9]=s/10+'0';
s1_string[10]=s%10+'0';
s1_string[12]=mis/10+'0';
s1_string[13]=mis%10+'0';
Display_String(s1_string,0x00);
}
4.4秒表2显示
voiddisplay_s2(ucharmis,s,m,h)
{
s2_string[3]=h/10+'0';
s2_string[4]=h%10+'0';
s2_string[6]=m/10+'0';
s2_string[7]=m%10+'0';
s2_string[9]=s/10+'0';
s2_string[10]=s%10+'0';
s2_string[12]=mis/10+'0';
s1_string[13]=mis%10+'0';
Display_String(s2_string,0x40);
}
4.5主函数
voidmain()
{
uinttmp=0;
uinttmp1=0;
BEEP=0;
IE=0x8A;
TMOD=0x11;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
LCD_Initialize();
Display_String(str1,0x00);
P1=0xff;
while
(1)
{
if(K1==0)
{
Beep();
while(K1==0);
tmp=tmp+1;
keycount1=tmp%2;
}
if(K2==0)
{
Beep();
while(K2==0);
tmp1=tmp1+1;
keycount2=tmp1%2;
}
if(K3==0)
{
Beep();
while(K3==0);
millisecond1=0;
second1=0;
minute1=0;
hour1=0;
TR0=0;
keycount1=-1;
tmp=0;
display_s1(millisecond1,second1,minute1,hour1);
}
if(K4==0)
{
Beep();
while(K4==0);
millisecond2=0;
second2=0;
minute2=0;
hour2=0;
TR1=0;
keycount2=-1;
tmp1=0;
display_s2(millisecond2,second2,minute2,hour2);
}
switch(keycount1)
{
case1:
TR0=1;
display_s1(millisecond1,second1,minute1,hour1);
break;
case0:
TR0=0;
display_s1(millisecond1,second1,minute1,hour1);
break;
}
switch(keycount2)
{
case1:
TR1=1;
display_s2(millisecond2,second2,minute2,hour2);
break;
case0:
TR1=0;
display_s2(millisecond2,second2,minute2,hour2);
break;
}
}
}
4.6LCD控制
bitLCD_Busy_Check();
voidLCD_Initialize();
voidLCD_Set_POS(uchar);
voidLCD_Write_Command(uchar);
voidLCD_Write_Data(uchar);
voidDisplay_String(uchar*,uchar);
sbitK1=P1^0;
sbitK2=P1^1;
sbitK3=P1^2;
sbitK4=P1^3;
sbitBEEP=P3^0;
sbitLCD_RS=P2^0;
sbitLCD_RW=P2^1;
sbitLCD_EN=P2^2;
ucharkeycount1=-1;
ucharkeycount2=-1;
ucharcodestr1[]="secondcount";
uchars1_string[]="N100:
00:
00:
00";
uchars2_string[]="N200:
00:
00:
00";
ucharmillisecond1,second1,minute1,hour1;
ucharmillisecond2,second2,minute2,hour2;
第五章仿真与测试
5.1第一步:
按下K1键
第二步:
按下K2键
第三步:
按下K3键
第四步:
按下K4键
第六章设计小结
5.1设计任务完成情况
通过为期两周的课程设计,完成了本次设计的技术指标,刚开始设计的时候,由于显示电路这部分比较难搞定,所以在连接电路的时候,就会停下来设计显示电路,为了提高效率,在实际的操作中,先连好时基电路,再把控制电路连好,调测符合要求。
最后搞定显示电路的连接。
最后完成的一块电路板,它所实现的功能就是通过4个按键实现2个独立计时的秒表。
5.2设计小结
通过单片机课程设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。
创新,是要我们学会将理论很好地联系实际,并不断地去开动自己的大脑,做自己力所能及的,别人却没想到的事。
同时,更重要的是,我在这一设计过程中,学会了坚持不懈,不轻易言弃。
设计过程,也好比是我们人类成长的历程,常有一些不如意,也许这就是在对我们提出了挑战,勇敢过,也战胜了,胜利的钟声也就一定会为我们而敲响。
这个设计过程中,我遇到过许多次失败的考验,就比如,自己对实际生活中的交通秩序的不了解给整个设计带来的困扰,真想要就此罢休,然而,就在想要放弃的那一刻,我明白了,原来结果并不那么重要,我们更应该注重的是这一整个过程。
于是,我坚持了下来。
当然最终,这个设计很成功,主要体现在,程序简单易读,结构清楚,功能达到预期目标。
参考文献
彭伟《单片机C语言程序设计实训100例》
XX百科AT89C51:
XX百科1602LCD: