51单片机实时时钟设计.docx

上传人:b****6 文档编号:12259593 上传时间:2023-06-05 格式:DOCX 页数:14 大小:190.94KB
下载 相关 举报
51单片机实时时钟设计.docx_第1页
第1页 / 共14页
51单片机实时时钟设计.docx_第2页
第2页 / 共14页
51单片机实时时钟设计.docx_第3页
第3页 / 共14页
51单片机实时时钟设计.docx_第4页
第4页 / 共14页
51单片机实时时钟设计.docx_第5页
第5页 / 共14页
51单片机实时时钟设计.docx_第6页
第6页 / 共14页
51单片机实时时钟设计.docx_第7页
第7页 / 共14页
51单片机实时时钟设计.docx_第8页
第8页 / 共14页
51单片机实时时钟设计.docx_第9页
第9页 / 共14页
51单片机实时时钟设计.docx_第10页
第10页 / 共14页
51单片机实时时钟设计.docx_第11页
第11页 / 共14页
51单片机实时时钟设计.docx_第12页
第12页 / 共14页
51单片机实时时钟设计.docx_第13页
第13页 / 共14页
51单片机实时时钟设计.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

51单片机实时时钟设计.docx

《51单片机实时时钟设计.docx》由会员分享,可在线阅读,更多相关《51单片机实时时钟设计.docx(14页珍藏版)》请在冰点文库上搜索。

51单片机实时时钟设计.docx

51单片机实时时钟设计

完成内容:

完成一个简易数字时钟的软硬件设计,首先利用protus完成功能方真,再利用dxp完成原理图和pcb的绘制,该数字时钟可具备如下功能:

1、实现最基本的计时功能,显示时、分、秒,可以通过按键设置时间。

要求:

时钟计时精确,按键操作不影响计时。

2、具备秒表计时功能。

要求:

记时精度达到100ms,计时支持启动、暂停、继续和停止操作。

3、具备整点响铃提示功能。

要求:

整点闹铃五短一长,闹钟响铃时可以按键清楚响铃。

4、具备日期显示和调整功能。

说明:

以上功能中,1为必备功能,2、3、4为选做功能。

采用数码管完成显示,按键进行调整,供电采用usb供电,其中数码管和按键的个数以及操作方式自己决定。

系统操作以简洁,方便,原理图绘制正确,PCB布局布线规整为宜。

评测内容:

protus的功能仿真测试,dxp原理图以及pcb绘制结果。

本设计使用89C51芯片作为控制芯片,复位电路和时钟电路构成单片机最小系统。

利用P0口8个引脚接上拉电阻,驱动LCD液晶显示时钟。

总体设计思路图

2.3单元电路设计

本设计主要分为时钟电路模块,复位电路模块,显示模块和控制模块。

设计方案如下

2.3.1时钟模块

89C51单片机的时钟信号通常用内部振荡方法得到,在引脚XTAL1和XTAL2外接晶体振荡器(简称晶振)或陶瓷谐振器,就构成了内部振荡方法。

由于单片机内部有一个高增益反相放大器,当外接晶振后就构成了自激振荡器并产生振荡时钟脉冲。

晶振通常选择6MHz、12MHz、24MHz。

本设计采用12MHz晶振。

图中电容C1、C2起到稳固振荡频率、快速起振的作用。

电容值一般为5—30pF。

本设计选用33pF电容。

2.3.2复位电路模块

图2.4复位电路

复位操作完成电路的初始化,使单片机从一种确定的状态开始运行。

由上图可知,控制模块实际上就是单片机的最小系统。

本设计采用常用的上电且开关复位电路。

上电后,由于电容的充电,使RST持续一段高电平时间。

当单片机已在运行中时,按下复位键也能使RST持续一段时间的高电平,从而实现上电且开关复位的操作。

此处C3电容取10uF,R2=K。

2.3.3控制模块

图2.5控制电路

2.3.4显示模块

显示部分电路设计如下图

图2.6显示模块电路图

 

三、软件设计

3.1程序设计思路(流程图)

 

3.2源程序

#include

unsignedchartab[]="23:

58:

48";

unsignedcharcodetab2[]="hello";

#definelcdpP0

sbitrs=P3^5;

sbitrw=P3^6;

sbiten=P3^7;

