[讨论] 为什么这个不可以定时鸣叫,在开发板上

嵌入式追溯者   2016-5-22 22:30 楼主
#include "reg51.h"       //包含头文件
//#include "mingjiao.h"
sbit LE1=P2^0;           //位选573锁存器使能
sbit LE2=P2^1;           //段选573锁存器使能
sbit bz=P3^7;
#define uchar unsigned char
#define uint  unsigned int

uchar temp,num;          //定义变量
//**************************************************************************************************
delay(uint time)              //int型数据为16位,所以最大值为65535            
{
  uint  i,j;                  //定义变量i,j,用于循环语句
  for(i=0;i      for(j=0;j<50;j++);       //for循环,循环
   }
//定时器中断子程序
//**************************************************************************************************
t0() interrupt 1 using 1
{
  TH0=0x3c;         //重置定时器初值
  TL0=0xb0;
  if(temp>=19)      //满20次,即20次*50ms=1s
   {
     temp=0x00;     //重置temp为0
     //num++;         //显示变化一次
     bz=1;
delay(100);  //mingjiao();
  //P1=~num;       //将变化次数放在P1控制的LED上显示
   }
  else
   {
     temp++;        //每进一次中断,temp加1
   }
}
//**************************************************************************************************
//主函数
//**************************************************************************************************
main()
{
   TMOD=0x01;    //0b00000001  用的是定时器0,工作在方式1(16位寄存器)
                 //要实现定时50ms,(65536-T0)x12/12000000=0.05s得T0=15536即0x3cb0
   TH0=0x3c;     //装定时器初值高8位
   TL0=0xb0;     //装定时器初值低8位
   TR0=1;        //启动定时器0
   ET0=1;        //开定时器0中断
   EA=1;         //开总中断
   while(1);     //死循环,等待定时器中断
}

回复评论 (4)

1 来自 4楼 嵌入式追溯者 

引用: dcexpert 发表于 2016-5-22 23:33
你说的鸣叫应该是控制蜂鸣器或者其他发声的元件,但是没有看到控制的方法。只设置了一次bz=1,这样要么是蜂 ...

已解决
#include "reg51.h"       //包含头文件

sbit LE1=P2^0;           //位选573锁存器使能
sbit LE2=P2^1;           //段选573锁存器使能
sbit dz=P2^3;
#define uchar unsigned char
#define uint  unsigned int

uchar temp,num;          //定义变量
//**************************************************************************************************
void delay(uint time)
{
   
        uint  i,j;                  //定义变量i,j,用于循环语句
  for(i=0;i      for(j=0;j<50;j++);

}

//定时器中断子程序
//**************************************************************************************************
t0() interrupt 1 using 1
{
  TH0=0x3c;         //重置定时器初值
  TL0=0xb0;
  if(temp>=19)      //满20次,即20次*50ms=1s
   {
     temp=0x00;     //重置temp为0
     dz=1;        //显示变化一次
     delay(200);       //将变化次数放在P1控制的LED上显示
   }
  else
   {
     temp++,dz=0;       //每进一次中断,temp加1
   }
}
//**************************************************************************************************
//主函数
//**************************************************************************************************
main()
{
   TMOD=0x01;    //0b00000001  用的是定时器0,工作在方式1(16位寄存器)
                 //要实现定时50ms,(65536-T0)x12/12000000=0.05s得T0=15536即0x3cb0
   TH0=0x3c;     //装定时器初值高8位
   TL0=0xb0;     //装定时器初值低8位
   TR0=1;        //启动定时器0
   ET0=1;        //开定时器0中断
   EA=1;         //开总中断

   while(1);     //死循环,等待定时器中断
}
点赞  2016-5-23 20:12
你说的鸣叫应该是控制蜂鸣器或者其他发声的元件,但是没有看到控制的方法。只设置了一次bz=1,这样要么是蜂鸣器一直响,要么就不响。
点赞  2016-5-22 23:33
谢谢
点赞  2016-5-23 10:15
还有和蜂鸣器的种类也有关,如果是无源蜂鸣器,用电压驱动不会叫
点赞  2016-5-23 21:55
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复