lcd显示的秒表.docx
- 文档编号:4566204
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:16
- 大小:342.75KB
lcd显示的秒表.docx
《lcd显示的秒表.docx》由会员分享,可在线阅读,更多相关《lcd显示的秒表.docx(16页珍藏版)》请在冰豆网上搜索。
lcd显示的秒表
1概述
1.1课题的研究意义和目的
1、通过本实验的设计初步了解单片机工作原理和各功能端口的相关设置;
2、掌握PROTEUS软件的安装和配置过程;
3、学会绘制电路原理图;
4、了解装载程序和调试;
5、PROTEUSVSM与uVision3的联调;
6、用单片机仿真软件,并进行调试;
7、掌握单片机相应的编程步骤,了解秒表相关的工作流程;
8、熟悉KEIL\PROTEUS等相关软件的使用。
2方案论证
2.1STC89C52主要功能特性
1、兼容MCS51指令系统
2、8k可反复擦写(大于1000次)FlashROM;
3、32个双向I/O口;
4、256x8bit内部RAM;
5、3个16位可编程定时/计数器中断;
6、时钟频率0-24MHz;
7、2个串行中断,可编程UART串行通道;
8、2个外部中断源,共8个中断源;
9、2个读写中断口线,3级加密位;
10、低功耗空闲和掉电模式,软件设置睡眠和唤醒功能;
11、有PDIP、PQFP、TQFP及PLCC等几种封装形式,以适应不同产品的需求。
STC89C52为8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。
功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。
主要管脚有:
XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振。
RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
P0口:
P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。
作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1口:
P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
与AT89C51不同之处是,P1.0和P1.1还可分别作为定时/计数器2的外部计数输入(P1.0/T2)和输入(P1.1/T2EX),Flash编程和程序校验期间,P1接收低8位地址。
表.P1.0和P1.1的第二功能
引脚号
功能特性
P1.0
T2,时钟输出
P1.1
T2EX(定时/计数器2)
P2口:
P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。
在访问8位地址的外部数据存储器(如执行MOVX@RI指令)时,P2口输出P2锁存器的内容。
Flash编程或校验时,P2亦接收高位地址和一些控制信号。
P3口:
P3口是一组带有内部上拉电阻的8位双向I/O口。
P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。
此时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能。
P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。
RST:
复位输入。
当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
ALE/PROG:
当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。
一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。
要注意的是:
每当访问外部数据存储器时将跳过一个ALE脉冲。
对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。
如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。
该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。
此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。
PSEN:
程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。
在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
EA/VPP:
外部访问允许。
欲使CPU仅访问外部程序存储器(地址为0000H—FFFFH),EA端必须保持低电平(接地)。
需注意的是:
如果加密位LB1被编程,复位时内部会锁存EA端状态。
如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。
Flash存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
XTAL1:
振荡器反相放大器的及内部时钟发生器的输入端。
XTAL2:
振荡器反相放大器的输出端。
2.2系统分析
设计的电路主要是能多次记时和查询时间,记时的多少通过显示电路显示出来,每一次计时可以通过控制电路查询出来。
设计框图如图2-1所示;
图2-1
3硬件系统的设计
3.1硬件介绍
根据设计要求和设计思路,硬件电路有两部分组成,即单片机按键电路,LCD显示器电路。
图2-2为硬件电路设计框图。
图2-2
系统硬件电路根据课题设计要求,它由以下几个部件组成:
单片机89C52RC、电源、时分秒显示模块。
时分秒显示采用动态扫描,以降低对单片机端口数的要求,同时也降低系统的功耗。
显示模块中时分秒显示驱动、校时模块都通过89C52RC的I/O口控制。
显示模块中的复位电路由89C52RC的RESET端控制。
电源部分:
电源部分有二部分组成。
一部分是由220V的市电通过变压、整流稳压来得到+5V电压,维持系统的正常工作;另一部分是由5V的电池供电,以保证停电时正常走时。
正常情况下电池是不提供电能的,以保证电池的寿命。
3.2部分硬件原理图
3.2.1STC89C52管脚图
如图3-1所示:
图3-1
3.2.21602LCD液晶硬件图
如图3-2所示:
图3-2
3.3最小单片机系统
如图3-3所示:
图3-3
4系统的软件设计
此部分主要介绍显示模块,显示模块是实现数字钟的重要部分,在显示时,首先将时间十进制数据转化为显示段码,然后送往液晶显示。
显示段码采用动态扫描的方式。
在要求改变显示数据的类别时,只须改变@R1(指向数据缓冲区的指针)指向的十进制数据缓冲区即可。
如图4-1所示:
图4-1
结束语
通过这次实验,我学会了熟练运用protues,keil,protel等软件,在做本次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。
为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。
其次,在这次课程设计中,我们运用到了以前所学的专业课知识。
虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获后,要做好一个课程设计,就必须做到:
在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计结束了,但是从中学到的知识会让我受益终身。
附录1protel原理图
附录2PCB图
附录3protues仿真图
附录4程序清单
#include
#include
#defineucharunsignedchar
#defineunitunsignedint
#definedelayNOP(){_nop_();_nop_();_nop_();_nop_();}
//LCD控制
voidLCD_Initialize();
voidLCD_Set_POS(uchar);
voidLCD_Write_Data(uchar);
voidDisplay_String(uchar*,uchar);
sbitK1=P1^0;
sbitK2=P1^1;
sbitBEEP=P3^0;
sbitLCD_RS=P2^0;
sbitLCD_RW=P2^1;
sbitLCD_EN=P2^2;
ucharKeyCount=0;
ucharcodemsg1[]={"SecondWatch0"};
ucharcodemsg2[]={">>>>"};
ucharcodePrompts[][16]=
{
{":
:
1---->"},
{":
:
1---->:
:
2"},
{":
:
1->2:
:
3-->"},
{":
:
1->2:
:
3-->4"}
};
//计时缓冲与显示缓冲
ucharTime_Buffer[]={0,0,0,0};
ucharLCD_Display_Buffer[]={"00:
00:
00:
00"};
//蜂鸣器
voidBeep()
{
uchari,j=70;
for(i=0;i<180;i++)
{
while(--j);BEEP=~BEEP;
}
BEEP=0;
}
//延时
voidDelayX(unitms)
{
uchari;
while(ms--)for(i=0;i<120;i++);
}
//显示计时
voidShow_Second()
{
uchari;
LCD_Set_POS(0x45);//设置LCD显示起点
for(i=3;i!
=0xff;i--)
{
//将两位整数的1/100s,秒,分,时转换为8位数字字符
LCD_Display_Buffer[2*i+1]=Time_Buffer[i]/10+'0';
LCD_Display_Buffer[2*i]=Time_Buffer[i]%10+'0';
//在i=3,2,1,0时分别显示时,分,秒,1、100s
LCD_Write_Data(LCD_Display_Buffer[2*i+1]);
LCD_Write_Data(LCD_Display_Buffer[2*i]);
LCD_Write_Data(':
');
}
}
//Time0中断
voidTime0()interrupt1using0
{
TH0=-10000/256;
TL0=-10000%256;
Time_Buffer[0]++;
if(Time_Buffer[0]==100)
{
Time_Buffer[0]=0;Time_Buffer[1]++;
}
if(Time_Buffer[1]==60)//秒
{
Time_Buffer[1]=0;Time_Buffer[2]++;
}
if(Time_Buffer[2]==60)//分
{
Time_Buffer[2]=0;Time_Buffer[3]++;
}
if(Time_Buffer[3]==24)//时
Time_Buffer[3]=0;
}
//主函数
voidmain()
{
uchari;
IE=0x82;
TMOD=0x01;
TH0=-10000/256;
TL0=-10000%256;
LCD_Initialize();
Display_String(msg1,0x00);
Display_String(msg2,0x40);
while
(1)
{
if(K1==0)
{
DelayX(100);
i=++KeyCount;
switch(i)
{
case1:
case3:
TR0=1;
Display_String(Prompts[i-1],0);
break;
case2:
case4:
TR0=0;
Display_String(Prompts[i-1],0);
break;
default:
TR0=0;
break;
}
while(K1==0);//等待释放K1键
Beep();
}
else
if(K2==0)
{
TR0=0;
KeyCount=0;
for(i=0;i<4;i++)
Time_Buffer[i]=0;//清零计时缓冲
Display_String(msg1,0);
Beep();
DelayX(100);
while(K2==0);//等待释放K2键
}
Show_Second();
}
}
//1602LCD显示驱动函数e
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineDelayNOP(){_nop_();_nop_();_nop_();_nop_();}
bitLCD_Busy_Check();
voidLCD_Initialize();
voidLCD_Set_POS(uchar);
voidLCD_Write_Command(uchar);
voidLCD_Write_Data(uchar);
//延时
voidDelayMS(uintms)
{
uchart;
while(ms--)for(t=0;t<120;t++);
}
//LCD忙检查
bitLCD_Busy_Check()
{
bitResult;
LCD_RS=0;LCD_RW=1;LCD_EN=1;DelayNOP();
Result=(bit)(P0&0x80);
LCD_EN=0;
returnResult;
}
//向LCD写指令
voidLCD_Write_Command(ucharcmd)
{
while(LCD_Busy_Check());
LCD_RS=0;LCD_RW=0;LCD_EN=0;
_nop_();_nop_();
P0=cmd;DelayNOP();
LCD_EN=1;DelayNOP();
LCD_EN=0;
}
//向LCD写数据‘
voidLCD_Write_Data(ucharstr)
{
while(LCD_Busy_Check());
LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=str;DelayNOP();
LCD_EN=1;DelayNOP();LCD_EN=0;
}
//初始化LCD
voidLCD_Initialize()
{
DelayMS(5);LCD_Write_Command(0x38);
DelayMS(5);LCD_Write_Command(0x0c);
DelayMS(5);LCD_Write_Command(0x06);
DelayMS(5);LCD_Write_Command(0x01);
DelayMS(5);
}
//设置显示位置
voidLCD_Set_POS(ucharPosition)
{
LCD_Write_Command(Position|0x80);
}
//显示函数,在LCD指令行上显示字符串
voidDisplay_String(uchar*str,ucharLineNo)
{
uchark;
LCD_Set_POS(LineNo);
for(k=0;k<16;k++)LCD_Write_Data(str[k]);
}
附录5元器件清单
序号
名称
型号
数量
1
单片机
STC89C52
1
2
排针
2.54mm单排针
2排
3
排阻
2K
1
4
瓷片电容
30pf
2
5
晶振
11.0592MHZ
1
6
单片机插座
40P
1
7
按键
1
8
万能板
双面板10cm*15cm
1
9
电解电容
10uF/16V
1
10
电阻
10K
1
11
电阻
1K
1
12
可调电阻
W103
1
13
发光二极管
红
1
14
蜂鸣器
HYDZ
1
15
PNP三极管
9012
1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- lcd 显示 秒表