80c51单片机数字钟Word文件下载.docx
- 文档编号:21454139
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:23
- 大小:662.77KB
80c51单片机数字钟Word文件下载.docx
《80c51单片机数字钟Word文件下载.docx》由会员分享,可在线阅读,更多相关《80c51单片机数字钟Word文件下载.docx(23页珍藏版)》请在冰豆网上搜索。
该数字钟仅有两个按键控制分钟和小时的校正。
关键词:
LCD1602,51单片机
第一章.绪论
1.1.系统背景
随着嵌入式技术的发展,嵌入式系统应用愈来愈广泛,单片机作为当前嵌入式系统的核心部分之一,具有体积小、速度快、功耗低、价格低廉等特点,在工业、教育、日用生活等诸多领域得到了广泛的应用,例如,在冰箱、微波炉、洗衣机等家用电器中使用单片机控制系统,可以使它们更加智能地工作;
电话、传真、打印机中可使用单片机系统控制拨号、打印;
单片机还可以在工业控制和机电一体化系统中作为核心控制部件。
市场上微型处理器的品种愈来愈多功能也愈来愈强,但是MCS-51单片机以其强大的强大的功能和很高的性价比再加之使用简单被绝大多数电子工程师所青睐,因此MCS-51单片机在非高端嵌入式开发领域占有绝大部分的市场。
1.2.嵌入式系统的优势及特点
1.专用性强。
嵌入式系统的个性化很强,其中的软件系统和硬件的结合非常紧密,一般要针对硬件进行系统的移植,即使在同一品牌、同一系列的产品中也需要根据系统硬件的变化和增减不断进行修改。
同时针对不同的任务,往往需要对系统进行较大更改,程序的编译下载要和系统相结合,这种修改和通用软件的“升级”是完全两个概念。
2.实时性好。
高实时性的系统软件(OS)是嵌入式软件的基本要求。
而且软件要求固态存储,以提高速度;
软件代码要求高质量和高可靠性
4.可靠性高。
由于有些嵌入式系统所承担的计算任务涉及产品质量、人身设各安全、国家机密等重大事务,加之有些嵌入式系统的宿主对象要工作在无人值守的场合,例如危险性高的工业环境中、内嵌有嵌入式系统的仪器仪表中、在人际罕至的气象检测系统中以及为侦察敌方行动的小型智能装置中等。
所以与普通系统相比较,对嵌入式系统可靠性的要求极高。
5.功耗低。
有很多嵌入式系统的宿主对象都是一些小型应用系统,例如移动电话、PDA、MP3、飞机、舰船、数码相机等,这些设各不可能配各容量较大的电源,因此低功耗一直是嵌入式系统最求的目标。
当然也是为了降低系统的功耗,嵌入式系统中的软件一般不存储于磁盘等载体中,而都固化在存储器芯片或单片系统的存储器之中。
1.3.LCD1602显示
液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。
这里介绍的字符型液晶模块是一种用5x7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行16个字、2行16个字、2行20个字等等,这里以常用的2行16个字的1602液晶模块来介绍它的编程方法。
1602采用标准的16脚接口,其中:
第1脚:
VSS为地电源
第2脚:
VDD接5V正电源
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15~16脚:
空脚
第二章.系统电路设计
2.1.系统硬件电路设计
2.2.
系统硬件总电路
2.3.LCD1602模块
1602LCD主要技术参数:
显示容量:
16×
2个字符
芯片工作电压:
4.5—5.5V
工作电流:
2.0mA(5.0V)
模块最佳工作电压:
5.0V
字符尺寸:
2.95×
4.35(W×
H)mm
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表所示:
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
3
VL
液晶显示偏压
11
D4
4
RS
数据/命令选择
12
D5
5
R/W
读/写选择
13
D6
6
E
使能信号
14
D7
7
D0
15
BLA
背光源正极
8
D1
16
BLK
背光源负极
1602液晶模块内部的控制器共有11条控制指令,如表10-14所示:
清显示
光标返回
*
置输入模式
I/D
S
显示开/关控制
D
C
B
光标或字符移位
S/C
R/L
置功能
DL
N
F
置字符发生存贮器地址
字符发生存贮器地址
置数据存贮器地址
显示数据存贮器地址
读忙标志或地址
BF
计数器地址
写数到CGRAM或DDRAM)
要写的数据内容
从CGRAM或DDRAM读数
读出的数据内容
第三章系统软件设计
3.1.系统软件流程图
3.1.1.主程序流程图
3.1.2.中断T0流程图
Y
3.2.系统程序设计
3.2.1.系统主程序
voidmain()
{
unchari;
ini();
ini_lcd1602();
xuanze=0;
add=0;
min=0;
sec=0;
hour=0;
TR0=1;
while
(1)
{
chuli();
send();
//送数
write_lcd1602(0x80,0);
for(i=0;
i<
=15;
i++)
write_lcd1602(data1[i],1);
}
}
3.2.2.定时中断t0子程序
voidtimer0()interrupt1using3
TH0=0x3c,TL0=0xb0;
t0++;
if(t0==20)
t0=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
{if(hour==24)
hour=0;
}
}
}
}
3.2.3.按键读取及处理
//按键读取P1.0并计数
voidkey_read_P10()
{
if(P1_0!
=1)
delay(10);
while(P1_0!
delay(10);
}
xuanze++;
if(xuanze==3)
xuanze=0;
key_read_P10()这个子程序是判断P1.0是否按下,并把按下的次数赋给xuanze,xuanze是用于标示选中分钟和小时的标志位。
Xuanze=0,则是正常计时状态;
xuanze=1,则选中分钟,此时可以通过按另外一个按键加分钟值;
xuanze=2,则是选中小时,同样可以通过另一个键更改其值。
由于只有三种情况,所以当xuanze=3时,要强制清零,但是如果添加其他功能,这里稍作更改,就可以实现。
//按键读取P1.1并计数
voidkey_read_P11()
if(P1_1!
delay(20);
while(P1_1!
delay(20);
add=1;
读P1.1口有点不同,判断P1.1口是真的按下之后,只是赋值1给add,而不是让add+1;
这里这样做是为后面更改分钟和小时的值时更加方便。
//按键值处理
voidchuli()
key_read_P10();
key_read_P11();
switch(xuanze)
case0:
TR0=1;
TR1=0;
break;
case1:
TR0=0;
TR1=1;
if(add==1)
{
add=0;
}
if(min==60)
min=0;
hour++;
break;
case2:
TR0=0;
if(hour==24)
hour=0;
break;
这一段程序是由xuanze和add的值的不同而产生不同的效果。
用switch…case语句根据xuanze的值开关计时器T0的中断,选中分钟或小时,达到时间校准的目的。
实验结果和分析
上图是用于调试的开发板,将独立键盘接到P1口,则K1、K2分别接到P1.0、P1.1,在开发板上其他连线已经连好,烧录程序进去后,数值从00:
00:
00开始,秒钟开始计数,能够实现秒钟和分钟的进位。
按键K1按下一次后,秒钟停止计数,再按K2,分钟加一,不停地按,则不停地加一,未出现误读的情况,K1键再按一次,此时按键K2校正的变为小时,当小时加到23时,再按一次跳变为00,到此时程序已基本满足设计要求。
结束语
做本次的课程设计,原本有多种选择,但是我听一位学长说过:
完整的做出一个数字钟才算是真正学会了51单片机的编程。
因为这个原因,我最终选择做数字钟这个课题,并且是用LCD1602来做显示屏。
选定后,就从网上收集相应数字钟程序和LCD1602的资料。
对照着单片机的课本还有51单片机的资料来看程序,从TMOD的初始化看起,到T0中断的各个标志位的用法和规则,再到1602的引脚定义、内部11条控制指令、内部自带字符。
看过之后,有了一些想法,就以一个三键控制数码管显示的数字钟的程序和LCD1602基本显示程序为基础编写自己的程序。
在这中间,自然遇到很多问题,例如读取键值的程序,我认为别人写的太过于麻烦,自己就进行简化的修改,但是对于用C语言编程思想还不是很熟练,想法不能很好地转化为程序,于是,我向冯老师请教了这些问题,冯老师很认真的回答了我的问题,一并指处我程序段中新手很难发现的错误,例如,判断按键是否按下程序里的延时时间应该为20ms而不是1ms,这些都来自于实际操作后得来的经验,让我收获良多。
这仅仅是一个最简易的数字钟,连闹铃都没有,但我认为这会是一个好的开始,闹钟还有万年历的功能可以在这个程序的基础上进行添加修改得来。
这会是一个开始,而不是结束。
附录
#include<
reg51.h>
intrins.h>
#defineuncharunsignedchar
#defineuintunsignedint
sbitrs=P2^6;
sbitrw=P2^5;
sbite=P2^7;
sbitP1_0=P1^0;
sbitP1_1=P1^1;
unchardata1[16]="
:
"
;
unchardata2[16];
unchart0,t1,shan;
uintsec,min,hour,xuanze,add;
//*****************初始化***********//
voidini()
TMOD=0X01,//16位计数器
TH0=0X3C,TL0=0XB0;
TH1=0X3C;
TL1=0XB0;
//定时50ms中断一次
EA=1,ET0=1,TR0=0;
ET1=1,TR1=0;
//EA=1,中断允许;
ET0、ET1等于1开int0、int1中断
//判忙
voidlcd_mang()
rs=0;
rw=1;
//读指令
e=1;
_nop_();
while(P0&
0x80);
e=0;
//1602的写
voidwrite_lcd1602(uncharcmd,unchari)//当i=0时向1602写指令,=1时写数据
lcd_mang();
rs=i;
rw=0;
P0=cmd;
//**************************延时子程序基数为1毫秒*************************************************
voiddelay(uintcount)
uintj;
while(count--!
=0)
for(j=0;
j<
80;
j++);
//1602的初始化
voidini_lcd1602()
write_lcd1602(0x38,0);
delay
(1);
write_lcd1602(0x0c,0);
write_lcd1602(0x06,0);
write_lcd1602(0x01,0);
//向数组中送数值
voidsend()
data1[15]=sec%10+'
0'
data1[14]=sec/10+'
data1[12]=min%10+'
data1[11]=min/10+'
data1[9]=hour%10+'
data1[8]=hour/10+'
//按键读取P1.0并计数
//*************定时器0的中断服务程序************************
write_lcd1602(0x80,0);
参考文献
[1]张俊谟.单片机中级教程.北京航空航天大学出版社,2011.
[2]朱战立.数据结构—使用C语言.西安:
西安交通大学出版社,2004.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 80 c51 单片机 数字
![提示](https://static.bdocx.com/images/bang_tan.gif)