单片机AT89C51可调电子时钟的设计.docx

上传人:b****0 文档编号:17841200 上传时间:2023-08-04 格式:DOCX 页数:35 大小:276.05KB
下载 相关 举报
单片机AT89C51可调电子时钟的设计.docx_第1页
第1页 / 共35页
单片机AT89C51可调电子时钟的设计.docx_第2页
第2页 / 共35页
单片机AT89C51可调电子时钟的设计.docx_第3页
第3页 / 共35页
单片机AT89C51可调电子时钟的设计.docx_第4页
第4页 / 共35页
单片机AT89C51可调电子时钟的设计.docx_第5页
第5页 / 共35页
单片机AT89C51可调电子时钟的设计.docx_第6页
第6页 / 共35页
单片机AT89C51可调电子时钟的设计.docx_第7页
第7页 / 共35页
单片机AT89C51可调电子时钟的设计.docx_第8页
第8页 / 共35页
单片机AT89C51可调电子时钟的设计.docx_第9页
第9页 / 共35页
单片机AT89C51可调电子时钟的设计.docx_第10页
第10页 / 共35页
单片机AT89C51可调电子时钟的设计.docx_第11页
第11页 / 共35页
单片机AT89C51可调电子时钟的设计.docx_第12页
第12页 / 共35页
单片机AT89C51可调电子时钟的设计.docx_第13页
第13页 / 共35页
单片机AT89C51可调电子时钟的设计.docx_第14页
第14页 / 共35页
单片机AT89C51可调电子时钟的设计.docx_第15页
第15页 / 共35页
单片机AT89C51可调电子时钟的设计.docx_第16页
第16页 / 共35页
单片机AT89C51可调电子时钟的设计.docx_第17页
第17页 / 共35页
单片机AT89C51可调电子时钟的设计.docx_第18页
第18页 / 共35页
单片机AT89C51可调电子时钟的设计.docx_第19页
第19页 / 共35页
单片机AT89C51可调电子时钟的设计.docx_第20页
第20页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

单片机AT89C51可调电子时钟的设计.docx

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

单片机AT89C51可调电子时钟的设计.docx

单片机AT89C51可调电子时钟的设计

 

序号:

学号:

XXXXXX

计算机硬件实习报告

 

题目:

可调电子时钟的设计

学生姓名:

XXX

学院(系):

XXXXXX专业班级:

XXXXXX

指导教师:

XX专业技术职务:

讲师

实习时间:

2015年6月29日2015年7月17日

 

实习任务书

一、设计题目

可调电子时钟的设计

二、设计背景

目前单片机渗透到我们生活的各个领域,几乎很难寻找到哪个领域没有单片机的踪迹。

可调电子时钟的设计在日常生活和工业应用非常广泛,程序内部设定有日历和时间的设置,在生活在具有使用价值和广泛的前景。

三、设计内容及目标

设计内容:

可调电子时钟的设计由51单片机、DS1302、LCD1602、按键等元件组成。

能实现年、月、日、星期、时、分、秒的显示和调时功能(通过按键实现年、月、日、时、分的调节)。

设计目标:

了解51单片机、DS1302和LCD1602等器件的工作原理,掌握51单片机应用系统的硬件设计和软件设计的方法和技巧。

四、进度安排

周次

工作内容

预定目标

第17周周一

题目安排;图书馆查相关资料

查阅相关资料

第17周周二至周四

系统硬件设计及软件设计

实现系统硬件和软件设计

第17周周四下午

设计成果检查及指导

确定设计成果

第17周周五

完善硬件及软件设计;开始准备实习报告初稿。

完善软件硬件设计

第18周

学习Proteus仿真软件,并仿真系统

熟悉Proteus仿真软件,并成功仿真系统

第19周周一至周四

进实验室,完成实习任务;完善实习报告。

写好硬件实习报告,调试好系统

第19周周五

答辩并且验收实习报告

答辩并且验收实习报告

五、设计时间:

2015年6月29日到2015年7月17日

计算机科学与技术系指导教师XX_

1实习目的

(1)可调电子时钟的设计由51单片机、DS1302、LCD1602、按键等元件组成。

能实现年、月、日、星期、时、分、秒的显示和调时功能(通过按键实现年、月、日、时、分的调节)。

(2)原理图设计:

根据所确定的设计电路,利用Proteus软件绘制电路原理图。

(3)软件设计:

