基于AT89C52单片机秒表设计

本文介绍了基于52单片机的简易秒表设计,包括电路设计和程序编写。电路使用了常见的元器件如AT89C52单片机、数码管和74LS138译码器。程序主要分为74LS138译码器驱动和按键处理,以及定时器中断服务。通过按键控制秒表的启动、暂停、继续和复位,数码管动态显示计时值。主程序实现了计时逻辑,并在不同状态下更新数码管显示。
摘要由CSDN通过智能技术生成

前言
秒表在我们的日常生活中是一个很常见的产品,秒表电路设计比较简单,内部程序也比较简单,本设计主要讲述的是基于52单片机的简易秒表电路设计与程序编写的思路。程序控制主要可以进行暂停计时,继续计时,和复位。
电路设计
电路设计所用到的元器件也是比较少比较常见的,at89c52单片机一个,一个八位共阴极数码管,一个74LS138译码器,三个按键。单片机中的复位电路与晶振电路省略。需要者可自己加上。
电路图如下所示:
在这里插入图片描述
工作原理
当按下启动按键,数码管开始显示计时的数字,计时可分时、分、秒、毫秒四个值,分别显示在八位数码管上,按下暂停按键的时候,秒表停止计时,显示当前计时值。再次按下启动按键的时候,秒表继续计时。按下停止按键的时候,秒表停止计时并且清楚计时值。数码管显示初始值。
程序设计思路
程序设计主要分两部分:
(1):编写74LS138译码器的驱动程序控制八位数码管的动态扫描显示。
(2):编写按键处理程序以及定时器中断服务程序。
代码如下:
按键处理程序与中断程序

void key_display()     //按键处理
{
	if(key0==0)     //开始
	{
		delay(100);   //消抖
		if(key0==0)
		{
			while(!key0);   //判断按键是否松开
			flag0=1;       //启动标志
		}
	}
	
	if(key1==0)     //暂停
	{
		delay(100);
		if(key1==0)
		{
			while(!key1);
			flag0=0;    //flag0=1时为启动标志,flag0=0是为暂停标志
		}
	}
	
	if(key2==0)     //停止
	{
		delay(100);
		if(key2==0)
		{
			while(!key2);     //所以变量清零
			TR0=0;
			flag0=0;
			haomiao=0;
			miao=0;
			fen=0;
			shi=0;
		}
	}
	
}

void Timte_Init()     //定时器中断初始化程序
{
	TMOD=0x01;    //设置定时器中断0的工作方式,设置为方式1
	TH0=0xdc;     //装载触发定时中断数值10ms
	TL0=0x00;
	EA=1;     //打开总中断
	ET0=1;     //打开定时器0中断开关
}

void Time() interrupt 1      //定时器中断处理程序
{
	TH0=0xdc;     //装载初始值10ms
	TL0=0x00;
	flag1++;
}

74LS138译码器驱动程序控制八位数码管代码如下:

void display()    //数码管显示
{
	uchar ii;
	for(ii=0;ii<8;ii++)     //74LS138译码器驱动程序
	{
		switch(ii)
		{
			case 0:
				LSA=0;LSB=0;LSC=0;smgduan=duan_data[shi/10];break;
			case 1:
				LSA=1;LSB=0;LSC=0;smgduan=duan_data[shi%10]|0x80;break;   //时显示,或上一个0x80是为了区分一个毫秒,秒,分,时之间的区别
			case 2:
				LSA=0;LSB=1;LSC=0;smgduan=duan_data[fen/10];break;
			case 3:
				LSA=1;LSB=1;LSC=0;smgduan=duan_data[fen%10]|0x80;break;   //分显示
			case 4:
				LSA=0;LSB=0;LSC=1;smgduan=duan_data[miao/10];break;
			case 5:
				LSA=1;LSB=0;LSC=1;smgduan=duan_data[miao%10]|0x80;break;  //秒显示
			case 6:
				LSA=0;LSB=1;LSC=1;smgduan=duan_data[haomiao/10];break;
			case 7:
				LSA=1;LSB=1;LSC=1;smgduan=duan_data[haomiao%10];break;   //毫秒显示
		}
		delay(50);
		smgduan=0x00;     //数码管消隐,避免显示效果受影响
		delay(50);
	}
}

主程序代码如下:

#include <reg52.h>

typedef unsigned int uint;
typedef unsigned char uchar;

#define smgduan P0
//定义74LS138译码器I/O端口
sbit LSA=P1^0;
sbit LSB=P1^1;
sbit LSC=P1^2;
sbit G2A=P1^3;
//定义按键I/O端口
sbit key0=P2^0;   //启动
sbit key1=P2^1;   //暂停
sbit key2=P2^2;    //停止

uchar code duan_data[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
//共阴极数码管段码0~F
uchar flag0,flag1;     //flag0为按键值存储标志,flag1位定时器中断变量
uchar haomiao,miao,fen,shi;     //毫秒,秒,分,时变量

void delay(uint i)     //软件延时函数
{
	while(i--);
}

void main()
{
	G2A=0;
	Timte_Init();    //条用定时器初始化函数
	while(1)
	{
		key_display();    //调用按键处理函数
		if(flag0==1)    //启动转态,flag0=1时正常计时,flag0=0时为暂停状态
		{
			TR0=1;   //打开定时器定时开关
			if(flag1==1)    //毫秒判断
			{
				haomiao++;
				flag1=0;
				if(haomiao==100)    //秒判断
				{
					miao++;
					haomiao=0;
					if(miao==60)    //分判断
					{
						fen++;
						miao=0;
						if(fen==60)    //时判断
						{
							shi++;
							fen=0;
							if(shi==99)    //最大计时数为99个小时
							{
								shi=0;
							}
						}
					}
				}
			}
		}
		else     //暂停状态
		{
			TR0=0;    //关闭定时器开关
			display();   //调用数码管显示函数
		}
		display();
	}
}

以上所有就是简易秒表的电路设计与程序编写,希望能帮助一些需要的人,可根据以上资料可自己进行一些修改使它变得更加完美,写的不好,还望理解。互帮互助,学无止境。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值