sbitled=P1^7;

sbits1=P1^0;

sbits2=P1^1;

sbits3=P1^2;

unsignedcharn,count,mu;

charss=23,ff=58,mm=55;

voiddelay(unsignedcharz)

{

unsignedchari,j;

for(i=z;i>0;i--)

for(j=110;j>0;j--);

}

voidwrite_com(unsignedcharcom)//写指令

{

rs=0;

rw=0;

en=0;

lcdp=com;

delay(5);

en=1;

delay(5);

en=0;

}

voidwrite_date(unsignedchardate)//写数据

{

rs=1;

rw=0;

en=0;

lcdp=date;

delay(5);

en=1;

delay(5);

en=0;

}

voidwrite_sj(unsignedadd,unsigneddate)

{

unsignedcharshi,ge;

shi=date/10;

ge=date%10;

write_com(0x80+add);

write_date(shi+0x30);

write_date(ge+0x30);

}

voidinit()//初始化

{

write_com(0x38);//设置16x2显示,5x7点阵,8位数据接口

write_com(0x06);//写一个字符后地址指针自动加1

write_com(0x01);//显示清零,数据指针清零

write_com(0x0c);//开显示,不显示光标

//write_com(0x08);

//write_com(0x0e);//光标开启,但不闪烁

write_com(0x80);//显示位置

for(n=0;n<10;n++)

{

write_date(tab[n]);

delay

(1);

}

write_com(0x80+0x40+3);//第二行显示

for(n=0;n<8;n++)

{

write_date(tab2[n]);

delay

(1);

}

//定时器初始化

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TMOD=0x01;

EA=1;

ET0=1;

TR0=1;

}

voidkey()

{

if(s1==0)

{

delay(5);

if(s1==0)

{

mu++;

while(!

s1);

}

if(mu==1)

{

TR0=0;

write_com(0x80+9);

write_com(0x0f);//光标闪烁

}

if(mu==2)

{

write_com(0x80+6);

write_com(0x0f);//光标闪烁

}

if(mu==3)

{

write_com(0x80+3);

write_com(0x0f);//光标闪烁

}

}

if(mu==4)

{

TR0=1;

mu=0;

write_com(0x0c);//关闭光标

}

if(mu!

=0)

{

if(s2==0)

{

delay(5);

if(s2==0)

{

while(!

s2);

if(mu==1)

{

mm++;

if(mm==60)

mm=0;

write_sj(8,mm);

write_com(0x80+9);

}

if(mu==2)

{

ff++;

if(ff==60)

ff=0;

write_sj(5,ff);

write_com(0x80+6);

}

if(mu==3)

{

ss++;

led=!

led;

if(ss==24)

ss=0;

write_sj(2,ss);

write_com(0x80+3);

}

}

}

if(s3==0)

{

delay(5);

if(s3==0)

{

while(!

s3);

if(mu==1)

{

mm--;

if(mm==-1)

mm=59;

write_sj(8,mm);

write_com(0x80+9);

}

if(mu==2)

{

ff--;

if(ff==-1)

ff=59;

write_sj(5,ff);

write_com(0x80+6);

}

if(mu==3)

{

ss--;

led=!

led;

if(ss==-1)

ss=23;

write_sj(2,ss);

write_com(0x80+3);

}

}

}

}

}

voidmain()

{

init();

while

(1)

{

key();

}

}

voidtime0()interrupt1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

count++;if(count==20)

{

count=0;

mm++;

if(mm==60)

{

mm=0;

ff++;

if(ff==60)

{

ff=0;

ss++;

if(ss==24)

{

ss=0;

}

write_sj(2,ss);

}

write_sj(5,ff);

}

write_sj(8,mm);

}

}

四、仿真调试

总体仿真电路图如下图所示

图4.1整体仿真原理图

4.1keil简介

KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势。

因而易学易用。

Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境uVision将这些部分组合在一起。

运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。

4.2keil与protues联调

双击图标进入KeiluVision2编程环境,输入程序。

返回桌面双击图标进入PROTEUS仿真环境。

点击左上角选项P后根据设计的电路图调出所需元件画好硬件原理图如图4.1所示。

然后按照4.1节所写步骤设置keil和proteus的工作环境。

实现keil和proteus的连调。

4.3仿真结果

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2