找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求大神看看单片机程序,为什么启动按钮还有开关按下后30秒倒计时不开启

[复制链接]
跳转到指定楼层
楼主

单片机源程序如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};//共阴数码管编码
uint i,j,time,num;
uchar ge,shi;
void delay(z);
void display();
bit flag,flag1;
sbit k1=P1^0;//1号开关
sbit k2=P1^1;//2号开关
sbit k3=P1^2;//3号开关
sbit q1=P1^3;//启动按钮
sbit q2=P1^4;//复位按钮
sbit led1=P3^5;//1号灯
sbit led2=P3^6;//2号灯
sbit led3=P3^7;//3号灯
sbit beep=P1^5;//报警器
sbit wei1=P2^0;//数码位选口
sbit wei2=P2^1;
sbit wei3=P2^2;
sbit wei4=P2^3;

void delay(z)//延时函数
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}


void display()//数码管显示
{time=30;
shi=time/10;
ge=time%10;
P0=table[num];//显示选手编号
wei1=0;
delay(1);
wei1=1;
P0=table[shi];
wei3=0;
delay(1);
wei3=1;
P0=table[ge];
wei4=0;
delay(1);
wei4=1;
}

void keyscan()
{
if(time==6)
TR1=1;
if(k1==0)//1号按下
{delay(10);
  if(k1==0)
   {
    num=1;
    led1=1;
    flag=1;
    TR0=~TR0;
    TR1=0;//开定时器0,关定时器1
    beep=1;
    delay(500);
    beep=0;//蜂鸣器响
    while(!k1);//等待按键释放
   }
}
if(k2==0)
{
  delay(10);
  if(k2==0)
  {
   num=2;
   led2=1;
   flag=1;
   TR0=~TR0;
        TR1=0;
   beep=1;
   delay(500);
   beep=0;
   while(!k2);
  }
}
  if(k3==0)
{
  delay(10);
  if(k3==0)
  {
   num=3;
   led3=1;
   flag=1;
   TR0=~TR0;
        TR1=0;
   beep=1;
   delay(500);
   beep=0;
   while(!k3);
  }
}
display();//显示编号和时间
if(time==0)
  {
   TR0=0;
   TR1=0;
   flag=1;//关计时器0和1
  }
}

void init()
{
TMOD=0x11;//选择定时器模式
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;//总中断
ET0=1;//定时器中断允许
ET1=1;
TR0=1;//打开定时器
beep=0;
}

void main()//主程序
{
init();//初始化
while(1)
{
  display();
  if(q2==0)
  {
   delay(10);
   if(q2==0)
   {
    P3=0x00;
    flag1=q2;
    time=00;
    wei1=0;
    num=0;
    P0=table[num];
    while(!flag1)
    {
     if(q1==0);
     {
      delay(10);
      if(q1==0)
      {
       flag1=1;
       flag=q1;
       TR0=1;
       beep=1;
       delay(500);
                 beep=0;
       while(!q1);
       while(!flag)
       keyscan();//扫描键盘
      }
     }
    }
   }
  }
}
}

void T0_time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
if(i==20)
{
  i=0;
  time--;
}
}

void T1_time() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
j++;
  if(j==10)
  {
   j=0;
        beep=~beep;
  }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:332444 发表于 2020-12-7 09:43 | 只看该作者
回复

使用道具 举报

板凳
ID:584814 发表于 2020-12-7 21:19 | 只看该作者
while套while,看来作者对此有特殊的爱好,看不懂
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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