根据电路工作过程,画出软件流程图,根据流程图编写相应的程序。

利用Proteus与KeilμVision4联调,直到实验现象正确为止。

2相关硬件介绍

2.1AT89C51

2.1.1AT89C51简介

AT89C51是一种带4K字节FLASH存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。

AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

2.1.2AT89C51引脚说明

VCC:

供电电压。

GND:

接地。

P0口:

P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

P1口:

P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P2口:

P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

图1AT89C51引脚图

P3口:

P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

RST:

复位输入。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:

当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。

在FLASH编程期间,此引脚用于输入编程脉冲。

/PSEN:

外部程序存储器的选通信号。

在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。

但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

/EA/VPP:

当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。

XTAL1:

反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:

来自反向振荡器的输出。

2.2LCD1602

2.2.1LCD1602主要技术参数

显示容量:

16×2个字符,芯片工作电压:

4.5—5.5V,工作电流:

2.0mA(5.0V),模块最佳工作电压:

5.0V,字符尺寸:

2.95×4.35(W×H)mm。

2.2.2LCD1602引脚功能说明

LCD1602引脚如图2所示

图2LCD1602引脚图

 

各个引脚具体功能说明:

第1脚:

GND为地电源。

第2脚:

VCC接5V正电源。

第3脚:

VO为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生重影,使用一个1K的电位器调整对比度。

第4脚:

RS为寄存器选择,高电平时选择数据寄存器,低电平时选择指令寄存器。

第5脚:

R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。

第6脚:

E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:

DB0~DB7为8位双向数据线。

 

2.2.3LCD显示模块原理图

图3LCD显示模块原理图

2.3DS1302

2.3.1DS1302简介

DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。

2.3.2DS1302的引脚排列

各引脚功能为:

Vcc:

主电源;

Vcc2:

备用电源。

当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电;当Vcc2

SCLK:

串行时钟输入端,控制数据的输入与输出。

I/O:

三线接口时的双向数据线。

CE:

输入信号,在读、写数据期间必须为高

DS1302的引脚如图4所示:

图4DS1302的引脚图

2.3.3时钟集成模块内部原理图

图5时钟集成模块内部原理图

3软件设计

3.1系统硬件概述

电路以AT89C51单片机最小系统为控制核心,时钟电路由高精度低功耗的DS1302提供,采用三线接口与CPU进行同步通信,输入部分采用四个独立式按键S1、S2、S3、S4、S5。

1602液晶显示部分,D0-D7口与单片机P0口相连。

具体电路连接,详见附录1

3.2程序结构图

图6程序结构图

3.3程序流程图

图7系统主程序流程图

4Proteus与Keil联调

4.1Keil调试

图8Keil调试图

4.2与Proteus联调

图9Proteus与Keil联调

4.3联调成功

图10联调成功

5设计心得

5.1实习日记

2015年6月29日

今天是硬件实习的第一天,潘老师在课堂上给我们布置了接下来3个礼拜的时间需要完成的任务,同时精心的给我们讲解了每道题目的要求,需要实现的功能,以及对于从没接触过的问题如何动手去做,在老师的一步步引导下我们慢慢的对自己要做的题目有个由浅到深的了解,之后怀着整装待出发的心情迎接这对于动手操作能力很强的实践挑战。

下午便开始了对资料的收集过程。

虽然说资料搜集过程很简单,但其实在这里面也不乏许多学问,能否收集的切题,收集的恰到好处,也是种收集的能力。

所以,在整个过程中不论是什么环节,我相信都是对能力锻炼的绝好机会。

对于即将开始的硬件实习,我满怀期待。

同时内心又存在担忧,因为我不知道我能否完成这样一个挑战。

2015年7月6日—8日

在这几天,我们需要做的就是协商量对于硬件和软件方面的设计方案,虽然上个星期我们收集了很多资料,也对这次的课题有了大概的了解。

但是真正动手去画仿真图的时候还是遇到了很多问题,毕竟这是我们第一次接触到Proteus软件。

我们用了2天时间边画边学,画好了仿真图。

看着那排列整齐的图形,我觉得非常自豪。

2015年7月9日—15日

这是这次硬件实习的最后一步,也是最重要的一步。

我们要用KeiluVision2为硬件编程,如果说仿真图是躯干,那程序就是大脑。

仿真图能不能运行就看程序了。

通过一个多星期的努力,我们不停的纠错改错,到最后终于看到LCD屏幕上出现时间信息。

