找回密码
 立即注册

QQ登录

只需一步,快速开始

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

用两个定时器分别控制蜂鸣器的频率和时间。我的程序怎么不行呢

[复制链接]
ID:150555 发表于 2016-11-27 16:17 | 显示全部楼层 |阅读模式
#include<reg52.h>
int tt=0,num=0,j=0,k=1;
int code a[]={10,50,100,200,400,800,1000};
sbit buzzer=P2^3;
void main()
{
    TMOD=0x11;
    TH1=(65536-50000)/256;
    TL1=(65536-50000)%256;
    TH0=(65536-5000)/256;
    TL0=(65536-5000)%256;
    EA=1;
    ET1=1;
    ET0=1;
   TR1=1;
   TR0=1;
   while(1)
     {
        if(tt==20)               // tt加到20的时候,程序会在下面的中断函数1再运行一次然后tt变为21。。。。这是为什么。。。
           {
                 tt=0;
                 buzzer=~buzzer;
           }
    }
}
void abc() interrupt 1
{
     TH0=(65536-k)/256;
     TL0=(65536-k)%256;
     tt++;                                       
}
void abd() interrupt 3
{
    TH1=(65536-50000)/256;
    TL1=(65536-50000)%256;
    num++;
    if(num==20)
    {
         num=0;
         if(j==7)
         j=0;
         k=a[j];
         j++;
   }
}
回复

使用道具 举报

ID:57896 发表于 2016-11-27 17:56 | 显示全部楼层
本帖最后由 engcyh 于 2016-11-27 18:39 编辑

k=1 太小,赋值后又进入中断,又赋值又进入

  if(tt==20)           
           {
                 tt=0;
                 buzzer=~buzzer;
           }

这几句还没执行就又进入中断了,把这几句放到中断试试
回复

使用道具 举报

ID:7485 发表于 2016-11-27 20:36 | 显示全部楼层
这个好像硬件要看看才能行。
回复

使用道具 举报

ID:150555 发表于 2016-11-27 22:49 | 显示全部楼层
ahshmj 发表于 2016-11-27 20:36
这个好像硬件要看看才能行。

硬件问题?
回复

使用道具 举报

ID:150555 发表于 2016-11-27 22:49 | 显示全部楼层
engcyh 发表于 2016-11-27 17:56
k=1 太小,赋值后又进入中断,又赋值又进入

  if(tt==20)           

我试试
回复

使用道具 举报

ID:142320 发表于 2016-11-28 11:09 | 显示全部楼层
注意中断时,在主程序的时间一定要确保中断影响的时间,所以你可以在定时中断中设置一个标志位,然后在主程序中清标志位
回复

使用道具 举报

ID:142320 发表于 2016-11-28 11:13 | 显示全部楼层
  主程序中
while(1)
     {
        if(flag)         
           {
                 flag=0;
                 buzzer=~buzzer;
           }
    }

void abc() interrupt 1
{  TR0=0;
     TH0=(65536-k)/256;
     TL0=(65536-k)%256;
     tt++;     
       if(tt==20)      
  {
   tt=0;
  flag=1;
  }        
TR0=1;                     
}
回复

使用道具 举报

ID:150555 发表于 2016-12-2 16:00 | 显示全部楼层
gujp312365 发表于 2016-11-28 11:13
主程序中
while(1)
     {

#include<reg52.h>
int tt=0,num=0,j=0,k=1,flag;
int code a[]={10,50,100,200,400,800,1000};
sbit buzzer=P2^3;
void main()
{
        TMOD=0x11;
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        TH0=(65536-5000)/256;
        TL0=(65536-5000)%256;
        EA=1;
        ET1=1;
        ET0=1;
        TR1=1;
        TR0=1;
        while(1)
        {
                if(flag)
                {
                        flag=0;
                        buzzer=~buzzer;
    }
  }
}
void abc() interrupt 1
{
        TH0=(65536-k)/256;
        TL0=(65536-k)%256;
        tt++;
        if(tt==20)
        {
                tt=0;
                flag=1;
  }
}
void abd() interrupt 3
{
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        num++;
        if(num==20)
        {
                num=0;
                if(j==7)
                        j=0;
                k=a[j];
                j++;
  }
}


改完之后把断点设在中断程序3的j++这里,会死循环。j的值改变不了。
回复

使用道具 举报

ID:150555 发表于 2016-12-2 16:08 | 显示全部楼层
gujp312365 发表于 2016-11-28 11:13
主程序中
while(1)
     {

应该是中断1的时间太短,程序根本进不了中断3,但是怎么改呢?
回复

使用道具 举报

ID:151709 发表于 2016-12-2 17:11 | 显示全部楼层
试试将数组a中的值变大些,你的定时器0的初始值变小些,觉得你的timer0太快了,一下就溢出了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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