用51单片机和1602液晶做的数字钟Word文档格式.docx

上传人:b****4 文档编号:16946703 上传时间:2022-11-27 格式:DOCX 页数:12 大小:677.60KB
下载 相关 举报
用51单片机和1602液晶做的数字钟Word文档格式.docx_第1页
第1页 / 共12页
用51单片机和1602液晶做的数字钟Word文档格式.docx_第2页
第2页 / 共12页
用51单片机和1602液晶做的数字钟Word文档格式.docx_第3页
第3页 / 共12页
用51单片机和1602液晶做的数字钟Word文档格式.docx_第4页
第4页 / 共12页
用51单片机和1602液晶做的数字钟Word文档格式.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

用51单片机和1602液晶做的数字钟Word文档格式.docx

《用51单片机和1602液晶做的数字钟Word文档格式.docx》由会员分享,可在线阅读,更多相关《用51单片机和1602液晶做的数字钟Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。

用51单片机和1602液晶做的数字钟Word文档格式.docx

关于51单片机的寄存器和中断功能及操作说明请查阅相关资料。

蜂鸣器的发声为单片机的一个引脚加一个三极管控制。

(1.要画出结构框图;

2.数字钟的实现方法不止一种,因此必须说明自己所设计的数字钟采用何种方法、何种原理)

实现功能:

开启装置,则在1602液晶上有左向右划过“helloworldIloveprograming”文字,之后上下两行显示年月日,星期和时间,其中年月日星期只能通过程序更改,时分秒自动从0开始计时,按秒更新,时分秒可用装置的两个按键进行调节,分别为时间设置键,数值增大键,闹钟的时间设置只能通过程序进行更改,一旦液晶显示时间和程序设定时间完全一致,蜂鸣器发声。

(1.基本功能必须实现,在基本要求的基础上可以拓展功能,如报时、校时等;

2.具体介绍所实现功能,例如用什么显示等等)

三、元器件介绍

STC89C52单片机X1,通用型1602液晶X1,无源蜂鸣器X1,8055型PNP型三极管X1,弹性小按键X3,5V电源X1,10K电阻X3,2K电阻X1,万能板或PCB板X1,30PF无极性电容X2,10μF有极性电容X1,10K滑动变阻器X1,发光二极管X1。

其中单片机和1602液晶是重点。

(1.选取的元器件名称、型号、功能等;

2.对重点的几个芯片要详细介绍。

四、电路设计

原理图由单片机最小系统模块,液晶模块,蜂鸣器模块,按键部分组成。

(1.画出电路原理图;

2.功能讲解。

五、软件设计

#include<

reg52.h>

//导入reg52.h头文件,该头文件中定义了52系列单片机内部所有的功能寄存器

#defineucharunsignedchar//宏定义

#defineuintunsignedint

ucharcodetable1[]="

helloword!

"

;

//系统开机时显示的界面

ucharcodetable2[]="

IlovePrograming"

ucharcodetable3[]="

2015-12-6sunday"

//定义日期

ucharcodetable4[]="

00:

00:

00"

//定义初始时间

ucharnum,count,hour,minute,sound,key1num;

sbitlcden=P3^4;

//液晶使能端

sbitlcdrs=P3^5;

//液晶数据/命令选择端

sbitkey1=P3^6;

//时间设置按键

sbitkey2=P3^7;

//时间增大键

sbitbeep=P2^3;

//蜂鸣器信号

voiddelay(uintk);

//延时函数

voidwrite_command(ucharcommand);

//向液晶写命令函数

voidwrite_data(uchardate);

//向液晶写数据函数

voidwrite_time(uchartime,ucharx);

//向液晶写时间

voidinit();

//初始化函数

voidkeyscan();

//键盘扫描函数

voidalarm(ucharhours,ucharminutes,ucharsounds);

//设置闹钟函数

voidmain()//主函数

{

init();

//首先初始化

while

(1)//死循环

{

keyscan();

//轮询的方式键盘扫描,一切的轮询都可用中断来处理

alarm(21,45,0);

//设定闹钟的定时时刻,参数依次为时分秒,如21:

45:

00

}

}

voidtimer()interrupt1//T0定时器/计数器中断,目的是精准设定一秒的实现

TH0=(65536-50000)/256;

//重装初值,

TL0=(65536-50000)%256;

count++;

if(count==20)//如果到了20次,说明一秒时间已到

{

count=0;

//把count清零重新计时

sound++;

if(sound==60)//秒到了60则进位一分钟

{

sound=0;

minute++;

if(minute==60)//分到了60则进位一小时

{

minute=0;

hour++;

if(hour==24)//新的一天开始

{

hour=0;

}

write_time(hour,4);

//写入小时的变化到液晶

}

write_time(minute,7);

//写入分钟的变化到液晶

}

write_time(sound,10);

//写入秒的变化到液晶

voiddelay(uintk)//延时函数

uintx,y;

for(x=k;

x>

0;

x--)

for(y=110;

y>

y--);

voidwrite_command(ucharcommand)//写命令

lcdrs=0;

//置以低电平设定为写命令模式

P1=command;

//将要写的命令送到数据总线上

delay(5);

//稍作延时以待数据稳定

lcden=1;

//给液晶使能端一高电平才能将数据总线上的数据传入液晶

//稍作延时

lcden=0;

//关闭使能端

voidwrite_data(uchardate)//写数据到液晶

lcdrs=1;

//低电平为写数据模式

P1=date;

//将数据传入数据总线

voidwrite_time(uchartime,ucharx)//用于将时分秒写入液晶数据

ucharshi,ge;

//定义十位和各位

shi=time/10;

//取time的十位

ge=time%10;

//取time的各位

write_command(0x80+0x40+x);

//定位数据指针即液晶显示的位置,根据x的不同写入的数据将在液晶上显示在不同的位置

write_data(0x30+shi);

//0x30用于将整形的数字转化为字符型的数字,写入时分秒的十位

write_data(0x30+ge);

//根据ascii码,从48即0x30起为数字,写入时分秒的个位

voidinit()//初始化函数

write_command(0x38);

//设置液晶16X2显示,5X7点阵,8位数据接口

write_command(0x0c);

//设置液晶开显示,不显示光标

write_command(0x06);

//设置液晶写一个字符后地址指针自动加1

write_command(0x01);

//设置液晶显示清零,数据指针清零

write_command(0x80);

//重新定义光标即数据指针

write_command(0x80+0x10);

//将光标定位在第一行飞显示区域地址处

for(num=0;

num<

16;

num++)

write_data(table1[num]);

//将table1写入,必须一位一位的写

delay(5);

write_command(0x80+0x50);

//将光标定位在第二行飞显示区域地址处

write_data(table2[num]);

//将table2写入,必须一位一位的写

num++)

write_command(0x18);

//液晶整屏左移指令

delay(200);

//没200ms移动一位,共移动16位,刚好简要显示的数据全部移入液晶可显示区域

//将光标定位在第一行显示区域地址处

write_data(table3[num]);

//将日期写入,必须一位一位的写

write_command(0x80+0x40);

write_data(table4[num]);

}

24;

num++)//再次整屏左移,不过要移动24位液晶才能显示0x80地址所显示的数据

