51单片机实时时钟设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

完成内容:完成一个简易数字时钟的软硬件设计,首先利用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

unsigned char tab[]=" 23:58:48";

unsigned char code tab2[]="hello";

#define lcdp P0

sbit rs=P3^5;

sbit rw=P3^6;

sbit en=P3^7;

sbit led=P1^7;

sbit s1=P1^0;

sbit s2=P1^1;

sbit s3=P1^2;

unsigned char n,count,mu;

char ss=23,ff=58,mm=55;

void delay(unsigned char z)

{

unsigned char i,j;

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

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

}

void write_com(unsigned char com)//写指令

{

rs=0;

rw=0;

en=0;

lcdp=com;

delay(5);

en=1;

delay(5);

en=0;

}

void write_date(unsigned char date)//写数据

{

rs=1;

rw=0;

en=0;

lcdp=date;

delay(5);

en=1;

delay(5);

en=0;

}

void write_sj(unsigned add,unsigned date)

{

unsigned char shi,ge;

shi=date/10;

ge=date%10;

write_com(0x80+add);

write_date(shi+0x30);

write_date(ge+0x30);

}

void init() //初始化

{

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;

}

void key()

{

if(s1==0)

{

delay(5);

if(s1==0)

{

mu++;

while(!s1);

}

if(mu==1)

{

相关文档
最新文档