1602lcd显示的秒表1.docx
《1602lcd显示的秒表1.docx》由会员分享,可在线阅读,更多相关《1602lcd显示的秒表1.docx(16页珍藏版)》请在冰豆网上搜索。
![1602lcd显示的秒表1.docx](https://file1.bdocx.com/fileroot1/2023-1/12/7567dbb0-0ab5-42d1-84f9-8858ac97e9cc/7567dbb0-0ab5-42d1-84f9-8858ac97e9cc1.gif)
1602lcd显示的秒表1
1602lcd显示的秒表
(1)
1602lcd显示的秒表
(1)
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