TMOD=0x01;

//给定时器0装初值用于精确计时

EA=1;

//开总中断

ET0=1;

//开定时器0中断

TR0=1;

//启动定时器0

voidkeyscan()//键盘扫描函数

if(key1==0)

//按键的延时去抖

if(key1==0)

key1num++;

//时间设置键按下次数记录

while(!

key1);

//等待按键释放后才进行操作

switch(key1num)//根据key1num的不同值进行不同操作

case1:

//第一次按下

TR0=0;

//关掉定时器0使数字钟停止走时间

write_command(0x80+0x40+11);

//光标定位到秒位置

write_command(0x0f);

//光标开始闪烁提示用户调整时间

break;

case2:

write_command(0x80+0x40+8);

//光标定位到分钟位置

case3:

write_command(0x80+0x40+5);

//光标定位到小时位置

case4:

TR0=1;

//在小时位置后再一次按键,数字钟重新开始走时间,所以开定时器0中断

write_command(0x0c);

//取消光标闪烁

key1num=0;

//按键次数统计归零,用于下一次统计

if(key1num!

=0)//只有时间设置键被按下后,时间调整键才有效

if(key2==0)

delay(5);

//延时去抖

if(key2==0)

while(!

key2);

switch(key1num)//根据key1num的值确定光标的位置,从而确定对时分秒的哪一个进行调整

case1:

//设置秒的值

sound++;

if(sound==60)

sound=0;

write_time(sound,10);

write_command(0x80+0x40+11);

//将光标冲重新返回到秒的位置,因为写数据指针自动加

break;

case2:

//设置分钟的值

minute++;

if(minute==60)

minute=0;

write_time(minute,7);

write_command(0x80+0x40+8);

case3:

//设置小时的值

hour++;

if(hour==24)

hour=0;

write_time(hour,4);

write_command(0x80+0x40+5);

voidalarm(ucharhours,ucharminutes,ucharsounds)//定义闹钟提示时间

{

if(hour==hours&

&

minute==minutes&

sound==sounds)//当时分秒都满足时

beep=0;

//蜂鸣器响

(1.说明软件设计思路;

2.主程序和主要的子程序要有程序流程图;

3.各个子程序要有功能说明;

4.列出全部程序代码;

5关键代码部分要予以讲解说明。

六、设计总结

优点:

所用器件少,成本低廉。

缺点:

计时不准确。

(1.此种方法设计的数字钟的优点、缺点;

2.设计中遇到的问题和解决办法;

3.设计的心得体会。

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

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1