单片机电子时钟1602显示ds12c887芯片资料Word下载.docx
《单片机电子时钟1602显示ds12c887芯片资料Word下载.docx》由会员分享,可在线阅读,更多相关《单片机电子时钟1602显示ds12c887芯片资料Word下载.docx(35页珍藏版)》请在冰豆网上搜索。
0~59
00~3B
00~59
1
秒闹铃
2
分
3
分闹铃
4
12小时模式
1~12
01~0CAM
81~8CPM
01~12AM
81~92PM
24小时模式
0~23
00~17
00~23
5
时闹铃,12小时制
时闹铃,24小时制
6
星期(星期日=1)
1~7
01~07
7
日
1~31
01~1F
01~31
8
月
01~0C
01~12
9
年
0~99
00~63
00~99
10
控制寄存器A
11
控制寄存器B
12
控制寄存器C
13
控制寄存器D
50
世纪
NA
19,20
3.液晶LCD1602工作原理:
LCD指令表
指令功能
控制线
数据线
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
清除屏幕
清除屏幕,并把光标移至左上角
光标回到原点
x
光标移至左上角,显示内容不变
设定进入模式
I/D
S
I/D=1:
地址递增,I/D=0:
地址递减S=1:
开启显示屏,S=0:
关闭显示屏
显示器开关
D
C
B
D=1:
开启显示幕C=1:
开启光标B=1:
光标所在位置的字符闪烁
移位方式
S/C
R/L
S/C=0、R/L=0:
光标左移;
S/C=0、R/L=1:
光标右移S/C=1、R/L=0:
字符和光标左移;
S/C=1、R/L=1:
字符和光标右移
功能设定
DL
N
F
DL=1:
数据长度为8位,DL=0:
数据长度为4位N=1:
双列字,N=0:
单列字;
F=1:
5x10字形,F=0:
5x7字形
CGRAM地址设定
CGRAM地址
将所要操作的CGRAM地址放入地址计数器
DDRAM地址设定
DDRAM地址
将所要操作的DDRAM地址放入地址计数器
忙碌标志位BF
BF
地址计数器内容
读取地址计数器,并查询LCM是否忙碌,BF表示LCM忙碌
写入数据
将数据写入CGRAM或DDRAM
读取数据
读取CGRAM或DDRAM的数据
图10-571602LCD内部显示地址
例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行
第一个字符的位置呢?
这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以
实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。
在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,
无需人工干预。
每次输入指令前都要判断液晶模块是否处于忙的状态。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,
如图10-58所示,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号、和日文假名
等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),
显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”
2.2系统总体框图及设计思路
电子时钟
液晶1602显示
人机键盘交互
计时+闹钟
总体设计思路:
本设计利用单片机P0和P2作为并行数据输入输出口,P3.0、P3.1、P3.2为功能控制键。
其中,按键功能分别控制为时钟功能选择键,增加键和减少键。
3详细设计
3.1硬件设计
1.芯片及原理介绍
(一)STC89C52
STC89C52与MCS-51单片机产品兼容、8K字节在系统可编程Flash存储器、1000次擦写周期、全静态操作:
0Hz~33MHz、三级加密程序存储器、32个可编程I/O口线、三个16位定时器/计数器八个中断源、全双工UART串行通道、低功耗空闲和掉电模式、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符。
P1口引脚
特殊功能
P1.0
T2(定时器T2外部输入)
P3口引脚
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
(外部中断0)
P3.3
(外部中断1)
P3.4
T0(定时器0外部输入)
P3.5
T1(定时器1外部输入)
P3.6
WR(外部数据存储器写选通)
P3.7
RD(外部数据存储器读先通)
STC89C52的一些特殊功能口,如下表所示:
(二)DS12C887
日历时钟芯片选用DS12C887,其引脚分布如图4所示。
图4DS12C887引脚分布图
DS12C887的内部结构框图如图5所示。
图5日历时钟芯片DS12C887内部结构框图
由图5可知,DS12C887内部可看成由电源、日历时钟信息、寄存器和存储器,以及总线接口四部分构成,四部分配合工作,共同实现芯片的功能。
[7]
DS12C887的具体引脚功能如下:
GND、VCC:
直流电源,其中VCC接+5V输入,GND接地,当VCC输入为+5V时,用户可以访问DS12C887内RAM中的数据,并可对其进行读、写操作;
当VCC的输入小于+4.25V时,禁止用户对内部RAM进行读、写操作,此时用户不能正确获取芯片内的时间信息;
当VCC的输入小于+3V时,DS12C887会自动将电源发换到内部自带的锂电池上,以保证内部的电路能够正常工作。
MOT:
模式选择脚,DS12C887有两种工作模式,即Motorola模式和Intel模式,当MOT接VCC时,选用的工作模式是Motorola模式,当MOT接GND时,选用的是Intel模式。
本设计选用其Intel模式,所以电路图中MOT端接GND。
SQW:
方波输出脚,当供电电压VCC大于4.25V时,SQW脚可进行方波输出,此时用户可以通过对控制寄存器编程来得到13种方波信号的输出。
AD0~AD7:
复用地址数据总线,该总线采用时分复用技术,在总线周期的前半部分,出现在AD0~AD7上的是地址信息,可用以选通DS12C887内的RAM,总线周期的后半部分出现在AD0~AD7上的数据信息。
AS:
地址选通输入脚,在进行读写操作时,AS的上升沿将AD0~AD7上出现的地址信息锁存到DS12C887上,而下一个下降沿清除AD0~AD7上的地址信息,不论是否有效,DS12C887都将执行该操作。
DS/RD:
数据选择或读输入脚,该引脚有两种工作模式,当MOT接VCC时,选用Motorola工作模式,在这种工作模式中,每个总线周期的后一部分的DS为高电平,被称为数据选通。
在读操作中,DS的上升沿使DS12C887将内部数据送往总线AD0~AD7上,以供外部读取。
在写操作中,DS的下降沿将使总线AD0~AD7上的数据锁存在DS12C887中;
当MOT接GND时,选用Intel工作模式,在该模式中,该引脚是读允许输入脚,即ReadEnable。
因为本设计选用Intel工作模式,所以该引脚是读允许输入脚。
R/W:
读/写输入端,该管脚也有2种工作模式,当MOT接VCC时,R/W工作在Motorola模式。
此时,该引脚的作用是区分进行的是读操作还是写操作,当R/W为高电平时为读操作,R/W为低电平时为写操作。
当MOT接GND时,该脚工作在Intel模式,此时该脚作为写允许输入,即WriteEnable。
CS:
片选输入,低电平有效。
IRQ:
中断请求输入,低电平有效,该脚有效对DS12C887内的时钟、日历和RAM中的内容没有任何影响,仅对内部的控制寄存器有影响,在典型的应用中,RESET可以直接接到VCC,这样可以保证DS12C887在掉电时,其内部控制寄存器不受影响。
(三)液晶LCD1602显示器
1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光
的厚,是否带背光在应用中并无差别
1602LCD主要技术参数:
显示容量:
16×
2个字符
芯片工作电压:
4.5—5.5V
工作电流:
2.0mA(5.0V)
模块最佳工作电压:
5.0V
字符尺寸:
2.95×
4.35(W×
H)mm
引脚功能说明
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表10-13
所示:
编号符号引脚说明编号符号引脚说明
1VSS电源地9D2数据
2VDD电源正极10D3数据
3VL液晶显示偏压11D4数据
4RS数据/命令选择12D5数据
5R/W读/写选择13D6数据
6E使能信号14D7数据
7D0数据15BLA背光源正极
8D1数据16BLK背光源负极
表10-13:
引脚接口说明表
第1脚:
VSS为地电源。
第2脚:
VDD接5V正电源。
第3脚:
VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对
比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W
共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光源正极。
第16脚:
背光源负极。
LCD寄存器的选择
E
功能说明
写入命令寄存器
写入数据寄存器
读取忙碌标志及RAM地址
读取RAM数据
X
不动作
2.硬件原理图
Sch原理图如图所示:
P0口通过连接lcd作为并行数据输入端,P2口连接DS12C887作为数据输入/输出端口,开关s1、s2、s3作为人机交互接口,时钟的控制端。
其他端口功能及控制管脚将在软件设计中提及,在此不再赘述。
3.2软件设计.
3.2.1程序设计思路
首先,程序启动应先对单片机资源进行初始化操作,其过程包括:
打开中断,对蜂鸣器标志位初始化,向ds12c887芯片写入控制字,读取芯片內相应寄存器的时间数据,并将lcd1602进行初始化,写入控制字,写入数据,完成时间日期的显示,然后进入循环中不断重复以下过程:
扫描键盘,有键盘按下则执行相应的操作,没有键盘按下则检查闹钟标志位有没有被中断触发,有的话执行响铃函数,否则进行ds12c887芯片的寄存器数据读取,向lcd1602发送相应数据并显示。
闹钟模块采用ds12c887的IRQ管脚在闹钟触发时产生低电平,触发外部中断1,蜂鸣器发声。
3.2.2程序流程图
3.2.3程序代码
1、预定义部分
//此部分定义了管脚,用到的数据表,数据格式和函数声明
#include<
reg52.h>
//头文件
#defineucharunsignedchar//数据格式宏定义
#defineuintunsignedint//数据格式宏定义
sbitrs=P3^5;
//lcd寄存器选择
sbitlcden=P3^4;
//lcd使能端
sbits1=P3^0;
//开关s1
sbits2=P3^1;
//开关s2
sbits3=P3^2;
//开关s3
sbitbeep=P1^2;
//蜂鸣器
sbitdscs=P1^4;
//ds12c887片选
sbitdsas=P1^5;
//ds12c887地址选通输入脚
sbitdsrw=P1^6;
//ds12c887读/写输入端
sbitdsds=P1^7;
//ds12c887数据选择或读输入脚
sbitdsirq=P3^3;
//ds12c887中断请求输入
ucharcount,s1num,flag,flag1;
//状态变量
charmiao,shi,fen,nian,yue,ri,xingqi,amiao,afen,ashi;
//数据变量
ucharcodetable[]="
20--"
;
//年月日显示格式
ucharcodetable1[]="
:
"
//时间显示格式
ucharcodetable2[]="
MONTHUWENTHRFRISTASUN"
//星期表,每3位为一个
ucharcodetable3[]="
ALARMON"
//开闹钟提示
ucharcodetable4[]="
ALARMOFF"
//关闹钟提示
ucharcodetable5[]="
SETALARMPUSH"
//闹钟状态选择提示
voidwrite_ds(uchar,uchar);
//函数声明
voidset_alarm(uchar,uchar,uchar);
ucharread_ds(uchar);
2、功能控制
voiddelay(uintz)//延时子函数
{uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
voidbeezzer()//蜂鸣器发声控制函数(闹钟响铃),beep=0发声
{
beep=0;
delay(50);
beep=1;
delay(100);
voidwrite_com(ucharcom)//向lcd写入控制字com,根据lcd1602时序图进行操作,rs为寄存器选择
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
voidwrite_date(uchardate)//向lcd写入数据date,根据lcd1602时序图进行操作
rs=1;
P0=date;
voidinit()//初始化单片机
ucharnum;
EA=1;
//开总中断
EX1=1;
//允许外部中断1
IT1=1;
//低电平触发
flag1=0;
write_ds(0x0A,0x20);
//向ds12c887控制寄存器A发送初始化控制字,启动振荡器
write_ds(0x0B,0x06);
//向ds12c887控制寄存器B发送初始化控制字,设定工作模式bcd,24小时制
read_ds(0x0c);
//读芯片时间数据
write_com(0x38);
write_com(0x0c);
//初始化lcd
write_com(0x06);
write_com(0x01);
write_com(0x80);
//在第一行显示数据
for(num=0;
num<
15;
num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40);
//在第二行显示数据
12;
write_date(table1[num]);
voidwrite_sfm(ucharadd,uchardate)//向lcd写入时分秒数据
ucharshi,ge;
//shi:
待发数据十位;
ge:
待发数据个位
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
voidwrite_nyr(ucharadd,uchardate)//向lcd写入年月日数据
write_com(0x80+add);
voidwrite_xingqi(ucharadd,uchardate)//向lcd写入星期数据
date=(date-1)*3;
//如星期一读表123个字母MON显示,星期二读456字母THU等等
write_date(table2[date]);
write_date(table2[++date]);
voidkeyscan()//键盘扫描子程序
if(flag1==1)
{
if(s2==0)//“加”键
if(s2==0)
{
while(!
s2);
flag1=0;
}
if(s3==0)//“减”键
{
if(s3==0)
s3);
}
if(s1==0)//功能选择键,统计按下次数在s1num中
delay(5);
if(s1==0)
s1num++;
flag=1;
flag1=0;
while(!