6位LED显示时钟计时器Word文档下载推荐.docx
《6位LED显示时钟计时器Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《6位LED显示时钟计时器Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
3.硬件设计
时钟计时器的硬件电路如图所示。
该电路采用AT89S52单片机最小化应用实际;
采用共阳7段LED显示器;
P0口输出段码数据;
P2.0~P2.5口作列扫描输出;
P1.0、P1.1、P1.2、和P1.3口接4个按键开关,用于调时及功能设置;
P1.7端口接5v的小蜂鸣器,用于按键发音及定时提醒、整点到时提醒等;
为了提供共阳LED数码管的列扫描驱动电压,用三极管9012做电源驱动输出;
采用12MHZ晶振,可提高秒计时的精确性。
4.实验目的
1.掌握stc89c52编程原理。
a.掌握stc89c52可编程并行接口的工作原理及初始化方法,验证各种工作方式的功能。
b.掌握用stc89c52扩展PC机并行接口的方式。
c.了解stc89c52工作在方式1时,利用应答信号控制数据传输的过程。
2.了解键盘电路的工作原理。
矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。
在行线和列线的每一个交叉点上,设置一个按键。
这样键盘中按键的个数是4×
4个。
这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。
3.掌握键盘接口电路的编程方法。
设计人机界面接口,要求在微机屏幕上动态地显示当前实验的内容和实验的结果,包括stc89c52的工作方式,输入的数据和输出的结果
设计人机界面接口,要求在微机屏幕上,以菜单方式列出并行接口stc89c52原理实验的内容,并根据实验内容设置好工作方式选择跳线开关,用户可以通过键盘选择实验的内容。
设计原理与分析
1、实验原理:
为了实现LED显示器的数字显示,可以采用静态显示法和动态显示法。
(1)最小系统及控制原理图
(2)LED显示及驱动
4.软件设计
主程序
本设计中计时采用定时器T0中断完成,秒表使用定时器T1中断完成。
主程序循环调用显示子程序和查键子程序,当端口有开关按下时,转入相应功能程序。
其主程序执行流程如下图
按时间鸣叫次数
以上为主程序流程图
显示子程序
时间显示子程序每次显示6个连续内存单元的十进制BCD码数据,首地址在调用显示程序时现指定。
显示时,先取出内存地址中的数据,然后查的对应的显示用段码从P0口输出,P2口将对应段码选中供电,就能显示该地址单元的数据值。
为了显示小数点及“-”“A”等特殊字符,在显示班级和计时时应采用不同的显示子程序。
定时器T0中断服务程序
定时器T0用于时间计时。
定时溢出中断周期设为50ms,中断进入后先进行定时中断初值校正,当中断里累计20次时,对秒计数单元进行加1操作。
时钟计数单元地址分别在70H~71H、76H~77H、78H~79H中,最大计时值为23时59分59秒。
7AH单元内存放“熄灭符“数据(#0A),用于时间调整时的闪烁功能。
在计数单元中,采用十进制BCD码计数,满10进位。
流程图如下
T0中断计时程序流程图
5.系统调试
调试分为硬件调试和软件调试
硬件调试:
在焊接电路板的时候,应该从最基本的最小系统开始,分模块,逐个进行焊接测试。
在对各个硬件模块进行测试时,要保证软件正确的情况下去测试硬件,要不然发生错误时,不知道到底是哪一方出错了。
当然,在设计的过程中也存在着失误和不足,在调试中进行修改了。
软件调试:
软件为老师所提供提供,其原理在上一模块以作说明,在这里
再作说明,软件经调试无误,直接将其下再到单片机中,看是否达到所要的效果
软件部分是先参考书上的例子,然后自己根据硬件电路写程序,
由于以前所学是单片机汇编语言,所以这个系统在编写程序过程中都采用汇编语言编写。
刚刚开始,编写不会一次性通过,经过仔细分析修改最后编译成功。
6.设计总结
本文是关于基于ST89S52设计的时钟计时器,能够进行计时,显示时间,定时提醒等功能。
是非常实用的一个设计,此次的设计对于我们更好的学习和掌握相关知识有很大的帮助。
在此次设计中,我们得到以下体会:
一、在这次时钟计时器设计的过程让我进一步熟悉KEIL及Proteus的使用。
二、重新复习并进一步学习了MCS-52优点,明确了研究目标。
三、在后的设计中,既要想到电路器件的联合使用,又要灵活变通,举一反三。
四、在焊接方面,我们了解到焊接某些器件时,要先消去电烙铁上的静电,防止静电对芯片特别是放大器件造成伤害,焊接二极管、三极管等芯片时要快,防止持续高温损坏芯片。
我们在焊接时争取一次性焊接成功,当焊接好时再去检查时非常困难,所以要非常的仔细。
五、从中我们学习到了大家的团结是非常重要的,组里的每一个成员都是必不可少的,因此团结合作的精神是非常的重要的。
课程设计心得
在此次设计中,我们得到以下体会:
二、重新复习并进一步学习了单片机,明确了研究目标。
/*********************************************************************/
//
//采用8位LED动态扫描时钟演示程序
//LRM2004.03.31
//使用12MHZ晶振,P0口输出段码,P2口作列扫描,用共阳LED数码管
//
#include"
reg51.h"
codechardis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
/*共阳LED段码表"
0"
"
1"
2"
3"
4"
5"
6"
7"
8"
9"
不亮"
*/
codecharscan_con[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//列扫描控制字
datachardisdata[6]={0x00,0x00,0x00,0x00,0x00,0x00};
//计时单元数据初值,共6个
datachardis[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00};
//显示单元数据,共6个数据
datacharcon1s=0x00,con04s=0x00,con=0X00;
//1秒定时用
sbitkey0=0x90;
sbitkey1=0x91;
sbitkey2=0x92;
/****************/
//1毫秒延时程序//
/***************/
delay1ms(intt)
{
inti,j;
for(i=0;
i<
t;
i++)
for(j=0;
j<
120;
j++)
;
}
//键扫描子程序//
keyscan()
EA=0;
if(key0==0)
{
delay1ms(10);
while(key0==0);
if(dis[con]==10)
{dis[7]=dis[con];
dis[con]=dis[6];
dis[6]=dis[7];
con++;
TR0=0;
ET0=0;
TR1=1;
ET1=1;
if(con>
=6)
{con=0;
TR1=0;
ET1=0;
TR0=1;
ET0=1;
}
if(con!
=0)
if(key1==0)
while(key1==0);
disdata[con]++;
if(disdata[con]>
=10)
{disdata[con]=0;
dis[con]=disdata[con];
dis[6]=0x0a;
if(key2==0)
while(key2==0);
if(disdata[con]==0)
{disdata[con]=0x09;
else{disdata[con]--;
EA=1;
/***********/
//扫描程序//
/**********/
scan()
chark;
for(k=0;
k<
6;
k++)
P0=dis_7[dis[k]];
P2=scan_con[k];
delay1ms
(1);
P2=0xff;
/*************/
//初始化程序//
clearmen()
inti;
dis[i]=disdata[i];
TH0=0x3C;
TL0=0xB0;
//;
50MS定时初值(T0计时用)
TH1=0x3C;
TL1=0xB0;
50MS定时初值(T1计时用)
TMOD=0X11;
//主程序//
/*********/
main()
clearmen();
while
(1)
scan();
keyscan();
/********************/
//1秒中断处理程序//
/*******************/
voidtime_intt0(void)interrupt1
con1s++;
if(con1s==20)
con1s=0x00;
disdata[0]++;
if(disdata[0]>
disdata[0]=0;
disdata[1]++;
if(disdata[1]>
disdata[1]=0;
disdata[2]++;
if(disdata[2]>
disdata[2]=0;
disdata[3]++;
if(disdata[3]>
disdata[3]=0;
disdata[4]++;
if(disdata[4]>
disdata[4]=0;
disdata[5]++;
}
if(disdata[5]==2)
{
if(disdata[4]==4)
{
disdata[4]=0;
disdata[5]=0;
}
}
}
}
dis[0]=disdata[0];
dis[1]=disdata[1];
dis[2]=disdata[2];
dis[3]=disdata[3];
dis[4]=disdata[4];
dis[5]=disdata[5];
ET0=1;
//0.4秒闪烁中断程序//
voidtime_intt1(void)interrupt3
con04s++;
if(con04s==8)
con04s=0x00;
dis[7]=dis[con];
EA=1;
//***************************************************************