5.2实习心得体会

本次经历了3个礼拜的时间,对我来说收获很大,记得一开始听说有单片机硬件实习的时候还有些担心自己是否能够按时完成任务,到后来的坦然面对,到后来的挫败感,再到后来的信心满满,心情不断的起伏变化,当然收获也是颇大的,实现了从学习理论知识的能力到实践动手操作的跨越。

参考文献

[1]李广第,朱月秀.单片机基础第三版.北京:

北京航空航天大学出版社(1——259)。

[2]李庆亮.C语言程序设计实用教程.北京:

机械工业出版社,2005.3(1——100)。

[3]康华光.电子技术基础数字部分.北京:

高等教育出版社,2008(1——560)。

[4]康华光.电子技术基础模拟部分.北京:

高等教育出版社,2008(1——560)。

[5]杨志忠.数字电子技术.北京:

高等教育出版社,2003.12(30——100)。

[6]及力.Protel99SE原理图与PCB设计教程.北京:

电子工业出版社,2007.8(48——100)。

[7]杨欣.电子设计从零开始.北京:

清华大学出版社,2005(10——200)。

[8]邢小杰.单片机电子时钟设计.中国科技博览,2009。

 

附录1硬件原理图

附录2代码清单

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitACC0=ACC^0;

sbitACC7=ACC^7;

sbitt=P1^0;//进入调时按键

sbitjia=P1^1;//加一按键

sbitjian=P1^2;//减一按键

sbitm=P1^3;//退出调时按键

sbitBEEP=P2^0;//蜂鸣器

sbitjtod=P1^4;//矩阵按键转独立按键,该脚置0

sbitT_CLK=P1^6;/*实时时钟时钟线引脚*/

sbitT_IO=P3^5;/*实时时钟数据线引脚*/

sbitT_RST=P1^7;/*实时时钟复位线引脚*/

sbitE=P2^7;//1602使能引脚

sbitRW=P2^6;//1602读写引脚

sbitRS=P2^5;//1602数据/命令选择引脚

ucharcodehanzi[][8]={{0x04,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02},{0x0f,0x09,0x0f,0x09,0x0f,0x09,0x13,0x11},{0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00}};

voidv_W1302(ucharucAddr,ucharucDa);

ucharuc_R1302(uchar);

uchardectobcd(ucharbcd);

ucharbcdtodec(uchar);

voidbeep();

voiddelay(ucharx)

{

uchari;

while(x--)

for(i=0;i<110;i++);

}

/********************************************************************

*名称:

enable(uchardel)

*功能:

1602命令函数

*输入:

输入的命令值

*输出:

***********************************************************************/

voidenable(uchardel)

{

RS=0;

RW=0;

P0=del;

E=1;

delay(3);

E=0;

}

/********************************************************************

*名称:

write(uchardel)

*功能:

1602写数据函数

*输入:

需要写入1602的数据

*输出:

***********************************************************************/

voidwrite(uchardel)

{

RS=1;

RW=0;

P0=del;

E=1;

delay(3);

E=0;

}

/********************************************************************

*名称:

L1602_init()

*功能:

1602初始化,请参考1602的资料

*输入:

*输出:

***********************************************************************/

voidL1602_init(void)

{

enable(0x01);

enable(0x38);

enable(0x06);

enable(0x0c);

E=0;

}

//装入自定义字符(汉字)

voidwritch()

{

uchari,j;

enable(0x40);

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

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

write(hanzi[i][j]);

}

/********************************************************************

*名称:

L1602_char(ucharhang,ucharlie,charsign)

*功能:

改变液晶中某位的值,如果要让第一行,第五个字符显示"b",调用该函数如下

L1602_char(1,5,'b')

*输入:

行,列,需要输入1602的数据

*输出:

***********************************************************************/

voidL1602_char(ucharhang,ucharlie,charsign)

{

uchara;

if(hang==1)a=0x80;

if(hang==2)a=0xc0;

a=a+lie-1;

enable(a);

write(sign);

}

/********************************************************************

*名称:

L1602_string(ucharhang,ucharlie,uchar*p)

*功能:

改变液晶中某位的值,如果要让第一行,第五个字符开始显示"abcdef",调用该函数如下

L1602_string(1,5,"abcdef;")

*输入:

行,列,需要输入1602的数据

*输出:

***********************************************************************/

voidL1602_string(ucharhang,ucharlie,uchar*p)

