要求:
1、两队各三位显示,共计六位数码显示;
2、设A、B队加、减分按键,复位键;
3、加减分实现1分、2分、3分加减。
升级:
1、两队各三位显示,共计六位数码显示;
2、设A、B队加、减分按键、复位按键;
3、计时开始/暂停按键、归零按键、归12按键;
4、分钟加1按键、交换场地按键;
获取该 程序+protues 的方式:
2、关注微信公众号下载:
① 关注微信公众号:Tech云
②
3、可以关注点赞并在下方评论,我给你邮箱发过去。
一、Protues仿真图:
二、程序源码:
因为注释非常的全,这里就不再进行讲解了。
----------------------控制分数部分-------------------------
/*******************************************************************************
================================================================================
【平 台】STC89C51_sumjess平台
【编 写】sumjess
【软件版本】V2.0
【最后更新】2019年06月10日
【相关信息参考下列地址】
【网 站】
http://www.51hei.com/bbs/mcu-2-1.html
---------------------------------------------------------------------------------
【dev.env.】MDK4.02及以上版本
【Target 】STC89C51
第一次修订:2019/05/09
第二次修订:2019/05/21
第三次修订:2019/06/10
【problem 】
(1)库内补充的不全面;
(2)库内解释部分不全面;
(3)库内还存在一定的bug;
【direction】
下一步的目标就是把库继续集成!
【explain 】
为了方便使用,我也自己写了很多的库,和优化了算法和表示方式!
【warning】
目前程序中暂无错误 !
---------------------------------------------------------------------------------
没有完美的代码,只有不断的奉献,大家一起努力;
赠人玫瑰手留余香,欢迎大家反馈bug!
================================================================================
********************************************************************************/
/控制分数单片机/
#include <reg51.h>
#define LDUAN P0 //段选
#define LWEI P2 //位选
#define RDUAN P1 //段选
#define RWEI P2 //位选
#define uchar unsigned char
#define uint unsigned int
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
// 0 1 2 3 4 5 6 7 8 9 a b c d e f
sbit key1=P3^0; //左边加分
sbit key2=P3^1; //左边减分
sbit key3=P3^2; //右边加分
sbit key4=P3^3; //右边减分
sbit key5=P3^6; //交换场地
sbit led1=P3^4; //左边 LED
sbit led2=P3^5; //右边 LED
uchar lnum,rnum,a;//左方分数计数、右方分数计数、中间变量
void delay(unsigned int num) //延时函数
{
unsigned i,j;
for(i=num;i>0;i--)
for(j=120;j>0;j--);
}
void main()
{
led1=0; //关闭LED
led2=0; //关闭LED
while(1)
{
/数码管显示/
P2=0xff;
LWEI=0xfb;
LDUAN=table[lnum%100/10];
delay(5);
P2=0xff;
LWEI=0xf7;
LDUAN=table[lnum%100%10];
delay(5);
LWEI=0xfd;
LDUAN=table[lnum/100];
delay(5);
P2=0xff;
RWEI=0xbf;
RDUAN=table[rnum%100/10];
delay(5);
P2=0xff;
RWEI=0x7f;
RDUAN=table[rnum%10];
delay(5);
RWEI=0xdf;
RDUAN=table[rnum/100];
delay(5);
/左边加分/
if(!key1)
{
delay(10); //延时消抖
if(!key1)
{
lnum++; //分数加1
led1=1; //LED亮
delay(500); //延时
led1=0; //LED灭
while(!key1); //等待按键释放
}
}
/左边减分/
if(!key2)
{
delay(10); //延时消抖
if(!key2)
{
lnum--; //分数减1
led1=1; //LED亮
delay(500); //延时
led1=0; //LED灭
while(!key2); //等待按键释放
}
}
/右边加分/
if(!key3)
{
delay(10); //延时消抖
if(!key3)
{
rnum++; //分数加1
led2=1; //LED亮
delay(500); //延时
led2=0; //LED灭
while(!key3); //等待按键释放
}
}
/右边减分/
if(!key4)
{
delay(10); //延时消抖
if(!key4)
{
rnum--; //分数减1
led2=1; //LED亮
delay(500); //延时
led2=0; //LED灭
while(!key4); //等待按键释放
}
}
/左右分数交换/
if(!key5)
{
delay(10); //延时消抖
if(!key5)
{
a=rnum; //右边分数赋值给中间变量
rnum=lnum; //左右分数交换
lnum=a; //左右分数交换
while(!key5); //等待按键释放
}
}
//
}
}
----------------------------------控制时间部分-------------------------------
/*******************************************************************************
================================================================================
【平 台】STC89C51_sumjess平台
【编 写】sumjess
【软件版本】V2.0
【最后更新】2019年06月10日
【相关信息参考下列地址】
【网 站】
http://www.51hei.com/bbs/mcu-2-1.html
---------------------------------------------------------------------------------
【dev.env.】MDK4.02及以上版本
【Target 】STC89C51
第一次修订:2019/05/09
第二次修订:2019/05/21
第三次修订:2019/06/10
【problem 】
(1)库内补充的不全面;
(2)库内解释部分不全面;
(3)库内还存在一定的bug;
【direction】
下一步的目标就是把库继续集成!
【explain 】
为了方便使用,我也自己写了很多的库,和优化了算法和表示方式!
【warning】
目前程序中暂无错误 !
---------------------------------------------------------------------------------
没有完美的代码,只有不断的奉献,大家一起努力;
赠人玫瑰手留余香,欢迎大家反馈bug!
================================================================================
********************************************************************************/
/控制时间单片机/
#include <reg51.h>
#define DUAN P0 //段选
#define WEI P2 //位选
#define uchar unsigned char
#define uint unsigned int
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
// 0 1 2 3 4 5 6 7 8 9 a b c d e f
sbit key0=P3^0; //归零
sbit key1=P3^1; //归12
sbit key2=P3^2; //分钟加一
sbit key3=P3^3; //暂停/开始
sbit beep=P3^7; //蜂鸣器
uint addnum; //加一分钟
uchar miaonum,fennum; //秒数,分数
uchar b;
void delay(unsigned int num) //延时函数
{
unsigned i,j;
for(i=num;i>0;i--)
for(j=120;j>0;j--);
}
/*
当用定时器的方式2时,设机器周期为Tcy,定时器产生一次中断的时间为t,
那么需要计数的个数N=t/Tcy,
装入THX和TLX中的数分别为THX=256-N,TLX=256-N
256 ---因为计数器是8位,所以最大装载值256 = 2^8
*/
void Init_TIMER0_2(void) //使用定时器0 --- 11.0592M晶振 1次中断为271.275μs,3686次为1s
{
TMOD=0x02; //设置定时器0为工作方式2(M1M0为10)
TH0=256-250; //装初值11.0592M晶振定时271.275μs数为250
TL0=256-250;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
void main()
{
Init_TIMER0_2();//定时器初始化
beep=0; //关闭蜂鸣器
b=10; //延时---蜂鸣器使用
fennum=12; //分钟初始化
miaonum=0; //秒钟初始化
while(1)
{
/数码管显示/
P2=0xff;
WEI=0xef;
DUAN=table[miaonum/10];
delay(5);
P2=0xff;
WEI=0xdf;
DUAN=table[miaonum%10];
delay(5);
P2=0xff;
WEI=0Xf7;
DUAN=0X40;
delay(5);
P2=0xff;
WEI=0xfd;
DUAN=table[fennum/10];
delay(5);
P2=0xff;
WEI=0xfb;
DUAN=table[fennum%10];
delay(5);
/按键---清零/
if(!key0) //清零
{
delay(10); //延时消抖
if(!key0)
{
fennum=0; //分钟赋值为0
miaonum=0; //秒钟赋值为0
}
while(!key0); //等待按键释放
}
/按键---分钟归12/
if(!key1) //分钟归12
{
delay(10); //延时消抖
if(!key1)
{
fennum=12; //分钟赋值为12
miaonum=0; //秒钟赋值为0
}
while(!key1); //等待按键释放
}
/按键---分钟加1/
if(!key2) //分钟加1
{
delay(10); //延时消抖
if(!key2) fennum++; //分钟加1
while(!key2); //等待按键释放
}
/按键---暂停/开始/
if(!key3) //暂停/开始
{
delay(10); //延时消抖
if(!key3)
{
TR0=~TR0; //定时器开关
while(!key3);//等待按键释放
}
}
}
}
void timer0() interrupt 1
{
addnum++;
if(addnum==400)
{
if(fennum!=0)
{
if(miaonum==0)
miaonum=59,fennum--,addnum=0;
else
miaonum--;
addnum=0;
}
if(fennum==0)
{
if(miaonum==0)
miaonum=0;
else
miaonum--;
addnum=0;
}
if(fennum==0)
{
if(miaonum==0)
{
if(b==0)
beep=0;
else
beep=1,b--;
}
}
}
}