电子钟报告.docx

上传人:b****3 文档编号:26751582 上传时间:2023-06-22 格式:DOCX 页数:15 大小:99.55KB
下载 相关 举报
电子钟报告.docx_第1页
第1页 / 共15页
电子钟报告.docx_第2页
第2页 / 共15页
电子钟报告.docx_第3页
第3页 / 共15页
电子钟报告.docx_第4页
第4页 / 共15页
电子钟报告.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

电子钟报告.docx

《电子钟报告.docx》由会员分享,可在线阅读,更多相关《电子钟报告.docx(15页珍藏版)》请在冰豆网上搜索。

电子钟报告.docx

电子钟报告

C51单片机课程设计报告

——基于8255的8LED显示电子钟

一、设计目的

在我们现代日常生活中,电子时钟已得到极其广泛的应用,已成为我们日常生活中的不可或缺的一部分。

本次设计的主要目的即是利用C51单片机设计一个可实现24小时计时的电子时钟,计时从0时0分0秒开始,到23小时59分59秒后返回0时0分0秒自动重新开始计时。

本设计拥有时间调整功能和时间显示功能,无年、月计数和闹钟功能。

二、需求分析

本设计中的时钟要求使用8个8段数码管显示当前时间,其中秒单元与分单元中间以“-”符号隔开,分单元与时单元中间同样以“-”符号隔开。

计时范围为从00-00-00到23-59-59,当计时到23-59-59后自动返回00-00-00并重新开始计时。

设计中使用4X4键盘,当在计时功能工作时按下暂停键,计时暂停。

按下开始/恢复计时键即可恢复计时,按下重新计时键则清零重新计时。

按下时加1,分加1,秒加1可调整时间。

三、实验设备

(1)计算机一台

(2)Proteus软件平台

(3)Medwin软件平台

(4)KeiluVision2软件平台

四、器件介绍

a)89C51各引脚功能介绍:

Vss(20脚):

接地

VCC(40脚):

主电源+5V

XTAL1(19脚):

接外部晶体的一端。

在片内它是振荡电路反相放大器的输入端。

XTAL2(18脚):

接外部晶体的另一端。

在片内它是一个振荡电路反相放大器的输出端,振荡电路的频率是晶体振荡频率。

RST(9脚):

单片机刚接上电源时,其内部各寄存器处于随机状态,在该脚输入24个时钟周期宽度以上的高电平将使单片机复位。

PSEN(29脚):

在访问片外程序存储器时,此端输出负脉冲作为存储器读选通信号。

CPU在向片外存储器取指令期间,PSEN信号在12个时钟周期中两次生效。

不过,在访问片外数据存储器时,这两次有效PSEN信号不出现。

PSEN端同样可驱动8个LSTTL负载。

我们根据PSEN、ALE和XTAL2输出端是否有信号输出,可以判别80C51是否在工作。

ALE/PROG(30脚):

同PSNT

EA/VPP(31脚):

当EA端输入高电平时,CPU从片内程序存储器地址0000H单元开始执行程序。

当地址超出4KB时,将自动执行片外程序存储器的程序。

当EA输入低电平时,CPU仅访问片外程序存储器。

在对87C51EPROM编程时,此引脚用于施加编程电压VPP。

输入/输出引脚:

P0口为一个8位漏极开路双向I/O口每脚可吸收8TTL门电流,当P1口的管脚第一次写1时被定义为高阻输入,P0能够用于外部程序的数据存储器,它可以被定义为数据/地址第八位,在FIASH编程时P0作为原码输入口,当FIASH进行校验时,P0口输出原码,此时P0口外部必须被拉高。

P1口:

P1口是一个内部提供上拉电阻的8位双向I/O口,P1缓冲器能够接受输出4TTL门电流,P1口管脚写入1后,被内部上拉为高可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FIASH编程和校验时,P1口作为第八位地址接受。

P2口:

