前言
秒表在我们的日常生活中是一个很常见的产品,秒表电路设计比较简单,内部程序也比较简单,本设计主要讲述的是基于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();
}
}
以上所有就是简易秒表的电路设计与程序编写,希望能帮助一些需要的人,可根据以上资料可自己进行一些修改使它变得更加完美,写的不好,还望理解。互帮互助,学无止境。