{

uchara;

if(hang==1)a=0x80;

if(hang==2)a=0xc0;

a=a+lie-1;

enable(a);

while

(1)

{

if(*p=='\0')break;

write(*p);

p++;

}

}

//时钟调节//

voidtimechange()

{

uchara,num=1;

ucharyear,mon,day,hour,min,sec;

//进入调时循环

while(num)

{

if(t==0)

delay(5);

if(t==0)

{

num++;

beep();

while(!

t);

}

//退出调时按键m

if(m==0)

delay(5);

if(m==0)

num=0;

enable(0x0f);

a=uc_R1302(0x81)|0x80;

v_W1302(0x8e,0);

v_W1302(0x80,a);

//调时到年以后退出调时

if(num==7)

num=0;

//num=1调秒

if(num==1)

{

enable(0xc0+12);

if(jia==0)

delay(5);

if(jia==0)//秒加一

{

while(!

jia);

sec=bcdtodec(uc_R1302(0x81)&0x7f);

sec++;

if(sec>59)

sec=0;

L1602_char(2,12,sec/10%10+48);

L1602_char(2,13,sec%10+48);

v_W1302(0x80,dectobcd(sec)|0x80);

}

if(jian==0)//秒减一

delay(5);

if(jian==0)

{

while(!

jian);

sec=bcdtodec(uc_R1302(0x81));

sec--;

if(sec==-1)

sec=59;

L1602_char(2,12,sec/10%10+48);

L1602_char(2,13,sec%10+48);

v_W1302(0x80,dectobcd(sec)|0x80);

}

}

if(num==2)//调分钟

{

enable(0xc0+9);

if(jia==0)

delay(5);

if(jia==0)

{

min=bcdtodec(uc_R1302(0x83));

min++;

while(!

jia);

if(min>59)

min=0;

L1602_char(2,9,min/10%10+48);

L1602_char(2,10,min%10+48);

v_W1302(0x82,dectobcd(min));

}

if(jian==0)

delay(5);

if(jian==0)

{

min=bcdtodec(uc_R1302(0x83));

min--;

while(!

jian);

if(min==-1)

min=59;

L1602_char(2,9,min/10%10+48);

L1602_char(2,10,min%10+48);

v_W1302(0x82,dectobcd(min));

}

}

if(num==3)//调小时

{

enable(0xc0+6);

if(jia==0)

delay(5);

if(jia==0)

{

hour=bcdtodec(uc_R1302(0x85));

hour++;

while(!

jia);

if(hour>23)

hour=0;

L1602_char(2,6,hour/10%10+48);

L1602_char(2,7,hour%10+48);

v_W1302(0x84,dectobcd(hour));

}

if(jian==0)

delay(5);

if(jian==0)

{

while(!

jian);

hour=bcdtodec(uc_R1302(0x85));

hour--;

if(hour==-1)

hour=23;

L1602_char(2,6,hour/10%10+48);

L1602_char(2,7,hour%10+48);

v_W1302(0x84,dectobcd(hour));

}

}

if(num==4)//调日期

{

enable(0x80+13);

if(jia==0)

delay(5);

if(jia==0)

{

hour=bcdtodec(uc_R1302(0x87));

day++;

while(!

jia);

if(day>31)

day=0;

L1602_char(1,13,day/10%10+48);

L1602_char(1,14,day%10+48);

v_W1302(0x86,dectobcd(day));

}

if(jian==0)

delay(5);

if(jian==0)

{

while(!

jian);

day=bcdtodec(uc_R1302(0x87));

day--;

if(day==-1)

day=31;

L1602_char(1,13,day/10%10+48);

L1602_char(1,14,day%10+48);

v_W1302(0x86,dectobcd(day));

}

}

if(num==5)//调月份

{

enable(0x80+10);

if(jia==0)

delay(5);

if(jia==0)

{

mon=bcdtodec(uc_R1302(0x89));

mon++;

while(!

jia);

if(mon>12)

mon=0;

L1602_char(1,10,mon/10%10+48);

L1602_char(1,11,mon%10+48);

v_W1302(0x88,dectobcd(mon));

}

if(jian==0)

delay(5);

if(jian==0)

{

while(!

jian);

mon=bcdtodec(uc_R1302(0x89));

mon--;

if(mon==-1)

mon=12;

L1602_char(1,10,mon/10%

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

当前位置:首页 > IT计算机 > 电脑基础知识

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

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