找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2305|回复: 4
打印 上一主题 下一主题
收起左侧

单片机抢答器倒计时结束后不能停止,怎么解决?

[复制链接]
跳转到指定楼层
楼主
要做一个抢答器,60秒倒计时结束后红灯亮,但数码管不灭,想问一下怎么解决?

ND%KGM~(763BA2HZ$2@ECHX.png (31.27 KB, 下载次数: 47)

ND%KGM~(763BA2HZ$2@ECHX.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:723431 发表于 2020-4-17 20:36 | 只看该作者
本帖最后由 机电小生 于 2020-4-17 21:35 编辑

程序如下:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code zixingma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;                                                         //黄灯
sbit P23=P2^3;                                                         //红灯
sbit P26=P2^6;
sbit P27=P2^7;
sbit key1=P3^2;                                                         //倒计时开关
sbit key2=P3^0;                                                         //1
sbit key3=P3^1;                                                         //2
sbit key4=P3^5;                                                         //复位开关
void daojishi(void);
void yihao(void);
void erhao(void);
void fuwei(void);
void key_scan(void);
uchar n,k,flag;
void delay5ms()
{
        uchar i,j;
        for(i=10;i>0;i--)
        for(j=248;j>0;j--);
}
void delay10ms()
{
        unsigned char i,j;
        for(i=20;i>0;i--)
        for(j=248;j>0;j--);
}
void main()
{
        n=60;
        k=20;
        P22=0;
        P23=0;
        P1=0xff;
        TMOD=0x01;                                           //T0用中断定时1s,方式一
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        IE=0x8f;
        IT0=1;        
        IT1=1;                        
        flag=0;
        while(1)
        {
                key_scan();
                switch(flag)        
                 {
                        case 1:daojishi();break;
                        case 2:yihao();break;
                        case 3:erhao();break;
                        case 4:fuwei();break;
                }
        }
}
void t_0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        k--;
        if(k==0)
        {
                k=20;
                n--;
                if(n==0)
                {
                        TR0=0;
                        P23=1;
                        P0=0xff;
                }
        }
}
void key_scan()
{
        if(key1==0)
        {
                delay10ms();
                if(key1==0)
                {                               flag=1;
                        while(key1==1)
                       {
                              delay10ms();
                              flag=0;
                        }
                }
        }
        if(key2==0)
        {
                delay10ms();
                if(key2==0)
                {      
                         flag=2;
                         while(key2==1)
                        {
                                delay10ms();
                                flag=0;
                        }
                }
        }
        if(key3==0)
        {
                delay10ms();
                if(key3==0)
                {
                         flag=3;
                         while(key3==1)
                         {
                                delay10ms();
                                  flag=0;
                          }
                }
        }
        if(key4==0)
        {
                delay10ms();
                if(key4==0)
                {
                        flag=4;
                        while(key4==1)
                        {
                                 delay10ms();
                                 flag=0;
                        }
                }
        }
}
void daojishi()
{
        TR0=1;
        P0=0xff;
        P20=1;
        P21=0;
        if(n>=10)
                P0=zixingma[n/10];
                delay5ms();
        P0=0xff;
        P20=0;
        P21=1;
        P0=zixingma[n%10];
        delay5ms();
}
void yihao()
{
        P0=0xff;
        P1=0xf9;
        P22=1;
}
void erhao()
{
        P0=0xff;
        P1=0xa4;
        P22=1;        

}
void fuwei()
{
        TR0=0;
        P2=0;
        P0=0xff;
        P1=0xff;
        n=60;
}
回复

使用道具 举报

板凳
ID:70069 发表于 2020-4-18 09:49 | 只看该作者
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code zixingma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;                                                         //黄灯
sbit P23=P2^3;                                                         //红灯
sbit P26=P2^6;
sbit P27=P2^7;
sbit key1=P3^2;                                                         //倒计时开关
sbit key2=P3^0;                                                         //1
sbit key3=P3^1;                                                         //2
sbit key4=P3^5;                                                         //复位开关
void daojishi(void);
void yihao(void);
void erhao(void);
void fuwei(void);
void key_scan(void);
uchar n,k,flag;
void delay5ms()
{
        uchar i,j;
        for(i=10;i>0;i--)
        for(j=248;j>0;j--);
}
void delay10ms()
{
        unsigned char i,j;
        for(i=20;i>0;i--)
        for(j=248;j>0;j--);
}
void main()
{
        n=60;
        k=20;
        P22=0;
        P23=0;
        P1=0xff;
        TMOD=0x01;                                           //T0用中断定时1s,方式一
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        IE=0x8f;
        IT0=1;        
        IT1=1;                        
        flag=0;
        while(1)
        {          
                          if(key1==0)
                    delay10ms();
                      if(key1==0)
                          flag=1;  //开始标志
                 if(flag!=0)
                  {
                key_scan();
                switch(flag)        
                 {
                        case 1:daojishi();break;
                        case 2:yihao();break;
                        case 3:erhao();break;
                        case 4:fuwei();break;
                }
                    }
                    else
                    if(key4==0)
                      delay10ms();
                        if(key4==0)
                            flag=4;        //复位标志
        }
}
void t_0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        k--;
        if(k==0)
        {
                k=20;
               
                if(n>0)             //增加一个判断
                    {n--;}
                     else  
                   /* n--;
                        if(n==0)        */
                {
                        TR0=0;
                        P23=1;
                        P0=0xff;
                                flag=0;  //禁止除复位按钮外其它按钮        标志
                               
                }
        }
}
void key_scan()
{
        if(key1==0)
        {
                delay10ms();
                if(key1==0)
                {            flag=1;
                        while(key1==1)
                       {
                              delay10ms();
                              flag=0;
                        }
                }
        }
        if(key2==0)
        {
                delay10ms();
                if(key2==0)
                {      
                         flag=2;
                         while(key2==1)
                        {
                                delay10ms();
                                flag=0;
                        }
                }
        }
        if(key3==0)
        {
                delay10ms();
                if(key3==0)
                {
                         flag=3;
                         while(key3==1)
                         {
                                delay10ms();
                                  flag=0;
                          }
                }
        }
        if(key4==0)
        {
                delay10ms();
                if(key4==0)
                {
                        flag=4;
                        while(key4==1)
                        {
                                 delay10ms();
                                 flag=0;
                        }
                }
        }
}
void daojishi()
{
        TR0=1;
        P0=0xff;
        P20=1;
        P21=0;
        if(n>=10)
                P0=zixingma[n/10];
                delay5ms();
        P0=0xff;
        P20=0;
        P21=1;
        P0=zixingma[n%10];
        delay5ms();
          
}
void yihao()
{
        P0=0xff;
        P1=0xf9;
        P22=1;
          flag=0;//禁止除复位按钮外其它按钮        标志
}
void erhao()
{
        P0=0xff;
        P1=0xa4;
        P22=1;
          flag=0 ;//禁止除复位按钮外其它按钮标志

}
void fuwei()
{
        TR0=0;
        P2=0;
        P0=0xff;
        P1=0xff;
        n=60;
}
回复

使用道具 举报

地板
ID:70069 发表于 2020-4-18 10:06 | 只看该作者
while(1)
        {          
                 
                 if(flag!=0)
                  {
                      if(key1==0)
                            delay10ms();
                                if(key1==0)
                                          flag=1;  //开始标志
                key_scan();
                switch(flag)        
                 {
                        case 1:daojishi();break;
                        case 2:yihao();break;
                        case 3:erhao();break;
                        case 4:fuwei();break;
                }
                    }
                    else
                    if(key4==0)
                      delay10ms();
                        if(key4==0)
                            flag=4;        //复位标志
        }
这样调整一下,修复抢答键按下后,再按开始键继续倒计时BUG
回复

使用道具 举报

5#
ID:70069 发表于 2020-4-18 10:15 | 只看该作者
flag=4;//开始赋值为4,修复启动时要先按复位键BUG
        while(1)
        {
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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