找回密码
 立即注册

QQ登录

只需一步,快速开始

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

8位抢答器蜂鸣器响应时间超短为什么

[复制链接]
跳转到指定楼层
楼主
ID:126457 发表于 2016-6-13 09:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define  max 30
uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,};
sbit d1=P2^4;//段选
sbit d2=P2^5;
sbit x1=P2^6;
sbit x2=P2^7;
sbit k1=P1^0;//八位选手开关
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit k7=P1^6;
sbit k8=P1^7;
sbit zk1=P2^0;//主持人开关zk1,zk2
sbit zk2=P2^1;
sbit buz=P2^2;//蜂鸣器
uchar num,aa;
uchar f,flag;
void jianpan();
void init(void)
{
TMOD=0X01;//T0,模式1,定时
TL0=0XB0; //定时50ms
TH0=0X3C;
ET0=1;    //开中断
EA=1;
num=max;//置倒计时计数初值
}
void delay(uint xms)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--) ;//延时1s
}
void display()
{
d1=0;         //控制开始置数
P0=tab[num/10];//倒计时控制取最高位
delay(5);
d1=1;          //停止置数操作
d2=0;
P0=tab[num%10];//倒计时取最低位
delay(5);
d2=1;
x1=0;         //控制开始置数
P0=tab[flag/10];//选手号控制
delay(5);
x1=1;         //停止置数操作
x2=0;
P0=tab[flag%10];
delay(5);
x2=1;
}
void main()
{            
init();
while(1)
{
  jianpan();
  display();
}
}
void timer0(void) interrupt 1
{
TL0=0XB0; //重装初值,定时50ms
TH0=0X3C;
aa++;
if(aa==30)//1秒到了
{
  aa=0;//计数清零
  num--;
  if(num==0)//倒计时为0时迅速变为初值同时关中断停止倒计时
  {   
   num=max;
   TR0=0;
  }
  buz=0;//要求蜂鸣器响
  delay(30);//蜂鸣器响,时间为一秒buz=1;
}  
}
/**************************************************
按键控制   程序的核心部分
****************************************************/
void jianpan()
{
if(zk1==0&flag==0)
{
  delay(5);//消除数码管抖动操作
  flag=0;//数码管显示0
  display();
  TR0=1;//ZK1键按下,开中断以此控制:只有当此键按下时才抢答
}
if(zk2==0&&TR0==0)//注意这里要求TR0=0;
{
  delay(5);//消除抖动
  if(zk2==0&&TR0==0)
  if(flag==0)
  {
   num--;
   buz=0;
   delay(30);
   buz=1;
  }
  if(num==0)
   num=max;                           
  if(flag!=0)//ZK2键清零操作
  {
   flag=0;
   num=max;//倒计时显示最大值
   TR0=0;//注意此时关中断,不再进行倒计时
   buz=0;
   delay(30);
   buz=1;   
  }
  while(!zk2)//倒计时中ZK2 键不可影响
  display();
}
if(k1==0&&TR0==1)
{            
  buz=0;
  delay(30);
  buz=1;
  delay(5);
  flag=1;
  TR0=0;//此键按下关中断,其他选手按键不再受影响                           
  display();
}
/*************************************
以下原理相同
*************************************/
if(k2==0&&TR0==1)
{
  buz=0;
  delay(30);
  buz=1;
  delay(5);
  flag=2;
  TR0=0;            
  display();
}
if(k3==0&&TR0==1)
{            
  buz=0;
  delay(30);
  buz=1;
  delay(5);
  flag=3;
  TR0=0;
  display();
}
if(k4==0&&TR0==1)
{            
  buz=~buz;
  delay(30);
  buz=1;
  delay(5);
  flag=4;
  TR0=0;                           
  display();
}
if(k5==0&&TR0==1)
{
  buz=0;
  delay(30);
  buz=1;
  delay(5);
  flag=5;
  TR0=0;                           
  display();                                                           
}
if(k6==0&&TR0==1)
{            
  buz=0;
  delay(30);
  buz=1;
  delay(5);
  flag=6;
  TR0=0;
  display();         
}
if(k7==0&&TR0==1)
{
  buz=0;
  delay(30);
  buz=1;
  delay(5);
  flag=7;
  TR0=0;
  display();
}
if(k8==0&&TR0==1)
{
  buz=0;
  delay(30);
  buz=1;
  delay(5);
  flag=8;
  TR0=0;                                                                                         
  display();  
}
}
为什么我的蜂鸣器就很轻微的滴一声就没了,很短暂!几乎瞬间的事情

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

使用道具 举报

沙发
ID:7485 发表于 2016-6-13 18:34 | 只看该作者
第一:你的time0就没有启动。应加:TR0=1(大概是你抄写漏掉了)

第二:蜂鸣器的延时时间太短。但是你的溢出是1/30s,你用循环延时方法,响的时间不可能达到或超过溢出时间。
你可以试一试,使用time1来延时。
也可以在中断内置以标志位,中断外根据标志位的状态控制蜂鸣器。
回复

使用道具 举报

板凳
ID:126741 发表于 2016-6-14 20:48 | 只看该作者
蜂鸣器坏了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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