打印

【求大神指点】跑马灯游戏机的设计(使用AT89C2051)要求C语言!急急急!!!

[复制链接]
2924|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
609571515|  楼主 | 2012-12-11 16:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由单片机I/O口控制发光二极管(LED)依次点亮短暂延时后熄灭,周而复始。当外部功能按键(连接于INT0/1)作用时,分别实现开始、停止功能。具体过程为:按开始键,LED循环显示,按停止键时,LED循环状态暂停,若正巧最后一个LED被点亮,而其它LED皆熄灭时,表示该操作人获胜,赢得游戏,同时蜂鸣器鸣响2秒,以示庆祝,反之则蜂鸣器鸣响500ms示意输掉游戏。下次按下开始后,游戏仍能继续。

相关帖子

沙发
阿南| | 2012-12-11 17:21 | 只看该作者
楼主自己写吧,不难的。或者找本单片机实验指导书,应该也会有。

使用特权

评论回复
板凳
609571515|  楼主 | 2012-12-11 17:44 | 只看该作者
阿南 发表于 2012-12-11 17:21
楼主自己写吧,不难的。或者找本单片机实验指导书,应该也会有。

真心写过,但是看着简单,可是总是过不去的坎,我开始也是看的觉得简单,但是总调不出来,所以求指点的、

使用特权

评论回复
地板
609571515|  楼主 | 2012-12-11 17:44 | 只看该作者
阿南 发表于 2012-12-11 17:21
楼主自己写吧,不难的。或者找本单片机实验指导书,应该也会有。

真心写过,但是看着简单,可是总是过不去的坎,我开始也是看的觉得简单,但是总调不出来,所以求指点的、

使用特权

评论回复
5
阿南| | 2012-12-11 17:59 | 只看该作者
把你写的放出看看,把你的硬件图也放出来。

使用特权

评论回复
6
独孤夕林| | 2012-12-11 19:17 | 只看该作者
会不会是由于按键抖动啊?

使用特权

评论回复
7
609571515|  楼主 | 2012-12-11 19:45 | 只看该作者
独孤夕林 发表于 2012-12-11 19:17
会不会是由于按键抖动啊?

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^2;
sbit key2=P3^3;
sbit beep=P1^5;
uchar aa=0xfe;
uchar flag0=0;
uchar flag1=0;
uchar Count;
/*以下数组是音符编码*/
unsigned char code SONG[] ={      //祝你平安
0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,
0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,
0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,
0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,
0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,
0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,
0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,
0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,
0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,
0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,
0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00,
                                  //路边的野华不要采
0x30,0x1C,0x10,0x20,0x40,0x1C,0x10,0x18,0x10,0x20,0x10,0x1C,0x10,0x18,0x40,0x1C,
0x20,0x20,0x20,0x1C,0x20,0x18,0x20,0x20,0x80,0xFF,0x20,0x30,0x1C,0x10,0x18,0x20,
0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,
0x30,0x80,0xFF,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,
0x20,0x2B,0x40,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,
0x20,0x2B,0x40,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,
0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,0x1C,0x10,0x20,
0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x15,0x1F,
0x05,0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,
0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,
0x20,0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,0x1C,0x10,0x18,0x40,0x1C,0x20,0x20,
0x20,0x26,0x40,0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80,0x00,

};


void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}

/*
延时子程序,经过软件调试,测得延时程序大概为55us.
*/
void Delay_xMs(uint x)
{
    uint i,j;
    for(i=0; i<x; i++)
    {
        for(j=0; j<3; j++);
    }
}

void init()
{
               
        P0=0xff;
        beep=0;
//        EA=1;
//        EX0=1;
//        EX1=1;
        IT0=1;
        IT1=1;

        TMOD = 0x01;        //设置定时器方式
        IE          = 0x87;        //开总中断,开定时器0中断,开外部中断0,开外部中断1
        TH0  = 0xDC;        //定时器赋初值
        TL0  = 0x00;        //定时器赋初值
}

