此程序基于普中51单片机编写
涉及到的原理图:
具体功能
下载程序后,数码管显示00,当第一次按下K3时,定时器开始计时,数码管最右侧两个位以间隔为1s的时间从00到60显示数字;当第二次按下K3时,定时器停止计时,数码管显示当前计时数字;第三次按下K3时,数码管恢复初始情况,显示00
/*********************************************************************************
实验现象:显示秒表功能,从00秒到60秒计时,在数码管中显示出来
另外的实现功能,第一次按下K3按键开始计数,第2次按下K3键停止计数,第三次按下归零
********************************************************************************/
#include <reg51.h> //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit K3=P3^2;
u8 code table[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //显示0~F的值
u8 second;
u8 key=0;
/*****************************************************************************
* 函 数 名 : delay1ms
* 函数功能 : 延时函数,t=1 时,大约延时 1ms
*****************************************************************************/
void delay1ms(u16 t)
{
u16 i,j;
for(i=0;i<t;i++)
{
for(j=0;j<120;j++);
}
}
/*******************************************************************************
* 函 数 名 : ExitInit
* 函数功能 : 初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void ExitInit()
{
TMOD =0X01; //选择为定时器0模式,工作方式1,仅用TR1打开启动。
ET0=1; //打开定时器1中断允许
EA=1; //打开总中断
second=0;
TH0=0xFC; //设定初值,1ms
TL0=0x18;
P3=0xff;
P0=0x00;
}
/*******************************************************************************
* 函 数 名 :Display
* 函数功能 : 数码管显示函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Display(u8 s)
{
LSA=1;LSB=0;LSC=0;
P0=table[s/10]; //从右到左第二个数码管显示十位
delay1ms(5); //消抖5ms
P0=0x00;
LSA=0;LSB=0;LSC=0;
P0=table[s%10]; //最右边数码管显示个位
delay1ms(5); //消抖5ms
P0=0x00; //消隐
}
/*******************************************************************************
* 函 数 名 :Keyscan
* 函数功能 : 按键扫描函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Keyscan()
{
if(K3==0) //判断K3键是否按下
{
delay1ms(10); //消抖10ms
if(K3==0) //再次判断K3键是否按下
{
key++; //计算按下按键的次数
switch(key)
{
case 1: TR0=1; break; //按下第一次,开始计数
case 2: TR0=0; break; //按下第二次,停止计数
case 3: key=0; second=0;TR0=0;break; //按下第三次,数码管归零
default: break;
}
}
while(!K3); //松手检测
}
}
/*******************************************************************************
* 函 数 名 :Display
* 函数功能 : 数码管显示函数
*******************************************************************************/
void main()
{
ExitInit(); //初始化函数
while(1)
{
Display(second); //数码管显示函数
Keyscan(); //按键扫描函数
}
}
/*******************************************************************************
* 函 数 名 : void Timer0() interrupt 3
* 函数功能 : 定时器1中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0() interrupt 1
{
static u16 timer;
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
timer++;
if(timer==1000) //判断是否达到1s
{
timer=0;
second++; //计时达到1s就加1
if(second==60) //判断是否达到60s
second=0;
}
}
(在草稿里待了两年。。。今天突然看到)