P2口是一个内部提供上拉电阻的8位双向I/O口,P2缓冲器能够接受输出4TTL门电流,P2口管脚写入1后,被内部上拉为高可用作输入,P2口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

P2当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址1时,它利用内部上拉优势,对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FIASH编程和校验时,接受高八位地址信号和控制信号。

P3口:

P3口管脚是8个带内部上拉电阻的双向I/O口,可接受输出4个TTL门电流,当P3口写入1后它们被内部上拉为高电平并作输入,作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

b)扩展IO8255

8255共有40个引脚,采用双列直插式封装,各引脚功能如下:

D0--D7:

三态双向数据线,与单片机数据总线连接,用来传送数据信息。

CS:

片选信号线,低电平有效,表示芯片被选中。

RD:

读出信号线,低电平有效,控制数据的读出。

WR:

写入信号线,低电平有效,控制数据的写

Vcc:

+5V电源。

PA0--PA7:

A口输入/输出线。

PB0--PB7:

B口输入/输出线。

PC0--PC7:

C口输入/输出线。

RESET:

复位信号线。

A1、A0:

地址线,用来选择8255内部端口。

GND:

地线。

c)扩展IO74LS373

一般IO口扩展,单片机系统为了简化设计,在系统要求不高的情况下,常采用该方法扩展少量的并行输入/输出口,本实验系统设计的并行输出口用于LED数码管的显示输出。

d)8位LED动态显示

八位动态显示LED数码管,作为实验板的基本显示组件,可以由8255的PA、PB、PC口驱动,也可由一般IO(74LS373)驱动。

(通过般上跳线实现),组成灵活的显示输出方式。

其连接关系如图1,

图1LED显示模块连接关系图

从图1中可以看到,LED显示模块与8255芯片的PA、PC口有关,与简单IO口的输出有关。

组合方式为:

以8255芯片为主,PA口接数据端口,PA口设置为输出,PC口为选通端口,设置为输出。

e)4X4键盘

十六位动态扫描键盘,作为实验板的人机对话组件,可以和实验板的8255的PC0口连接(通过跳线实现)。

其连接关系如图11。

图2键盘连接关系图

4X4非编码矩阵键盘分为4根输出线状态线(列线)和4根输入检测线(行线),行线通过上拉电阻接VCC。

平时无按键动作时,行线处于高电平状态,而当有按键按下时,行线电平状态将由与此行线相连的列线电平决定。

列线如果为低,则行线电平为低;列线电平为高,则行线电平亦为高。

这一点是识别矩阵键盘按键是否被按下的关键。

但由于行列线是多键共用,所以按键的识别需通过扫描的方法实现,这是矩阵键盘设计的关键。

五、总体设计

图4-1总体设计框图

六、实验过程及数据记录

1、实验连接图

2、运行

3、按下开始/恢复按钮,计时开始。

4、按下时加1,分加1,秒加1,调整时间

5、按下重新计时,时间清零。

七、实验程序

#include"reg51.h"

xdataunsignedcharP_8255_at_0x003;//8255的控制口

xdataunsignedcharPA_8255_at_0x000;//8255的PA口

xdataunsignedcharPB_8255_at_0x001;//8255的PB口

xdataunsignedcharPC_8255_at_0x002;//8255的PC口

codeunsignedcharTAB[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x02,0x01,0x0};

dataunsignedcharLEDcash[8],sec,min,hour,hang,lie;

dataunsignedcharbuffer,key,flag;

bitbsec;

bitbkey;

//延时1ms

voidDelay1ms()

{

unsignedchari;

i=0;

while(--i);

}

//显示

Display()

{

unsignedchari=0xfe;

unsignedcharj;

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

{

PA_8255=i;

PB_8255=TAB[LEDcash[j]];

i=(i<<1)|0x01;

Delay1ms();

}

}

voidDelay10ms()

{

unsignedi,j,k;

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

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

for(k=0;k<0xf9;k++);

}

