求一份关于篮球计分器的51单片机C语言程序

求一份关于篮球计分器的51单片机C语言程序,第1张

这是一个数码管显示的篮球计分程序,你可以参考一下:

#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=dc>0c--)

        for(b=17b>0b--)

           for(a=16a>0a--)

}

void beef(u8 d)   //发声

{

    u8 a,b,c

    for(c=dc>0c--)

        for(b=17b>0b--)

           for(a=16a>0a--)

           {

                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

    }

}

hs渊wrⅷk‰Ⅹhj№qdúg■〖投篮是将篮球从7篮圈上f面投入p球篮的各种动作的总称。篮球比4赛的胜负是由比7赛双8方6得分6多少7决定的。 一x单手6原地投篮: 特别是对青少5年来说,是一z种基本投篮方1式。我们以6右手2投篮为5例: 双4手3持球置于e与w眼睛同高的位置,稍便向右侧,右脚比6左脚稍靠前,双5膝微屈,将球上q举,右手3手3腕后伸,使球体大o部分2重量落在右手3,左手1从7左侧轻轻扶住球体,脚前掌发力v,提起脚跟,伸直双6膝,伸右臂将球投出(参考关于x投篮) 投篮从4手4腕向后弯曲开z始,进而向上a、向前,指尖是最后离开q球体的部位。 二t行进间单手1高手7投篮: 以6右手8投篮为5例。在跑动中4跨右脚的同时接球,左脚跨出一g小d步并用力m向上n起跳,右腿屈膝上m提。双7手3向前上g方2举球,当身体接近最高点时,辅助手1离球,投篮臂充分2向球篮方8向伸手7腕前屈,用食中0指力z量柔和的将球投出。球出手5后,落地屈膝缓冲。动作要点:一d跨二b跳举球高,指腕柔和用力b巧。 三w跳投: 跳投的好处是不m象原地投篮那样容易被对手1封盖。青少7年选手2可能会因为4腿、手8臂、肩部及j背部肌肉力n量不w足而做不y好跳投,那完全可以1暂时放弃,否则因力a量不l足而造成的错误动作会影响自信心4,使以0后力y量达到要求后也v难以8获得理想的跳投技术。 跳投的技术要领如下x:双6手2持球,非投篮手6置于j球前方7或侧方3(按你舒服的位置放)。投篮手8置于d球的后部,双1膝微屈,双5手3持球从1胸部上o移到眼睛上e方7,然后双5脚向上nd跳。跳起时,屈肘(前臂向后),手6腕也n向后翻。跳至最高点时,前臂前伸,手8腕向前、向下k将球投出,随球动作(参考关于q投篮)要充分5,眼睛要始终耵住篮框。 四行进间单手1低手4投篮:动作同行进间高手7投篮,只是投篮方8式是利用手6腕和手7指的力p量,自下e而上z挑球擦板或挑空心0篮。 五i运球接球急停跳投:动作同跳投,在投篮前为0了u摆脱防守而做了c一h系列脚步变向或急停动作,再做跳投。 投篮注意事项 篮球的训练和比8赛中1可以2有很多不f同的投篮方8式,但不z管哪种投篮方8式,有两点是必须做到的: 第一h: 从3脚底发力o,也g就是说虽然是用手4投篮,但力j量是从6脚前掌发起,然后通过脚踝、膝盖、胯部、上q体、手5臂、手0腕,最后力y量传递至手8指尖将篮球投出。力n量的整个h传递应该是一o个x连贯协调的过程。 第二o: 手0臂姿势,应该是上w臂与m前臂呈70度,而手5腕后伸也r与s前臂呈近50度,并与u上h臂平行。手5指持球的后、下h部。投篮时,向上z、向前伸臂(当然是指向篮框),向上d、向前用力e屈手8腕,最后用手0指将球推出,这样投篮会使篮球产生下f旋,碰到篮板或篮框不k会产生很大v的反3d。还应该让手1与x篮球接触的时间尽量长4(即随球动作时间长7),这样有利于c控制球的运动方0向,增加投篮的命中0率在开h始时不z要过多考虑球是否投进了o篮框。把注意力r集中7到身体的姿势、动作以5及r整个v投篮动作的节奏。每次投篮要重复同样的动作要领,正确的投篮动作变得很顺畅的时候,命中4率自然会因此而提高。还应该在离篮框不m同的位置、角度练习r投篮。

