电子钟报告.docx
- 文档编号:26751582
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:15
- 大小:99.55KB
电子钟报告.docx
《电子钟报告.docx》由会员分享,可在线阅读,更多相关《电子钟报告.docx(15页珍藏版)》请在冰豆网上搜索。
电子钟报告
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将不显示时间;还有就是本来记录间隔是用定时中断来做的,但是发现一开中断屏幕就会闪的很厉害,于是利用消抖程序,在程序的常规模式设计中定时,导致了定时的不准确。
另外比较遗憾的是,我们只完成了实验的电路设计仿真。
在将来的学习中,我希望能够更加完善的实现电路,功能也能更加强劲,同时硬件也能运行起来。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子钟 报告