ds1032时钟.docx
《ds1032时钟.docx》由会员分享,可在线阅读,更多相关《ds1032时钟.docx(23页珍藏版)》请在冰豆网上搜索。
ds1032时钟
一.STC89C52单片机//摘抄于网络
STC89C52RC单片机是宏晶科技推出的新一代高速、低功耗、超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟、机器周期和6时钟、机器周期可以任意选择。
主要特性如下:
●增强型8051单片机,6时钟、机器周期和12时钟、机器周期可以任意选择,指令代码完全兼容传统8051单片机。
●工作电压:
5.5V~3.3V
●工作频率范围:
0~44MHz。
●用户应用程序空间为8K字节
●片上集成512字节RAM
●通用I/O口32个,复位后为:
P1/P2/P3/P4是准双向口/弱上位,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。
●ISP(在系统可编程)/IAP(再应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RXD/P3.0,TXD/P3.1)直接下载用户程序,数秒即可完成一片。
●具有EEPROM功能
●具有看门狗功能
●共3个16位定时器/计数器。
及定时器T0、T1、T2
●外部中断4路,下降沿中断或低电平触发电路,PowerDown模式可由外部中断低电平触发中断方式唤醒
●通用异步串行口(UART),还可用定时器实现多个UART
●工作温度范围:
-40~+85度(工业级)/0~75度(商业级)
●PDIP封装
图1-1引脚图
(1)STC89C52单片机资源
表一STC89C52主要功能
主要功能特性
兼容MCS51指令系统
8K可反复擦写FlashROM
32个双向I/O口
256x8bit内部RAM
3个16位可编程定时/计数器中断
时钟频率0-24MHz
2个串行中断
可编程UART串行通道
2个外部中断源
共6个中断源
2个读写中断口线
3级加密位
低功耗空闲和掉电模式
软件设置睡眠和唤醒功能
(2)复位信号及其产生
RST引脚是复位信号的输入端。
复位信号是高电平有效,其有效时间应持续24个振荡周期(即二个机器周期)以上。
若使用颇率为12MHz的晶振,则复位信号持续时间应超过4us才能完成复位操作。
复位电路如图所示
图1-2复位电路
(4)时钟电路
STC89C52内部有一个用于构成振荡器的高增益反相放大器,引脚RXD和TXD分别是此放大器的输入端和输出端。
时钟可以由内部方式产生或外部方式产生。
内部方式的时钟电路如图所示,在RXD和TXD引脚上外接定时元件,内部振荡器就产生自激振荡。
定时元件通常采用石英晶体和电容组成的并联谐振回路。
晶体振荡频率可以在1.2~12MHz之间选择,电容值在5~30pF之间选择,电容值的大小可对频率起微调的作用。
图1-3内部时钟方式电路
二.MAX232//摘抄于网络
芯片是专门为电脑的RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。
图2-1MAX232引脚图
引脚介绍:
第一部分是电荷泵电路。
由1、2、3、4、5、6脚和4只电容构成。
功能
是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。
第二部分是数据转换通道。
由7、8、9、10、11、12、13、14脚构成两
个数据通道。
其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)
为第一数据通道;8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道;TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9插头;DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。
第三部分是供电。
15脚GND、16脚VCC(+5v)。
主要特点:
1、符合所有的RS-232C技术标准
2、只需要单一+5V电源供电
3、片载电荷泵具有升压、电压极性反转能力,能够产生+10V和-10V电
压V+、V-
4、功耗低,典型供电电流5mA
5、内部集成2个RS-232C驱动器
6、内部集成两个RS-232C接收器下图为MX232双串口的连接图,可以分别接单片机的串行通信口或者实验板的其它串行通信接口,保证了能正常的下载调试程序,设计单片机与PC间通信接口电路
7、程序下载口芯片及电路:
STC89C52单片机支持SPI技术,可以通过3根线进行在线下载。
MAX232是下载口电路的核心芯片,它完成计算机与单片机电平一致的转换。
其电路如图所示:
图2-2程序下载口电路
三.时钟电路DS1302//摘抄与网络
3.1DS1302控制字的介绍
表3-1DS1302控制字的介绍
7
6
5
4
3
2
1
0
1
RAM/
A4
A3
A2
A1
A0
RD/
控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。
位6:
如果为0,则表示存取日历时钟数据,为1表示存取RAM数据:
位5至位1(A4~A0):
指示操作单元的地址;
位0(最低有效位):
如为0,表示要进行写操作,为1表示进行读操作。
读数据:
读数据时在紧跟8位的控制宇指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据是从最低位到最高位。
写数据:
控制字总是从最低位开始输出。
在控制字指令输入后的下一个SCLK时钟的上升沿时数据被写入DS1302,数据输入也是从最低位(0位)开始。
位0(最低有效位):
为1表示进行读操作。
如为0,表示要进行写操作,控制字后SCLK下降沿读数据SCLK上升沿写数据。
3.2DS1302的数据输入和输出控制
(1)复位以及时钟控制:
所有的数据传输在R5T置一时进行(反复强调),RST输入信号有两种功能:
首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。
上电运行时,在Vcc>=2.5V之前,RS'T必须保持低电平。
只有在SCLK为低电平时,才能将RST为高电平。
I/O为串行数据输入输出端(双向),后面有详细说明。
SCLK始终是输入端。
(2)数据输入:
经过8个时钟周期的控制字节的输入,一个字节的输入将在下8个时钟周期
的上升沿完成,数据传输从字节最低位开始。
(3)数据输出:
经过8个时钟周期的控制读指令的输入,控制指令串行输入后,一个字节的数据
将在下个8个时钟周期的下降沿被输出,注意第一位输出是在最后一位控制指令
所在脉冲的下降沿被输出,要求RST保持位高电平。
3.3DS1302单字节读写时序介绍
图3-1DS1302单字节读写时序介绍
DS1302的数据读写是通过I/O串行进行的。
当进行一次读写操作时最少得
读写两个字节,第一个字节是控制字节,就是一个命令,告诉DS1302是读还是写操作,是对RAM还是对CLOK寄存器操作,以及操作的址。
第二个字节就是要读或写的数据了。
我们先看单字节写:
在进行操作之前先得将CE(也可说是RST)置高电平,然后单片机将控制字的位0放到I/O上,当I/O的数据稳定后,将SCLK置高电平,DS130检测到SCLK的上升沿后就将I/O上的数据读取,然后单片机将SCLK置为低电平,再将控制字的位1放到I/D上,如此反复,将一个字节控制字的8个位传给DS1302。
接下来就是传一个字节的数据给DS1302,当传完数据后,单片机将CE置为低电平,操作结束。
单字节读操作的一开始写控制字的过程和上面的单字节写操作是一样,但是
单字节读操作在写控制字的最后一个位,SCLK还在高电平时,DS1302就将数据放到I/O上,单片机将SCLK置为低电平后数据锁存,单机机就可以读取I/O上
的数据。
如此反复,将一个字节的数据读入单片机。
读与写操作的不同就在一于,写操作是在SCLK低电平时单片机将数据放到IO上,当SCLK上升沿时,DS1302读取。
而读操作是在SCLK高电平时DS1302放数据到IO上,将SCLI}置为低电平后,单片机就可从IO上读取数据。
3.4DS1302操作指令介绍
表3-2DS1302操作指令介绍
寄存器名
命令字
取值范围
各位内容
写操作
读操作
7
6
5
4
3
2
1
0
秒寄存器
80H
81H
00~59
CH
10SEC
SEC
分寄存器
82H
83H
00~59
0
10MIN
MIN
时寄存器
84H
85H
01~12或00~23
12/
0
10
HR
HR
日寄存器
86H
87H
01~28,29,30,31
0
0
10DATE
DATE
月寄存器
88H
89H
01~12
0
0
0
10M
MONTMONTHH
周寄存器
8AH
8BH
01~07
0
0
0
0
0
DAY
年寄存器
8CH
8DH
00~99
10YEAR
YEAR
操作说明:
(1)首先要通过8EH将写保护去掉,将日期,时间的初值写时各个寄存器。
(2)然后就可以对80H,82H.84H,86H,88H.8AH,8CH进行初值的写入。
同时也通过秒寄存器将位7的CH值改成0,这样DS1302就开始走时运了。
(3)将写保护寄存器再写为80H,防止误改写寄存器的值。
(4)不断读取80H一8CH的值,将它们格式化后显示到1602LCD液晶上
四.1602液晶//51单片机C语言教程摘抄
本实验使用的1602液晶为5V电压驱动,带背光,可显示两行,每行16个字符,不能显示汉字,内置含128个字符的ASCII字符库,只有并行接口,无串行接口。
4.1接口信号说明
表4-1引脚说明
编号
符号
引脚说明
编号
符号
引脚说明
1
Vss
电源地
9
D2
数据口
2
VDD
电源正极
10
D3
数据口
3
VO
液晶显示对比度调节端
11
D4
数据口
4
RS
数据/命令选择端(H/L)
12
D5
数据口
5
R/
读写选择端(H/L)
13
D6
数据口
6
E
使能信号
14
D7
数据口
7
D0
数据口
15
BLA
背光电源正极
8
DI
数据口
16
BLK
背光电源负极
4.2主要技术参数
表4-21602液晶主要技术参数
显示容量
16×2个字符
芯片工作电压
4.5~5.5V
工作电流
2.0mA(5.0V)
模块最佳工作电压
5.0V
字符尺寸
2.95×4.35(W×H)mm
4.3基本操作时序
读状态输入:
RS=L,R/
=H,E=H
输出:
D0~D7=状态字。
读数据输入:
RS=H,R/
=H,E=H
输出:
无。
写指令输入:
RS=L,R/
=L,:
D0~D7=指令码,E=高脉冲
输出:
D0~D7=数据。
写数据输入:
RS=H,R/
=L,:
D0~D7=数据,E=高脉冲
输出:
无。
4.4状态字说明
表4-3状态字说明
ST7
D7
ST6
D6
ST5
D5
ST4
D4
ST3
D3
ST2
D2
ST1
D1
ST0
D0
STA0~STA6
当前地址指针的数值
STA7
读/写操作使能
1—禁止;0—允许
注意:
原则上每次对控制器进行读/写操作之前,都必须进行读/写检测,确保STA7为0。
实际上,由于单片机的操作速度慢于液晶控制器的反应速度,因此可以不进行读/写检测,或只进行简短的延时即可。
4.5数据指针设置
控制器内部设有一个数据地址指针,可以通过它们访问内部的全部80B的RAM,如表所示
表4-4数据指针设置
指令码
功能
80H+地址码(0~27H,40~67H)
设置数据地址指针
4.6其他设置
表4-5其他设置
指令码
功能
01H
显示清屏:
1.数据指针清0
2.所有显示清0
02H
显示回车:
数据指针清0
4.7初始化设置
(1)显示模式设置
表4-6显示模式设置
指令码
功能
0
0
1
1
1
0
0
0
设置16×2显示,5×7点阵,8位数据接口
(2)显示开/关及光标设置
表4-7显示开/关及光标设置
指令码
功能
0
0
0
0
1
D
C
B
D=1开显示;D=0关显示
C=1显示光标;C=0不显示光标
B=1光标闪烁;B=0光标不显示
0
0
0
0
0
1
N
S
N=1当读或写一个字符后地址指针加1,且光标加1
N=0当读或写一个字符后地址指针减1,且光标减1
S=1当写一个字符时,整屏显示左移(N=1)或右移(N=0),以得到光标不移动而屏幕移动的效果
S=0当写一个字符时,整屏显示不移动
0
0
0
1
0
0
0
0
光标左移
0
0
0
1
0
1
0
0
光标右移
0
0
0
1
1
0
0
0
整屏左移,同时光标跟随移动
0
0
0
1
1
1
0
0
整屏右移,同时光标跟随移动
4.8写操作时序
分析时序图可知操作1602液晶的流程如下:
(1)
通过RS确定是写数据还是写命令。
写命令包括使液晶的光标显示/不显示、光标闪烁/不闪烁、需/不需要移屏、在液晶的什么位置显示,等等。
写数据是指要显示什么内容。
(2)读/写控制端设置为写模式,即低电平。
(3)将数据或命令送达数据线上。
(4)给E一个高脉冲将数据送入液晶控制器,完成写操作。
总结:
通过以上材料的总结我们便可以做出由DS1302时钟芯片及LCD1602液晶还有STC89C52单片机和MAX232芯片组成的万年历。
具体电路连线图如下
程序如下:
#include
#include
#defineucharunsignedchar
//===========================================================
sbitRS=P2^3;//片选信号读写期间必须是高
sbitsclk=P2^4;//时钟信号
sbitIO=P2^5;//数据信号双向
sbitLCD_EA=P2^2;//1602使能信号
sbitR_W=P2^1;//1602读写控制信号
sbitR_S=P2^0;//1602数据读写信号
//sbitP3_7=P2^0;
sbitdate=P0^0;
//===========================================================
uchartable[]="00:
00:
00";
uchartab[14]="2000-00-00";
ucharweek1[3]="Mon";
ucharweek2[3]="Tue";
ucharweek3[3]="Wed";
ucharweek4[3]="Thu";
ucharweek5[3]="Fri";
ucharweek6[3]="Sat";
ucharweek7[3]="Sun";
//ucharweek[2];
//==========================延时程序=========================
voiddelay(intn)
{
ucharx,m;
for(x=0;xfor(m=0;m}
//===========================LCD写控制命令===================
voidread_command(uchara)
{
R_S=0;
R_W=0;
//LCD_EA=0;
P0=a;
delay(10);
LCD_EA=1;
delay(10);
LCD_EA=0;
}
//===========================LCD写数据=======================
voidread_data(ucharb)
{
R_S=1;
R_W=0;
P0=b;
delay(5);
LCD_EA=1;
delay(5);
LCD_EA=0;
}
//============================LCD初始化=======================
voidchu_shi_hua()
{
P0=0;
LCD_EA=0;
read_command(0x38);//功能设置命令。
4位总线;双行显示5x7的点阵字符。
read_command(0x0c);//显示开关控制,开显示、无光标、不闪烁
read_command(0x06);//光标和显示模式设置,光标右移,屏幕上所有文字不移动。
read_command(0x01);//清LCD
//read_command(0x02);
delay(20);
}
//================往DS1302中写一字节数据======================
voidwrite_ds1302(ucharbyte)
{
uchari;
sclk=0;
delay
(1);
for(i=0;i<8;i++)
{
IO=byte&0x01;
delay
(1);
sclk=1;
delay
(1);
sclk=0;
byte>>=1;
}
}
//====================从ds1302中读一字节数据====================
ucharread_ds1302(void)
{
uchari;
ucharback_data=0;
delay
(2);
for(i=0;i<8;i++)
{
back_data>>=1;
if(IO==1)
back_data|=0x80;
sclk=1;
delay
(1);
sclk=0;
delay
(1);
}
return(back_data);
}
//================向某一地址写一字节数据=======================
voidwrite_byte(ucharadrss,uchardate)
{
RS=0;
delay
(1);
sclk=0;
delay
(1);
RS=1;
delay
(1);
write_ds1302(adrss);
write_ds1302(date);
sclk=0;
delay
(1);
RS=0;
delay
(1);
}
//====================从某一地址读一字节数据===================
ucharread_byte(ucharadrss)
{
uchardater;
RS=0;
//delay
(1);
_nop_();
sclk=0;
//delay
(1);
_nop_();
RS=1;
delay
(1);
write_ds1302(adrss);
dater=read_ds1302();
RS=0;
delay
(1);
_nop_();
sclk=0;
RS=0;
//delay
(1);
_nop_();
return(dater);
}
//=====================ds1302初始化=======================
voidinitial_ds1302(void)
{
write_byte(0x8e,0x00);//写保护。
写操作时必须0
write_byte(0x80,((00/10)<<4)|(00%10));//写秒初值
write_byte(0x82,((22/10)<<4)|(22%10));//写分初值
write_byte(0x84,((7/10)<<4)|(7%10));//写小时初值
write_byte(0x86,((11/10)<<4)|(11%10));//写日初值
write_byte(0x88,((7/10)<<4)|(7%10));//写月初值
write_byte(0x8a,((4/10)<<4)|(4%10));//写周初值
write_byte(0x8c,((10/10)<<4)|(10%10));//写年初值
write_byte(0x90,0xa6);
write_byte(0x8e,0x80);//写保护。
写操作完成最高位置1
}
//===========================主函数===========================
voidmain()
{
ucharmiao,fen,shi,nian,yue,ri,zhou;
uchari,j,k,m=0;
read_command(0x01);
chu_shi_hua();
k=read_byte(0x81)&(0x80);
if(k)
initial_ds1302();
while
(1)
{
m++;
read_command(0x80+1);//向1602的第一行第二个字符写控制命令
read_data(tab[0]);//向1602写年的年的最高2
read_data(tab[1]);//向1602写年的年的0
nian=(((read_byte(0x8d)&0xf0)>>4)*10)+(read_byte(0x8d)&0x0f);//读年寄存器
tab[2]=nian/10+'0';
read_data(tab[2]);//向1602写年的十位
tab[3]=nian%10+'0';
read_data(tab[3]);//向1602写年的各位
read_data(tab[4]);
yue=(((read_byte(0x89)&0x70)>>4)*10)+(read_byte(0x89)&0x0f);//读月寄存器
tab[5]=yue/100+'0';
read_data(tab[5]);
tab[6]=yue%10+'0