求一份关于篮球计分器的51单片机C语言程序
我的QQ无缘无辜不能加好友了,我是年费会员,好友上限还早呢,发送请求都可以的,但是就是加不进来,好多电脑都试过了,都加不了
#include //加载头文件
#define uchar unsigned char
#define uint unsigned int
/***************************声明特殊寄存器*******************************/
/********************LED数码管表格*************************/
uchar code numtab[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
/****************************定义变量*************************************/
uchar Display_Cache_1;//显示缓存_分钟
uchar Display_Cache_2;//显示缓存_秒钟
uchar Display_Cache_3;//显示缓存_分数1
uchar Display_Cache_4;//显示缓存_分数2
uchar Minute;//分钟
uchar Second;//秒钟
uchar Millisecond;//毫秒
uchar A_goal_1;//得分1
uchar A_goal_2;//得分2
/*********************定义按键************************/
sbit k1=P3^0;//开始/暂停
sbit k2=P3^1;//停止
sbit k3=P3^2;//加分1
sbit k4=P3^3;//加分2
/*********************定义数码管公共端************************/
sbit Minute_Ten =P2^0;//分钟十位
sbit Minute_A =P2^1;//分钟个位
sbit Second_Ten =P2^2;//秒钟十位
sbit Second_A =P2^3;//秒钟个位
sbit A_goal_1_Ten =P2^4;//得分1十位
sbit A_goal_1_A =P2^5;//得分1个位
sbit A_goal_2_Ten =P2^6;//得分2十位
sbit A_goal_2_A =P2^7;//得分2个位
/*******************声明函数************************/
void delys(uchar);//显示扫描延时
void delys4(uint);//按键延时
void Ammonium_key();//按键处理
void Display_Scanning(uchar data1,uchar data2,uchar data3,uchar data4);//显示扫描
void Initialization()
{
TMOD=0x01;//
TH0=(65536-50000)/256;//
TL0=(65536-50000)%256;//
IE=0x82;//
TR0=1;//设置定时器0
Minute =12;
Second=0;
Millisecond=0;
A_goal_1=0;
A_goal_2=0;
}
/********************主函数*************************/
void main()
{
Initialization();
while(1)
{
Ammonium_key();
Display_Scanning(Minute,Second,A_goal_1,A_goal_2);
}
}
/*****************************按键***************************************/
void Ammonium_key()
{
if(k1==0)
{
delys4(100);//按键延时消抖
if (k1!=0)
{
TR0=~TR0;
}
}
if(k2==0)
{
delys4(100);//按键延时消抖
if (k2!=0)
{
Initialization();
}
}
if(k3==0)
{
delys4(100);//按键延时消抖
if (k3!=0)
{
A_goal_1 ++;
}
}
if(k4==0)
{
delys4(100);//按键延时消抖
if (k4!=0)
{
A_goal_2 ++;
}
}
}
/********************显示扫描延时*************************/
void delys(uchar i)
{
uchar f,l;
for (f=i; f>0; f--)
for (l=150; l>0; l--);
}
/********************按键延时*************************/
void delys4(uint i)
{
while (i--)
{
Display_Scanning(Minute,Second,A_goal_1,A_goal_2);
}
}
/************************显示扫描****************************/
void Display_Scanning(uchar data1,uchar data2,uchar data3,uchar data4)
{
Minute_Ten=0;//
P0=numtab[data1/10%10];//
delys(1);//
Minute_Ten=1;//显示十位
P0=0xff;//
Minute_A=0;//
P0=numtab[data1%10];//
delys(1);//
Minute_A=1;//显示个位
P0=0xff;//
Second_Ten=0;//
P0=numtab[data2/10%10];//
delys(1);//
Second_Ten=1;//显示十位
P0=0xff;//
Second_A=0;//
P0=numtab[data2%10];//
delys(1);//
Second_A=1;//显示个位
P0=0xff;//
A_goal_1_Ten=0;//
P0=numtab[data3/10%10];//
delys(1);//
A_goal_1_Ten=1;//显示十位
P0=0xff;//
A_goal_1_A=0;//
P0=numtab[data3%10];//
delys(1);//
A_goal_1_A=1;//显示个位
P0=0xff;//
A_goal_2_Ten=0;//
P0=numtab[data4/10%10];//
delys(1);//
A_goal_2_Ten=1;//显示十位
P0=0xff;//
A_goal_2_A=0;//
P0=numtab[data4%10];//
delys(1);//
A_goal_2_A=1;//显示个位
P0=0xff;//
}
/****************************定时中断0*************************************/
void Timer_interrupt()interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
Millisecond++;
if (Millisecond>19)
{
Millisecond =0;
if (Second>0)
{
Second --;
}else{
if (Minute>0)
{
Minute--;
Second =59;
}else{
TR0=0;
}
}
}
}
仿真和编译文件下载:
这是一个数码管显示的篮球计分程序,你可以参考一下:
#include"reg52.h"
#define u8 unsigned char
#define u16 unsigned int
sbit UP_1 = P1^1; //第一队加分键
sbit DOWN_1 = P1^2; //第一队减分键
sbit UP_2 = P1^3; //第二队加分键
sbit DOWN_2 = P1^4; //第二队减分键
sbit Change = P1^5; //交换键
sbit Begin = P1^6; //开始键
sbit Pause = P1^7; //暂停键
sbit Beef = P2^4; //蜂鸣器
sbit duan = P2^3; //段选
sbit wei = P2^2; //位选
u8 Grate_1=0; //第一队计分
u8 Grate_2=0; //第二队计分
u8 Grate_change=0; //换场标志
u8 Time = 99; //总时间
u16 Flag=0; //计时次数
u8 leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
};
void InitTimer1(void)
{
TMOD = 0x10; //定时器1设为模式1
TH1 = 0xFC;
TL1 = 0x18; //1ms
EA = 1; //开总中断
ET1 = 1; //开定时器1中断
// TR1 = 1; //
}
void delay(u8 d) //延时
{
u8 a,b,c;
for(c=d;c>0;c--)
for(b=17;b>0;b--)
for(a=16;a>0;a--);
}
void beef(u8 d) //发声
{
u8 a,b,c;
for(c=d;c>0;c--)
for(b=17;b>0;b--)
for(a=16;a>0;a--)
{
Beef=~Beef;
}
}
void display(u8 grate_1,u8 grate_2,u8 time) //显示
{
u8 w1,w2,w3,w4,w7,w8;
w1=grate_1/10; //计算第一队分数十位
w2=grate_1%10; //计算第一队分数个位
w3=grate_2/10; //计算第二队分数十位
w4=grate_2%10; //计算第二队分数个位
w7=time/10; //计算时间十位
w8=time%10; //计算时间个位
P0=0xff; //消隐,该段显示第一队分数十位
wei=1;
P0=0xfe; //送位码
wei=0;
P0=0xff;
duan=1;
P0=leddata[w1]; //送段码
duan=0;
delay(5);
P0=0xff; //显示第一队分数个位
wei=1;
P0=0xfd;
wei=0;
P0=0xff;
duan=1;
P0=leddata[w2];
duan=0;
delay(5);
P0=0xff; //显示第二队分数十位
wei=1;
P0=0xf7;
wei=0;
P0=0xff;
duan=1;
P0=leddata[w3];
duan=0;
delay(5);
P0=0xff; //显示第二队分数个位
wei=1;
P0=0xef;
wei=0;
P0=0xff;
duan=1;
P0=leddata[w4];
duan=0;
delay(5);
P0=0xff; //显示时间十位
wei=1;
P0=0xbf;
wei=0;
P0=0xff;
duan=1;
P0=leddata[w7];
duan=0;
delay(5);
P0=0xff; //显示时间个位
wei=1;
P0=0x7f;
wei=0;
P0=0xff;
duan=1;
P0=leddata[w8];
duan=0;
delay(5);
}
void main()
{
InitTimer1(); //初始化定时器1
UP_1 = 1; //以下初始化IO口
DOWN_1 = 1;
UP_2 = 1;
DOWN_2 = 1;
Change = 1;
Begin = 1;
while(1)
{
if(UP_1==0) //如果第一队加分键按下
{
ET1 = 0; //关闭定时器1中断
delay(5); //稍加延时
while(UP_1==0);//等待按键抬起
Grate_1++; //第一队分数加1
ET1 = 1; //开启定时器1中断
}
if(DOWN_1==0) //如果第一队减分键按下
{
ET1 = 0;
delay(5);
while(DOWN_1==0);
Grate_1--; //第一队分数减1
ET1 = 1;
}
if(UP_2==0) //如果第二队加分键按下
{
ET1 = 0;
delay(5);
while(UP_2==0);
Grate_2++; //第二队分数加1
ET1 = 1;
}
if(DOWN_2==0) //如果第二队减分键按下
{
ET1 = 0;
delay(5);
while(DOWN_2==0);
Grate_2--; //第二队分数减1
ET1 = 1;
}
if(Change==0) //如果换场键按下
{
ET1 = 0;
delay(5);
while(Change==0);
Grate_change=Grate_1; //一下三行语句完成分数交换显示
Grate_1=Grate_2;
Grate_2=Grate_change;
ET1 = 1;
}
if(Begin==0) //如果开始键按下
{
delay(5);
while(Begin==0);
TR1 = 1; //开启定时器1
}
if(Pause==0)
{
delay(5);
while(Pause==0);
TR1=0;
}
if(Time<=0) //如果时间计数到0
{
Time=99; //恢复初始时间
TR1 = 0; //关闭定时器1
beef(100); //发声
}
display(Grate_1,Grate_2,Time); //显示分数、时间
}
}
void Timer1Interrupt(void) interrupt 3 //定时器1中断函数
{
TH1 = 0xFC; //重赋初值
TL1 = 0x18;
Flag++; //中断次数加1
if(Flag>=1000)//1000次也就是1秒到
{
Flag=0;
Time--; //秒变量减1
}
}
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。 目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
答:这是一个数码管显示的篮球计分程序,你可以参考一下:#include"reg52.h"#define u8 unsigned char#define u16 unsigned intsbit UP_1 = P1^1; //第一队加分键sbit DOWN_1 = P1^2; //第一队减分键sbit UP_2 = P1^3; //第二队加分键sbit DOWN_2 = P1^4; //第二队减分...
答:s2 = P3^1; // 定义按键2引脚 sbit led1 = P1^0; // 定义LED1引脚 sbit led2 = P1^1; // 定义LED2引脚 unsigned char score_a = 0; // 篮球A队得分变量,初始化为0 unsigned char score_b = 0; // 篮球B队得分变量,初始化为0 void delay(unsigned int i) /...
答:课程设计实验报告一、题目:篮球记分器2、主要元器件:STC89C5212M晶振四位一体数码管两位数码管2个4.7K欧排阻2个极性电容电容22pF电阻10K欧开关8个导线若干3、主要功能:1.12分钟倒计时2.分别给A、B队加1、2、3分并显示3.换场A、B两队分数交换4.暂停4、工作原理:1.原理图2.方框图3.实物图4...
答:1有效u8 key_sc=0xff;//上次扫描的按键值//按键扫描程序void scanKey(){static u8 temp0;static u8 ms;u8 temp=0;if(k_kt==1)temp|=Kkt;if(k_add1==1)temp|=Kadd1;if(k_add2==1)temp|=Kadd2;if(k_add3==1)temp|=Kadd3;if(k_sub1==1)temp|=Ksub1;if(temp==temp0)...
答:参考下面电路:篮球比赛中,得分可分为1分、2分、3分三种情况,为防止出见加分错误要另设一减分开关。根据这样的设计要求,结合数码管的显示以及51单片机中计数器的工作实现方式、接口应用、中断控制等可设计出程序流程图如下所示:部分程序如下:数码管的显示,在TAB中加入数码管显示数字时对应的16进制...
答:用单片机做篮球计分器,8个按钮用于计分,这个可以实现,计多少分都可以,可由程序来控制实现。仿图如下图所示。
答:MCS-51就是按照创新模式发展起来的单片形态的嵌入式系统。MCS-51是在MCS-48探索基础上,进行全面完善的嵌入式系统,成为单片嵌入式系统的典型结构体系。体育比赛计分器是对体育比赛过程中所产生的比分等数据进行快速采集记录、加工处理、传递利用的工具。篮球比赛的计分器是一种得分类型的 ...
答:=0xff?0:1);//按下按键,蜂鸣器响if(readPIN(key,4)==0){//判断给哪一方加减分jjf(&count);}else {jjf(&count1);}lan();if(la_count==2){if(s24off_flag==0){s24=24000;s24off_flag=1;}else {s24off_flag=0;}la_count=3;}}}void timer0() interrupt 1//定时器{ ...
答:void delay(unsigned char x);char scank();void display(char);unsigned char dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};void main(){ char num=0,keynum;while(1){ keynum=scank();num=num+keynum;if(num<0) num=99;if(num>99) num=0;display(num...
答:脉冲宽度是一样的。偶数的话很简单,由模N/2 实现一个占空比为1:1的N分配器。那么奇数 上面的方法显然就不行了,当然,分频的占空比看需求了,没 如果想要得到占空比为50%奇数分频,那可以利用上升沿或者下降沿触发是开始进行模N计数,计数到某一值就给他翻转,然后在经过(N-1)/2,再次翻转,...