跪求51单片机99秒表编程,K1开始K2复位,最好后面附加解释!

如题所述

#include <reg52.h> //52系列单片机头文件

#define uchar unsigned char //宏定义

#define uint unsigned int


sbit Key = P1^7; //按键位声明

uchar Key_count; //全局变量: 按键计次值

uchar i; //全局变量: 定时器中断次数

uint s; //全局变量: 0.1秒计数


uchar Display_code[]={ //共阴数码管显示码

  0x3f,0x06,0x5b,0x4f,0x66, //0~4

0x6d,0x7d,0x07,0x7f,0x6f  }; //5~9


void Delay_ms(uint t) //t ms延时函数

{

  uchar j; //循环变量

while(t--) //循环t次

{

for(j=0;j<120;j++); //嵌套循环120次

}

}


void Key_scan_Handle() //按键扫描处理函数

{

if(Key==0) //如果按键按下

{

Delay_ms(10); //延时10ms,消抖动

if(Key==0) //确认按键

{

++Key_count; //按键计次值加1

if(Key_count==3) //若按键计次值为3,

Key_count=0; //则重置0

}


switch(Key_count) //根据按键计次值选择

{

case 0: //上电或第3次按键,显示归0

i=0; //中断次数归0

s=0; //秒计数归0

break;


case 1: //按第一次,开始计时

TR0=1; //启动T0

break;

case 2: //第二次按键,停止计时,

TR0=0; //关闭T0

break;

}

}

while(Key==0); //等待键松开(此句很关键!)

    //无此句时,第二次按键即归0

}


void main() //主函数

{

TMOD = 0x01; //设置T0为工作方式1

TH0  = (65535-50000)/256; //装T0定时50ms初值

TL0  = (65535-50000)%256; 

EA=1; //开总中断

  ET0=1; //开T0中断


while(1) //无限循环

{

Key_scan_Handle(); //调用按键扫描处理函数

  P0=Display_code[s/100]; //十位显示值送P0口

P2=Display_code[s%100/10]; //个位显示值送P2口

P3=Display_code[s%10]; //十分之一位显示值送P3口

}

}


void Timer0() interrupt 1 //T0中断服务子程序

{

  TH0  = (65535-50000)/256; //重装50ms定时初值

TL0  = (65535-50000)%256;


if(++i==2) //每中断2次为100ms,即1/10秒

{

i = 0; //中断次数归0,重新计数

++s; //秒计数值加1

if(s==1000)s = 0; //若秒计数值到1000,重置0

}

}

若要用两个按键控制,请增加一个按键,并修改一下键盘扫描子程序即可,不必多说。

显示方面也可采用三位一体或四位一体数码管,也只须对程序稍加修改即得。

追问

太谢谢了

温馨提示:答案为网友推荐,仅供参考