单片机电子时钟LCD显示Word文件下载.docx

上传人:b****6 文档编号:8683785 上传时间:2023-05-12 格式:DOCX 页数:11 大小:109.02KB
下载 相关 举报
单片机电子时钟LCD显示Word文件下载.docx_第1页
第1页 / 共11页
单片机电子时钟LCD显示Word文件下载.docx_第2页
第2页 / 共11页
单片机电子时钟LCD显示Word文件下载.docx_第3页
第3页 / 共11页
单片机电子时钟LCD显示Word文件下载.docx_第4页
第4页 / 共11页
单片机电子时钟LCD显示Word文件下载.docx_第5页
第5页 / 共11页
单片机电子时钟LCD显示Word文件下载.docx_第6页
第6页 / 共11页
单片机电子时钟LCD显示Word文件下载.docx_第7页
第7页 / 共11页
单片机电子时钟LCD显示Word文件下载.docx_第8页
第8页 / 共11页
单片机电子时钟LCD显示Word文件下载.docx_第9页
第9页 / 共11页
单片机电子时钟LCD显示Word文件下载.docx_第10页
第10页 / 共11页
单片机电子时钟LCD显示Word文件下载.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

单片机电子时钟LCD显示Word文件下载.docx

《单片机电子时钟LCD显示Word文件下载.docx》由会员分享,可在线阅读,更多相关《单片机电子时钟LCD显示Word文件下载.docx(11页珍藏版)》请在冰点文库上搜索。

单片机电子时钟LCD显示Word文件下载.docx

●K3—设置分钟。

●K4—确认完成设置。

程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00:

00:

00”,然后开始计时。

二、实验电路及功能说明

1)单片机主控制模块

以AT89C51单片机为核心进行一系列控制。

2)时钟显示模块

用1602为LCD显示模块,把对应的引脚和最小系统上的引脚相连,连接后用初始化程序对其进行简单的功能测试。

测试成功后即可为实验所用,如图:

3)时间调整电路

用4个功能键操作来设置当前时间,4个功能键接在P1.0~P1.3引脚上。

K1—进入设置现在的时间。

K2—设置小时。

K3—设置分钟。

K4—确认完成设置。

如图:

三、实验程序流程图:

主程序:

时钟主程序流程

子程序:

四、实验结果分析

实验结果及分析:

单片机的晶振可以根据要求设定。

6MHZ为和现实时间显示相同。

实验采用12MHZ晶振采用方式1定时,选取50ms采用20次中断达到一秒,采用查表方式控制LCD显示。

当烧入程序后开始运行,根据初始值设定可以观察到显示的时间,这里为了更明显观察显示数据变化把起始值设为23:

59:

50运行后显示

,K1为进入现在设置时间,当按下K1后显示

,和实验要求相比较,实现了按下K1进入现在时间设置,按下K4确认完成时间设置的功能;

不同之处:

当进入时间设置时在按下K1设置小时,再次按下K1是设置分钟。

增加功能:

进入时间设置并选择设置位置后K2键位数字增加功能,K3键为数字减小功能。

根据仿真结果能够确定编程正确,基本实现了所有功能,而且有所改进。

五、心得体会

每次做单片机实验都会有不同的等收获,而这次的实验让我感觉收获更大。

这次的实验让我巩固了以往所学,而且锻炼了自己发现问题解决问题的能力。

在编程过程,发现自己对C语言很生疏,很多技巧和函数运用都不会,通过参考资料和询问同学终于让我完成了程序,并实现了程序的功能。

这不仅提高了自己动手能力,也培养了自己的思考能力。

这次在编程过程中学到了很多新东西,特别是LCD的显示,在设定的显示字符后,正确编译后显示各种设定值,LCD显示16位字符,在最初编程时编译正确但是LCD上的显示字符有缺失,显示不完整,经过不断调试发现空格同样占据字符,只有所有字符不超过16位且位置正确时才能完整正确显示。

时间的显示需要每一个显示的位子有定义,而且要给“:

”留下特定位子。

同时编程时发现还可以显示其他如日期。

但本实验不需要且很难完成最终没实现。

在仿真过程中发现许多模型不知道名称,最后搜索了一份Proteus元件库,里边有很多元件模型的名称。

最后搭建成功了仿真模型,并且运行成功。

在这里要感谢老师在以往实验过程中不厌其烦的帮助自己解决所遇到的问题和传授一些知识和小窍门。

让我对单片机有机会加深了解,体会到了单片机的强大,学到了很多,感谢。

