51单片机资源吧 关注:28贴子:124
  • 1回复贴,共1

拔河灯(数码管)

取消只看楼主收藏回复


1)设计一个能进行拔河游戏的电路,通过按键控制游戏开始和复位。
2)电路使用9个发光二极管排成一行,中间的LED为拔河的中心点。开机后由中间的LED亮,当按键按动一定次数,发光二极管向两边移动。
3)游戏双方各持一个按钮,迅速地、不断地按动,产生脉冲,谁按得快,亮点就向谁的方向移动的快,每按五次,亮点移动一次。
4)任一方亮点移到发光二极管终端时,这一方就获胜,亮点恢复到中心。
5)显示获胜者、时间和双方点击次数。


IP属地:湖北1楼2024-08-16 11:15回复
    #include "reg51.h"
    #define uchar unsigned char
    #define uint unsigned int
    sbit smg1=P2^0;//数码管
    sbit smg2=P2^1;
    sbit smg3=P2^2;
    sbit smg4=P2^3;
    sbit led1=P1^0;//LED
    sbit led2=P1^1;
    sbit led3=P1^2;
    sbit led4=P1^3;
    sbit led5=P1^4;
    sbit led6=P1^5;
    sbit led7=P1^6;
    sbit led8=P1^7;
    sbit led9=P2^7;
    sbit one=P2^4;//选手1
    sbit two=P2^5;//选手2
    sbit kaishi=P3^2;//开始
    sbit fuwei=P3^3;//复位
    sbit green=P2^6;//LED
    //数码管编码
    uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9
    uchar fen1=0,fen2=0;//分数
    uchar flag=0;//第几个数码管0-3
    uchar weizhi=5;//位置,第几个LED亮
    uchar start=0;//比赛开始
    void left()//左移
    {
    led1=led2;
    led2=led3;
    led3=led4;
    led4=led5;
    led5=led6;
    led6=led7;
    led7=led8;
    led8=led9;
    led9=1;
    }
    void right()//右移
    {
    led9=led8;
    led8=led7;
    led7=led6;
    led6=led5;
    led5=led4;
    led4=led3;
    led3=led2;
    led2=led1;
    led1=1;
    }
    void main()
    {
    led5=0;//中间亮
    //初始化定时器
    TMOD|=0X01;
    TH0=0XFC;//50ms
    TL0=0X18;
    ET0=1;//打开定时器0中断允许
    EA=1;//打开总中断
    TR0=1;//打开定时器
    while(1)
    {
    if(!kaishi && !led5)//开始
    {
    start=1;//开始
    green=0;//点亮绿灯
    }
    if(!fuwei)//复位
    {
    led1=1;//最左边
    led2=1;
    led3=1;
    led4=1;
    led6=1;
    led7=1;
    led8=1;
    led9=1;//最右边
    led5=0;//点亮中间
    weizhi=5;//位置5
    start=0;//停止
    green=1;//熄灭绿灯
    }
    if(start)//开始比赛
    {
    if(!one)//选手1按下
    {
    weizhi--;//位置左移
    left();//LED左移
    while(!one);//等待松开按钮
    }
    if(!two)//选手2按下
    {
    weizhi++;//位置右移
    right();//右移
    while(!two);//等待松开按钮
    }
    //判断
    if(weizhi==1)//选手1赢
    {
    fen1++;//分数加一
    start=0;//停止
    green=1;//熄灭绿灯
    }
    if(weizhi==9)//选手2赢
    {
    fen2++;//分数加一
    start=0;//停止
    green=1;//熄灭绿灯
    }
    }
    }
    }
    void Timer0() interrupt 1//定时器0中断函数
    {
    TH0=0XFC;//50ms
    TL0=0X18;
    switch(flag)//显示
    {
    case 0:smg4=1;P0=smgduan[fen1/10];smg1=0;break;//十位
    case 1:smg1=1;P0=smgduan[fen1%10];smg2=0;break;//个位
    case 2:smg2=1;P0=smgduan[fen2/10];smg3=0;break;//十位
    case 3:smg3=1;P0=smgduan[fen2%10];smg4=0; //个位
    }
    if(flag<3)//下一个数码管
    flag++;
    else
    flag=0;
    }


    IP属地:湖北2楼2024-08-16 11:16
    回复