如何使中断能输出循环递增又递减的报警声, 像正弦波一样

2019-07-15 19:23发布

本帖最后由 boya355 于 2014-6-18 13:30 编辑

如何使中断能输出循环递增又递减的报警声, 像正弦波一样:

此程序是 电子工业出版社《单片机C语言程序设计实训100例》 中的例3.20 tiMER0 TIMER1及TIMER0控制报警器与旋转灯。
此程序 发出的报警, 是一个频率从976 到1945HZ的 好像只单单是从低到高音, 而没有从高音到低音, 我试试想改编能从 低-高-再低-高无间断循环下去, 能变得和谐些, 有来回、上下幅度感的正弦波一样。

望请 高手指教!

如下图示和程序:



// 定时器控制输出仿真报警声和LED闪灯
//...
//程序初始
#include<reg51.h>
#include<intrins.h>
#define INT8U unsigned char
#define INT16U unsigned int
sbit SPK =P3^7;
INT8U FRQ= 0x00;
void delayms(INT16U ms)
  {
     INT8U i ; while(ms--) for(i=0;i<120;i++);
  }
// 主程序开始
void main()
{
  
   P2=0x00;               //关闭所有LED灯
  TMOD=0x11;          //两个定时器均工作于模式1
   TH0=0xFE;          //定时初值为0XFE00
   TL0=0x00;
   IT0=1;                  //下降触发INT0
   IE=0x8B;              //开启0 1 3号中断(INTI0 T0 T1)
  IP=0x01;               //INT0设为最高优先级
  TR0=0;                   //定时器启停由INT0中断控制, 初始时关闭
  TR1=0;
   while(1)                 // 循环过程中递增频率,溢出后再次递增
   { FRQ++; delayms(10);
    /* if(FRQ==0xFF) {FRQ--; delayms(10); }*/   // 我自加的两行代码,试图 让FRQ 自减 实现 高音到低的功能, 但是效果不行
    /* else  FRQ++; delayms(10);*/
     }
  
}
  //INT0中断程序
void EX_INT() interrupt 0
{

   TR0=!TR0;          // 开启或停止两个定时器 分别控制报警器声音或LED灯
   TR1=!TR1;
   if(P2==0x00) P2=0x80;         //开一个等循环
   else         P2=0x00;         // 关闭所用灯
}
// 定时器0中断程序
void T0_INT() interrupt 1          // 控制报警声
{
   TH0=0xFE;
        TL0=FRQ;
   SPK=~SPK;
           
}
  //定时器1中断
void T1_INT() interrupt 3                // 控制LED灯
{
     TH1= -4500>>8;
      TL1=-4500&0x1F;
      P2=_crol_(P2,1);
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。