/********************************************************************
* 名称 : Play_Song()
* 功能 : 播放蜂鸣器控制程序
* 输入 : i (选择播放哪首歌曲,0为“祝你平安”,1为“路边的野花你不要采”
* 输出 : 无
***********************************************************************/
void Play_Song(uchar i)
{
        uchar Temp1,Temp2;
        uint Addr;
        Count = 0;                                                //中断计数器清0
        Addr = i * 217;
        while(1)
        {
                flag0=0;
                flag1=0;
                Temp1 = SONG[Addr++];
            if (Temp1 == 0xFF)          //休止符
            {
                    TR0 = 0;
                    Delay_xMs(100);
            }
            else if (Temp1 == 0x00)          //歌曲结束符
            {
                //        P0=0x00;
                        P
                    return;
            }
            else
            {
                    Temp2 = SONG[Addr++];
                    TR0 = 1;
                          while(1)
                          {
                            beep = ~beep;
                            Delay_xMs(Temp1);   //给蜂鸣器固定频率
                            if(Temp2 == Count)   //固定频率的延时
                            {
                                    Count = 0;
                                    break;
                            }
                    }
            }
        }
}

void main()
{
        init();
        while(1)
        {
                if(flag0==1)
                {
                        flag1=0;
                        P0=aa;
                        delayms(500);
                        aa=_crol_(aa,1);
                }
                if(flag1==1)
                {
                        flag0=0;
                        if(aa==0xfd)     //注意这里是0xfd,不是0xfe
                        {
                                Play_Song(0);                //播放歌曲:祝你平安
                        }
                        else
                        {
                                Play_Song(1);                //播放歌曲:路边野花不要采
                        }
                }
        }
}

void exter0() interrupt 0
{
        if(key1==0)
        {
                delayms(10);
                if(key1==0)
                {
                        flag0=1;
                }
        }
}

void Time0_Int() interrupt 1
{
        TH0 = 0xDC;
        TL0 = 0x00;
        Count++;                        //长度加1
}

void exter1() interrupt 2
{
        if(key2==0)
        {
                delayms(10);
                if(key2==0)
                {
                        flag1=1;
                }
        }
}

使用特权

评论回复
8
东北小辉辉| | 2012-12-11 20:38 | 只看该作者
#include<reg2051.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit beep=P3^7;//蜂鸣器定义位
uchar flag0,flag1;
void delay(uint z)//当z=1的时候延时1ms
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=112;y>0;y--);
}
void EX_init()
{
        EA=1;
        ET0=1;
        ET1=1;
        IT0=1;//设置为下降沿触发中断
        IT1=1;
        EX0=1;
        EX1=1;
}
void main()
{
        uchar temp;
        EX_init();
        temp=0xfe;
        while(1)
        {
                if((flag0==1)&(flag1==0))//按下外部中断0后进入正常工作状态
                {
                        P1=temp;
                        delay(200);//每隔200ms二极管一次闪烁
                        temp=_crol_(temp,1);
                }
                if((flag1==1)&(flag0==0))//按下外部中断1后进入判断状态
                {
                        P1=temp;
                        if(temp==0x7f)//满足获胜者的要求
                        {
                                beep=1;
                                delay(2000);//LZ要求的延时2s
                                beep=0;
                        }
                        else
                        {
                                beep=1;
                                delay(500);//延时500ms
                                beep=0;
                        }
                }
        }
}
void EX_0() interrupt 0
{
        flag0=1;               
}
void EX_1() interrupt 2
{
        flag1=1;
}
LZ写的我没看,我自己写了一个,要不LZ试试。

使用特权

评论回复
9
东北小辉辉| | 2012-12-11 20:40 | 只看该作者
对了  忘了说了 把按键接在P3.2和P3.3上

使用特权

评论回复
10
shanshui90| | 2012-12-12 16:02 | 只看该作者
自己写,过程中你会收获很多

使用特权

评论回复
11
pc1969| | 2012-12-12 16:04 | 只看该作者
INT0中断处理程序是不是应该暂时禁止中断,防止反复中断.

使用特权

评论回复
12
pc1969| | 2012-12-12 16:06 | 只看该作者
INT1也是

使用特权

评论回复
13
zhouwuwei| | 2012-12-12 16:36 | 只看该作者
呵呵,有点意思,,不错,加油吧。。。

使用特权

评论回复
14
pc1969| | 2012-12-12 22:40 | 只看该作者
不如说说调试到哪一步,再帮你看看

使用特权

评论回复
15
chtt243654| | 2012-12-13 00:06 | 只看该作者
全力收拾它

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