六、程序清单

#include<

reg51.h>

intrins.h>

#defineucharunsignedchar

#defineuintunsignedint

#defineDelayNOP(){_nop_();

_nop_();

}

sbitK1=P1^0;

//选择调整小时,分钟

sbitK2=P1^1;

//增加

sbitK3=P1^2;

//减小

sbitK4=P1^3;

sbitSPK=P3^0;

sbitRS=P2^0;

sbitRW=P2^1;

sbitE=P2^2;

ucharcodeStr1[]="

CurrentTime"

;

//一下两个字符串的串长均为16

ucharcodeStr2[]="

SetNewTime"

ucharHMS_String[]="

00:

00:

00"

//带显示的时间串

bitSettime=0;

//是否修改时间

bitChange_H_or_M=1;

//1表示修改时.0表示修改分

ucharMilliSecond,Hour=23,Minute=59,Second=50;

//延时函数

voidDelayMS(uintx)

{

uchari;

while(x--)

for(i=0;

i<

120;

i++);

}

//LCD忙状态检测

bitLCD_Busy_Check()

bitresult;

RS=0;

RW=1;

E=1;

DelayNOP();

result=(bit)(P0&

0x80);

E=0;

returnresult;

}//写LCD命令

voidLCD_Write_Command(ucharcmd)

while(LCD_Busy_Check());

//判断LCD是否忙碌

RS=0;

RW=0;

P0=cmd;

DelayNOP();

E=1;

}//设置LCD显示位置

voidLCD_Set_Pos(ucharpos)

LCD_Write_Command(pos|0x80);

//写LCD数据

voidLCD_Write_Data(uchardat)

{

//判断LCD是否忙碌

RS=1;

P0=dat;

}//LCD初始化

voidLCD_Initialize()

LCD_Write_Command(0x38);

DelayMS

(1);

LCD_Write_Command(0x0c);

LCD_Write_Command(0x06);

LCD_Write_Command(0x01);

}

//显示函数,在LCD指定的行上显示字符串

voidDisplay_String(uchar*str,ucharLineNo)

uchark;

LCD_Set_Pos(LineNo);

for(k=0;

k<

16;

k++)LCD_Write_Data(str[k]);

//时分秒显示

voidDisplay_HMS(ucharh,m,s)

if(Settime)HMS_String[3]='

>

'

//显示修改标志

elseHMS_String[3]='

'

//不显示修改标志

HMS_String[4]=h/10+'

0'

//时十位HMS_String[5]=h/10+'

HMS_String[5]=h%10+'

//时个位HMS_String[5]=h%10+'

HMS_String[7]=m/10+'

//分HMS_String[8]=m/10+'

HMS_String[8]=m%10+'

//分HMS_String[8]=m%10+'

HMS_String[10]=s/10+'

//秒HMS_String[11]=s/10+'

HMS_String[11]=s%10+'

//秒HMS_String[11]=s%10+'

Display_String(HMS_String,0x40);

//设置时间

voidChange_Time()

Settime=0;

if(K1==0)//按下k1键即进入修改状态

TR0=0;

Display_String(Str2,0x00);

//第一行提示修改时间

Settime=1;

while(Settime)

if(K1==0)//确定调整小时还是分钟

while(K1==0)

Change_H_or_M=!

Change_H_or_M;

elseif(K2==0)//增加

while(K2==0);

if(Change_H_or_M==1)

{

if(++Hour==24)Hour=0;

else

{if(++Minute==60)Minute=0;

elseif(K3==0)//减少

while(K3==0);

if(Change_H_or_M==1)

{if(--Hour==0xff)Hour=23;

else

{if(--Minute==0xff)Minute=59;

elseif(K4==0)//确定

while(K4==0);

Display_String(Str1,0x00);

//第一行还原显示str1

Settime=0;

TR0=1;

Display_HMS(Hour,Minute,Second);

}//外层While在这里结束

//定时器0中断

voidTime0()interrupt1

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

//重新装入50MS定时

if(++MilliSecond==20)//50*20=1s

MilliSecond=0;

if(++Second==60)

Second=0;

if(++Minute==60)

Minute=0;

if(++Hour==24)

Hour=0;

Minute=0;

Second=0;

}

//主函数

voidmain()

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

IE=0x82;

SPK=0;

LCD_Initialize();

//第一行显示

TR0=1;

P1=0xFF;

while

(1)

//第二行显示时分秒

DelayMS(500);

Change_Time();

//显示过程中允许修改时间

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2