找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1064|回复: 9
收起左侧

有没有大佬帮忙指点一下,单片机四人抢答器 这个程序跑的很奇怪

[复制链接]
ID:999824 发表于 2022-5-7 20:38 | 显示全部楼层 |阅读模式
要求:
一、 任务描述
设计一种4人抢答器。控制要求如下:
(1)设主持人1名,选手4名。
(2)1、2、3、4号抢答台上均有蓝色指示灯、抢答按钮。
(3)主持人台上有绿色开始指示灯、红色犯规指示灯、黄色报警灯,开始按钮和复位按钮。开始前,所有灯全灭。
(4)主持人按开始按钮后,开始指示灯亮,并开始9S倒计时,以数码管显示,选手9S内可以按抢答按钮抢答,最先按抢答按钮的选手指示灯亮,
后按抢答按钮的选手指示灯不亮,9S内如果无人抢答,黄色报警灯点亮。

(5)若主持人还未按开始按钮,就有选手按了抢答按钮,主持人台上的犯规指示灯点亮(闪烁),同时所有犯规选手指示灯点亮(闪烁),(闪烁频率均为1HZ)。
(6)任何情况下,主持人按复位按钮都可以熄灭所有指示灯。
程序如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char

uchar code q[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//倒计时数组

uchar flag;
uchar count=0;  //中断进入次数
uchar num=9;  //倒计时

sbit kai=P3^2;//主持人开始 set
sbit fu=P3^3;     //reset

sbit b1=P1^6;  //主持人开始灯
sbit b2=P1^5;  //犯规灯  
sbit b3=P1^4;  //报警灯

sbit a=P2^0;//选手按键        KEY_1
sbit b=P2^1;   
sbit c=P2^2;
sbit d=P2^3;

sbit a1=P1^0;//选手灯  LED_1
sbit a2=P1^1;
sbit a3=P1^2;
sbit a4=P1^3;

void delay10()//10ms
{
        uchar i,k;
        for(i=20; i>0; i--)
                for(k=250; k>0; k--);
}

void delay1s()                //1s
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 46;
        j = 153;
        k = 245;
        do
        {
                do
                {
                        while (--k);
                }
                while (--j);
        }
        while (--i);
}

void init()  //初始化
{
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        ET0=1;         //定时器T0中断启动
        EA=1;         //总中断启动
        EX0=1;         //外部中断启动
        IT0=1;         //下降沿启动

}

void daojishi()//主持人开始后倒计时
{
        while(kai==0)
        {
                TR0=1;
                P0=q[num];
                delay10();
                P0=0x01;  //0xff
        }
}

void qiangda()//选手抢答
{
        if(a==0)        //抢答
        {
                delay10();        //去抖
                if(a==0)        //判断是否进入抢答状态
                {
                        if(P2==0x01)  //别人抢答状态
                        {
                                a1=1;
                                a2=0;
                                a3=0;
                                a4=0;
                        }
                }
        }
        if(b==0)        //抢答
        {
                delay10();        //去抖
                if(b==0)        //判断是否进入抢答状态
                {
                        if(P2==0x02)  //别人抢答状态
                        {
                                a2=1;
                                a1=0;
                                a3=0;
                                a4=0;
                        }
                }
        }
        if(c==0)        //抢答
        {
                delay10();        //去抖
                if(c==0)        //判断是否进入抢答状态
                {
                        if(P2==0x03)  //别人抢答状态
                        {
                                a3=1;
                                a2=0;
                                a1=0;
                                a4=0;
                        }
                }
        }
        if(d==0)        //抢答
        {
                delay10();        //去抖
                if(d==0)        //判断是否进入抢答状态
                {
                        if(P2==0x04)  //别人抢答状态
                        {
                                a4=1;
                                a2=0;
                                a3=0;
                                a1=0;
                        }
                }
        }
}
void hong()//红灯亮
{
        qiangda();
        if(TR0==1)
        {
                b2=1;
                delay1s();
                b2=0;
                while(TR0==1);
        }
}
void huang()//黄灯亮
{
        while(P0==0xff)
        {
                b3=1;
        }
}
void fuwei()//复位按钮
{
        if(fu==0)
        {
        /*
                TMOD=0x01;



               
                TH0=(65536-50000)/256;
                TL0=(65536-50000)%256;
                ET0=1;
                EA=1;
                EX0=1;
                IT0=1;
        */
            TR0=0;
                num=9;
                P1=0X00;
                P0=0;
                P2=0xff;
        }
}
void main()
{
        P1=0X00;
        init();
        while(1)
        {
                daojishi();
                qiangda();
                hong();
                huang();
                fuwei();

        }
}
void time0() interrupt 1
{
        TH0=(65536-50000)/256;  //10ms
        TL0=(65536-50000)%256;
        count++;
        if(count==20)
        {
                count=0;
                num--;
        }
        if(num==0)
        {
                P0=0x00;
        }
}
void anjian() interrupt 0//按键去抖
{
        delay10();
        if(fu==0)
        {
                TR0=1;
        }
        while (fu==0);


仿真图片

仿真图片
回复

使用道具 举报

ID:999824 发表于 2022-5-7 20:38 | 显示全部楼层
大家帮忙指点一下,这个程序跑的很奇怪
回复

使用道具 举报

ID:262 发表于 2022-5-7 22:03 | 显示全部楼层
什么问题都没有说?
回复

使用道具 举报

ID:584814 发表于 2022-5-8 09:40 | 显示全部楼层
是很奇怪,我看了半天它都没跑走
回复

使用道具 举报

ID:161164 发表于 2022-5-8 09:58 来自手机 | 显示全部楼层
复位键按下,先进外中断,直到复位键放开才离开中断,结果主循环里的fuwei()里的if(fu==0)永远不会成立
回复

使用道具 举报

ID:61140 发表于 2022-5-8 14:32 | 显示全部楼层
这种用什么中断,用汇编几个FLAG就可以搞定了.
回复

使用道具 举报

ID:999824 发表于 2022-5-8 19:26 | 显示全部楼层
heicad 发表于 2022-5-7 22:03
什么问题都没有说?

他没有报错,程序能运行,就是跑的很奇怪
回复

使用道具 举报

ID:999824 发表于 2022-5-8 19:27 | 显示全部楼层
lkc8210 发表于 2022-5-8 09:58
复位键按下,先进外中断,直到复位键放开才离开中断,结果主循环里的fuwei()里的if(fu==0)永远不会成立

那应该怎么改,大佬
回复

使用道具 举报

ID:999824 发表于 2022-5-8 19:27 | 显示全部楼层
xiaoyuxinke 发表于 2022-5-8 14:32
这种用什么中断,用汇编几个FLAG就可以搞定了.

呜呜呜,木得办法,得用编程
回复

使用道具 举报

ID:123289 发表于 2022-5-9 14:22 | 显示全部楼层
1、对选手的键要一次性读入,不能分前后。
2、对按键不能消抖(逮着一次即认可),否则影响抢答的“抢”字。
3、无选手键入一直读,有选手键入按命题逻辑进行分析判定。
6#楼的建议是正确的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表