这是我上个月做的单片机秒表课程设计,这个课程设计是实现00到99秒的一个秒表,
并且有开始和复位功能,
用了一个星期的时间,
附件里面包含秒表的单片机源程序,proteus仿真电路图和课设文档,
都是自己做的,请大家多多指教。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
秒表的设计与仿真
一、设计要求
设计一个2位的LED数码显示的“秒表”:显示时间为00—99秒,每秒自动加1,另设计一个“开始”键和一个“复位”键。
二、方案论证
方案一:
用数字电路来实现秒表的设计。由NE555定时器组成的多谐振荡器通过开关控制,把脉冲送到计数器,通过计数器计数,在送入译码器进行译码,最后送入数码管进行显示。框图如下:
(见附件)
优点:用到了之前学习的数电的相关知识,用NE555等一系列芯片就可以实现秒表的数字电路,显示直观,读取方便,精度高,不需要软件编程。
缺点:使用的硬件非常多,使用的空间非常大,电路十分复杂,从经济上也不是很划算。
方案二:
用单片机控制秒表来实现,采用AT89C51单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合硬件电路如电源电路,晶振电路,复位电路,显示电路,以及一些按键电路等来设计计时器,将软件和硬件结合起来。其中软件部分采用的是C语言编写程序,包含了显示程序,中断,延时程序等等,硬件用的Proteus软件来连接的秒表电路,主要使用了AT80C51芯片,晶振,电容等基本器件。框图如下:(见附件)
优点:利用了单片机的定时功能,只需要少量的连线再加上软件编程控制,就可以实现秒表的设计电路,节省了花费,提高了技术的精度,更加容易修改。
缺点:除了连接硬件电路,增加了软件的编程,需要额外掌握软件的编程技术,还要考虑到硬件的连接来进行编程。
通过上面两种方案的比较,可以发现单片机使用的硬件更加少,计时的精度也很高,节省了很大的空间,修改时只需要修改部分程序和部分接线就可以改变计数方式和技术范围,所以这次的秒表的设计应该选择单片机设计的方案二。
三、理论设计
硬件部分
1.按键电路:
1.1 当按下K1键时给P1.6接口一个低电平,单片机工作,数码管开始显示,进行开始功能。
1.2 当按下K2键时给P1.7接口一个低电平,单片机工作,数码管清零,进行复位功能。
2.复位电路:
2.1按键按下给单片机的RST接口一个高电平,让单片机系统复位。
3.晶振电路:
3.1晶振电路为单片机合格的时钟信号流,给整个电路的时序提供一个基本时钟,这里晶振频率为11.0592MHz。
4.显示电路:
4.1采用两个共阳LED数码管,通过单片机的P0接口和P3接口来驱动显示出秒数的个位和十位。
软件部分
软件流程图如下:
(见附件)
四、电路仿真及仿真结果分析
仿真结果:将Keil生成的。hex文件添加到AT80C51中后,运行仿真电路如图所示,会显示出00到99s的秒表功能,系统可以正常工作。
五、心得体会
通过这次课程设计,认识到自己有很多不足之处,需要根据课程的设计要求找到合适的方案,设计好程序流程图,以此来写出相应的程序,还地添加一些额外程序来试系统变得更加稳定,程序应该由各种子程序组成,并加上注释,这样程序出错时或者仿真运行显示不出正确的结果时,可以更加方便的找到出错的地方。这次的秒表设计,仿真硬件电路不是很麻烦,主要都是需要写出适合的正确的程序来进行驱动,通过这次的课程设计,更加系统的锻炼了自己。
单片机源程序:
#include
typedef unsigned char uint8;
typedef unsigned int uint16;
/*七段共阴管显示定义*/
uint8 code dispcode[ ]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
/*定义并初始化变量*/
uint8 seconde=0;// second 调整定义
uint16 mstcnt=0;//minite调整定义
sbit key1=P1^6; //定义P1.6端口为按键1
sbit key2=P1^7;//定义p1.7端口为按键2
/*函数声明*/
void delay(uint8 k ); //延时子程序
void time_pro( ); //时间处理子程序
void display( ); //显示子程序
void keyscan( ); //键盘扫描子程序
/*延时子程序*/
void delay (uint8 k)
{
uint8 j;
while((k--)!=0)
{
for(j=0;j<125;j++)
{;}
}
}
/*时间处理子程序*/
void time_pro(void)
{
if(seconde==99)//秒钟设为99进制
{
seconde=0;
}
}
/* 显示子程序*/
void display(void)
{
P0=dispcode[seconde/10]; //显示秒的十位
delay(4);
P3=dispcode[seconde%10]; //显示秒的个位
delay(4);
}
/*键盘扫描子程序*/
void keyscan (void)
{
if(key1==0) //按键1为开始键
{
delay(60);
if(key1==0)
EA=1;
delay(60);
seconde++;
}
if(seconde==99)
{seconde=0;
}
if(key2==0) //按键2为复位键
{
delay(60);
if(key2==0)
{
delay(60);
seconde=0;
delay(60);
EA=0;
}
}
}
/*1s定时子程序 */
void timer0(void) interrupt 1 using 0
{
TH0=0xff;
TL0=0x19;
TMOD = 0x01;//定时器0方式1,250us中断一次
mstcnt++;
if(mstcnt==4000)
{
seconde++;
mstcnt=0; //对计数单元的清零
}
}
/*主函数*/
void main(void)
{
P0=0xff; //初始化p0口,全设为1使数码管
TMOD = 0x01; //time0为定时器,方式1
TH0=0xff; //预置计数初值
TL0=0x19;
EA=0;
ET0=1;
TR0=1;
while (1)
{
keyscan( ); //按键扫描
time_pro( ); //时间处理
display( ); //显示时间
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』