//外中断0服务函数

voidInt0()interrupt0

{EX0=0;

if((PC_8255&0x0f)!

=0x0f)

{Delay10ms();//消抖

if((PC_8255&0x0f)!

=0x0f)

{

bkey=1;

PC_8255=0xef;

while(PC_8255!

=0xff)

{if((PC_8255&0x0f)!

=0x0f)

{lie=PC_8255&0xf0;

hang=PC_8255&0x0f;

buffer=hang|lie;

switch(buffer)

{

case0xee:

key=0;break;

case0xde:

key=1;break;

case0xbe:

key=2;break;

case0x7e:

key=3;break;

case0xed:

key=4;break;

case0xdd:

key=5;break;

case0xbd:

key=6;break;

case0x7d:

key=7;break;

case0xeb:

key=8;break;

case0xdb:

key=9;break;

case0xbb:

key=10;break;

case0x7b:

key=11;break;

case0xe7:

key=12;break;

case0xd7:

key=13;break;

case0xb7:

key=14;break;

case0x77:

key=15;break;

}

}

elsePC_8255=PC_8255<<1|0x01;

}

}

}

P_8255=0x81;

PC_8255=0x0f;

EX0=1;

}

//50ms中断服务函数

voidINT_Timer0(void)interrupt1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

flag++;

if(flag==20)

{bsec=1;

flag=0;

sec++;

if(sec==60)

{sec=0;

min++;

if(min==60)

{min=0;

hour++;

if(hour==24)

{hour=0;

}

}

}

}

P_8255=0x81;

PC_8255=0x0f;

}

//更新显示缓冲区数据函数

voidRefreshdisplay()

{if(key==0)

{TR0=0;

key=17;

}

if(key==1)

{TR0=1;

key=17;

}

if(key==2)

{TR0=0;

sec=0;

min=0;

hour=0;

key=17;

}

if(key==4)

{Delay10ms();

hour++;

if(hour==24)

{hour=0;}

key=17;

}

if(key==5)

{Delay10ms();

min++;

if(min==60)

{min=0;}

key=17;

}

if(key==6)

{Delay10ms();

sec++;

if(sec==60)

{sec=0;}

key=17;

}

LEDcash[0]=sec%10;

LEDcash[1]=sec/10;

LEDcash[2]=0x10;

LEDcash[3]=min%10;

LEDcash[4]=min/10;

LEDcash[5]=0x10;

LEDcash[6]=hour%10;

LEDcash[7]=hour/10;

}

voidmain()

{unsignedchari;

bsec=1;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TMOD=1;

ET0=1;

EA=1;

EX0=1;

EX1=1;

IT0=1;

IT1=1;

TR0=1;

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

{LEDcash[i]=0x00;

}

P_8255=0x81;

PC_8255=0x0f;

while

(1)

{if(bsec==1)

{bsec=0;

Refreshdisplay();

}

if(bkey==1)

{bkey=0;

Refreshdisplay();

}

Display();

}

}

八、实验小结

本次实验不仅学会了使用Proteus,Keil软件,并且还对51单片机的编程以及调测也有了更进一步的理解,虽然在开头时遇到了很多困难,但是到了最后,感受收获很大,真的学习到了很多的东西。

本次的课程设计,我们实现的功能还是比较完善的,基本要求都能达到。

由于使用的是C语言编程,使功能实现的更加方便。

当然我们还是遇到了很多的问题,例如如果8255端口设置错误的话,LED将不显示时间;还有就是本来记录间隔是用定时中断来做的,但是发现一开中断屏幕就会闪的很厉害,于是利用消抖程序,在程序的常规模式设计中定时,导致了定时的不准确。

另外比较遗憾的是,我们只完成了实验的电路设计仿真。

在将来的学习中,我希望能够更加完善的实现电路,功能也能更加强劲,同时硬件也能运行起来。

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

当前位置:首页 > 小学教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1