本帖最后由 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);
}
一周热门 更多>