投篮机器人

大家都知道或打过篮球,那我们可不可以让机器人打篮球呢?自己搭建机器人,让机器人投篮。比一比看谁的机器人投篮又准又快。

一、学习内容

1.想让投篮机器人做什么

(1)让投篮机器人做什么

(2)分析投篮机器人的机械结构

2.认识投篮机器人的结构

观察机器人的结构特点

3.投篮机器人的程序

(1)利用INVENTOR4编写程序

(2)想一想,如何使投篮更快更准

二、活动场地

1. 机器人投篮赛的活动场地为120cm×220cm。

2. 场地主色为绿色,从起跑线开始,投篮区域颜色依次为绿、白、黑、白。

3. 起跑区域为40cm,投篮最底线距离底边60cm,起跑线为3cm宽的黑线,投篮区为 起跑线至投篮底线之间,并由20cm宽的白色、黑色、白色同心半圆(直径40cm) 及靠近起跑线的绿色区构成。

4. 篮筐直径15cm、高20cm,篮板40cm×40cm,距离底边23cm。

三、想让机器人做什么

机器人到达黑色投篮区后将球投向篮筐。

投篮机器人的机械结构分析

1.检测到黑色投篮区

2.要有一个驱动马达让小车跑

3.要有一个马达控制投篮臂

四、技术实现

1.如何发现投篮区?

可利用光电传感器,发现黑色投篮区时,光电传感器所测到的光值会有所改变,根 据数值决定是否停止前进,进行投篮。

2.如何用一个马达控制轱辘?

投篮机器人与我们前面搭的竞速机器人有所不同,这里我们要用一个马达提供动力来源。

如何投篮?

如何用一个马达控制投篮臂。

在这里我们介绍两种搭建方法:马达直接驱动投篮及利用橡皮筋伸缩力来控制投篮臂。

五、搭建

马达直接驱动投篮臂利用橡皮筋伸缩力来控制投篮臂

1. 马达直接驱动投篮臂的投篮机器人的参考搭建步骤

在这个模型的搭建中用到两个马达,一个用于驱动车子运动,另一个用于完成投篮动作。

(1)底部结构 (2). 橡皮筋控臂投篮机器人的结构

因为只能使用一个马达来提供机器人移动时所需的动力,所以我们使用小齿轮和冠状齿轮,通过动力传导,来驱动机器人行动。我们用触动传感器控制机器人启动。

用另一个马达控制投篮臂

(2)机械臂的结构及制作

调节抛物线的角度 调节橡皮筋的伸缩力

投篮臂和车身连接,再装上RCX,投篮机器人的搭建工作就完成了。

六、利用INVENTOR4来设计控制程序。

参考程序如下:

1.由于投篮机器人要反复进行投篮动作,每次都要按RCX上的启动开关,很不方便, 所以要利用一个触动开关来做启动开关。

2.当按下启动触动开关时,投篮机器人要冲出起跑线。

3.当光电传感器测得的光值小于或等于40时,说明机器人到达投篮线。

4.机器人到达投篮线时开始投篮,其动作步骤如下:

(1)机器人首先要停下。

(2)C马达转动带动投篮臂。

(3)投篮后机器人要返回起跑线。

注意:在执行程序时,机器人检测到的光值要实地测量,否则机器人不会按你的要 求执行。

如果我们用左边所示图标,该如何编写程序?


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11519351.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存