以AT89C51单片机为核心的时钟设计说明Word格式.docx
- 文档编号:4834294
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:20
- 大小:163.70KB
以AT89C51单片机为核心的时钟设计说明Word格式.docx
《以AT89C51单片机为核心的时钟设计说明Word格式.docx》由会员分享,可在线阅读,更多相关《以AT89C51单片机为核心的时钟设计说明Word格式.docx(20页珍藏版)》请在冰点文库上搜索。
电路设计框图如图1所示:
AT89C52
主控制模块
图1
2、主要单元电路的设计:
2.1单片机主控制模块的设计:
AT89C52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。
单片机的最小系统,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出。
第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路。
如图2
图2
2.2时钟电路模块的设计
在DS1302的引脚排列中,其中Vcc1为后备电源,Vcc2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。
当Vcc2小于Vcc1时,DS1302由Vcc1供电。
X1和X2是振荡源,外接32.768KHz晶振。
RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:
首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;
其次,RST提供终止单字节或多字节数据的传送手段。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RSTS置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。
上电运行时,在Vcc大于等于2.5V之前,RST必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平,I/O为串行数据输入端(双向)。
SCLK始终是输入端。
如图3
图3
2.3显示模块的设计
用1602为LCD显示模块,直接把对应的引脚和最小系统上的引脚相连,连接后用初始化程序对其进行简单的功能测试。
测试成功后即可为实验所用。
如图4
图4
2.4时间调整电路设计
调整时间用2个调整按钮,1个作为移位、控制用,另外1个作为加和减用,分别定义为控制按钮、加按钮。
在调整时间过程中,要调整的位与别的位应该有区别,所以增加了闪烁功能,即调整的位一直在闪烁,直到调整下一位。
闪烁原理就是,让要调整的一位每隔一定时间熄灭一次,比如说50ms。
利用定时器计时,当达到50ms溢出时,就送给该位熄灭符,在下一次溢出时。
再送正常显示的值,不断交替,直到调整该位结束。
此时送正常显示值给该位,再进人下一位调整闪烁程序。
四、硬件设计
1、电路的原理图
如图5所示
图5
2、原件清单:
单片机89c52芯片一片
DS1302芯片一片
1602模块一个
按钮3个
电容3个
晶振2个
电阻2个、排阻一个导线若干等等其他辅助材料
五、软件设计
1、程序流程图
图6
时间程序控制图:
图7
2、程序清单:
/*****************1602时钟****************************/
#include<
reg52.h>
#include<
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineSECOND0x81
#defineMINUTE0x83
#defineHOUR0x85
sbitrs=P1^0;
sbitrw=P1^1;
sbitep=P1^2;
sbitDS1302_SCLK=P1^3;
sbitDS1302_IO=P1^4;
sbitDS1302_RST=P1^5;
sbitM=P3^2;
sbitU=P3^3;
sbitD=P1^7;
//sbitD=P0^7;
sbitH3=P0^3;
unsignedcharsel=0;
ucharcodeDIS1[]={"
08jidianerban"
};
ucharcodeDIS2[]={"
kechengsheji"
/////////////////////////延时////////////////////////////////
voiddelay(uintms)
{
unsignedinta,b;
for(a=0;
a<
ms;
a++)
for(b=0;
b<
124;
b++);
}
////////////////////////////////////////////////////////////
/***************DS1302驱动************************/
voidDS1302_Write(ucharD)
uchari;
for(i=0;
i<
8;
i++)
{
DS1302_IO=D&
0x01;
DS1302_SCLK=1;
DS1302_SCLK=0;
D=D>
>
1;
}
}
ucharDS1302_Read()
ucharTempDat=0,i;
TempDat>
=1;
if(DS1302_IO)TempDat=TempDat|0x80;
returnTempDat;
voidWDS1302(ucharucAddr,ucharucDat)
DS1302_RST=0;
DS1302_SCLK=0;
DS1302_RST=1;
DS1302_Write(ucAddr);
DS1302_Write(ucDat);
DS1302_SCLK=1;
ucharRDS1302(ucharucAddr)
ucharucDat;
ucDat=DS1302_Read();
returnucDat;
voidinit_1302()
{
WDS1302(0x8e,0x00);
//开保护寄存器
WDS1302(0x80,0x50);
//秒
WDS1302(0x82,0x59);
//分
WDS1302(0x84,0x23);
//时
WDS1302(0x8A,0x07);
//星期
WDS1302(0x86,0x01);
//日
WDS1302(0x88,0x10);
//月
WDS1302(0x8C,0x11);
//年
WDS1302(0x90,0xab);
//卷电流充电
WDS1302(0x8e,0x80);
//关保护寄存器
/************************1602驱动**************/
bitlcd_bz()
bitresult;
rs=0;
rw=1;
ep=1;
_nop_();
result=(bit)(P2&
0x80);
ep=0;
returnresult;
////////////////////////////////////////////////////////
voidlcd_wcmd(unsignedcharcmd)
while(lcd_bz());
rw=0;
P2=cmd;
ep=0;
/////////////////////////////////////////////////////////
voidlcd_pos(unsignedcharpos)
lcd_wcmd(pos|0x80);
voidlcd_wdat(unsignedchardat)
rs=1;
P2=dat;
//////////////////////////////////////////////////////////
voidlcd_init()
lcd_wcmd(0x38);
delay
(1);
lcd_wcmd(0x0c);
lcd_wcmd(0x06);
lcd_wcmd(0x01);
/*********************调时函数*************************/
voidset_time()
signedcharaddress,item;
signedcharmax,mini;
if(M==0)
sel++;
delay(300);
if(sel==7)sel=0;
if(sel==2){address=0x82;
max=59;
mini=0;
if(sel==1){address=0x84;
max=23;
}
if(sel==4){address=0x8c;
max=99;
mini=9;
if(sel==5){address=0x88;
max=12;
mini=1;
if(sel==6){address=0x86;
max=31;
if(sel==3){address=0x8A;
max=07;
M=1;
item=((RDS1302(address+1))/16)*10+(RDS1302(address+1))%16;
if(U==0)
{
delay(200);
U=1;
item++;
//P0=0xf7;
//if(D==0)
//{delay(200);
//item--;
//
if(D==0)
D=1;
item--;
if(item>
max)item=mini;
if(item<
mini)item=max;
//允许写操作
WDS1302(address,(item/10)*16+item%10);
//写入DS1302//转成BCD码
//写保护,禁止写操作
/*********************显示子函数**************/
ucharlcdshow_u(uchari,uchary)
lcd_wcmd(0x80+0x00+i);
lcd_wdat(y);
ucharlcdshow_d(uchari,uchary)
lcd_wcmd(0x80+0x40+i);
/*******************显示函数*******************/
voiddisplay(void)
ucharx,y;
x=RDS1302(HOUR);
//时
y=x;
x=x>
4;
lcdshow_u(6,0x30+x);
y=y&
0x0f;
lcdshow_u(7,0x30+y);
lcdshow_u(8,'
:
'
);
x=RDS1302(MINUTE);
//分
lcdshow_u(9,0x30+x);
lcdshow_u(0x0a,0x30+y);
lcdshow_u(0x0b,'
x=RDS1302(SECOND);
//秒
lcdshow_u(0x0c,0x30+x);
lcdshow_u(0x0d,0x30+y);
x=RDS1302(0x8b);
//x=x>
lcdshow_u(0x0e,0x30+x);
lcdshow_u(0x0f,0x30+y);
x=RDS1302(0x8d);
lcdshow_d(8,0x30+x);
lcdshow_d(9,0x30+y);
lcdshow_d(0x0a,'
-'
x=RDS1302(0x89);
lcdshow_d(0x0b,0x30+x);
lcdshow_d(0x0c,0x30+y);
lcdshow_d(0x0d,'
x=RDS1302(0x87);
lcdshow_d(0x0e,0x30+x);
lcdshow_d(0x0f,0x30+y);
for(x=45;
x>
0;
x--)
set_time();
delay(10);
/**************************主函数******************/
voidmain()
{uchari;
lcd_init();
delay(10);
lcd_pos(0x03);
i=0;
while(DIS1[i]!
='
\0'
)
{lcd_wdat(DIS1[i]);
i++;
lcd_pos(0x42);
while(DIS2[i]!
lcd_wdat(DIS2[i]);
init_1302();
delay(1000);
17;
lcdshow_u(i,'
delay(90);
lcdshow_d(i,'
lcdshow_u(0,'
T'
lcdshow_u(1,'
i'
lcdshow_u(2,'
m'
lcdshow_u(3,'
e'
lcdshow_u(14,'
'
lcdshow_d(0,'
D'
lcdshow_d(1,'
a'
lcdshow_d(2,'
t'
lcdshow_d(3,'
lcdshow_d(6,'
2'
lcdshow_d(7,'
0'
//LCD框架描绘
while
(1)
set_time();
if(sel==2){lcdshow_u(9,'
lcdshow_u(0x0a,'
delay(500);
if(sel==1){lcdshow_u(6,'
lcdshow_u(7,'
if(sel==3){lcdshow_u(14,'
lcdshow_u(15,'
if(sel==5){lcdshow_d(0x0b,'
lcdshow_d(0x0c,'
if(sel==6){lcdshow_d(0x0e,'
lcdshow_d(0x0f,'
if(sel==4){lcdshow_d(0x08,'
lcdshow_d(0x09,'
//调时LCD闪烁显示
display();
六、系统仿真及调试
仿真调试结果如图8所示:
图8
完成预期课程设计目的!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AT89C51 单片机 核心 时钟 设计 说明