同时用两个定时器控制蜂鸣器发声

  • 格式:pdf
  • 大小:180.21 KB
  • 文档页数:3

下载文档原格式

  / 3
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep=P3^4;
uint yanshi[]={50000,10000,5000,2500,1250,625,500}; //暂时除去 1Hz,原因是 1Hz 的半个周期
是 500mS,300mS 怎么能表现出来呢?
uchar t,bp,pd; //t 为 50mS 时间脉冲信号,bp 为变频信号,pd 为所选频段
void timer0() interrupt 1 // 定时器 0 控制频率
{
TH0=(65536-yanshi[pd])/256;
TL0=(65536-yanshi[pd])%256;
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
t++;
}
void init()
{
EA=1;
//开启总中断
ET0=1;ET1=1;//开启外部定时器中断允许位
TMOD=0x11; //同时定义两个定时器的工作模式
TH0=(65536-yanshi[bp])/256;
void timer0() interrupt 1 // 定时器 0 控制频率
{
TH0=(65536-yanshi[pd])/256; //pd 为频段
TL0=(65536-yanshi[pd])%256;
bp++;
//bp 为变频信号
}
void timer1() interrupt 3 // 定时器 1 控制同个频率持续的时间,50mS 脉冲
TR0=1;TR1=1;//启动两个定时器;可以测试一次给字节赋值
}
void main()
{
bp=0;pd=0;beep=1;t=0;
init();
while(1)
{
iቤተ መጻሕፍቲ ባይዱ(bp>0) //测试变频信号发生
{
TR0=0; //关闭定时器 0,防止在执行定时器 1 时被中断,会引起混乱
bp=0;
//将变频信号 bp 归零,等待下一个信号 1
bp++;
//bp 为变频信号
}
void timer1() interrupt 3 // 定时器 1 控制同个频率持续的时间,50mS 脉冲
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
t++;
}
void init()
{
EA=1;
//开启总中断
ET0=1;ET1=1;//开启外部定时器中断允许位
beep=~beep; //变频信号发生后 beep 取反
if(t>5)
//测试定时器 0 脉冲是否达到 6 个,即 300mS
{
pd++; //如果达到 300mS,频段改变
t=0; //将定时器脉冲数归零
}
if(pd>6) //频段 pd 超出 6 个即第 7 个时,将频段归零
{
pd=0;
}
TR0=1;
//开启定时器 0,让定时器 0 继续工作;定时器 0 在每执行一次以
上程序中大约有 4 条指令时间的增加,大约 12×4=48 微秒
}
}
}
*************方法 2(748code)*****************
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep=P3^4;
uint yanshi[]={50000,10000,5000,2500,1250,625,500}; //暂时除去 1Hz,原因是 1Hz 的半个周期
是 500mS,300mS 怎么能表现出来呢?
uchar t,bp,pd; //t 为 50mS 时间脉冲信号,bp 为变频信号,pd 为所选频段
init();
while(1)
{ while(t<6)
//300mS 定时
{ if(bp>0)
则很容易出现混乱
//在执行低优先级的定时器程序时,最好关闭高优先级定时器,否
{ TR0=0; //关闭定时器 0,防止被中断 bp=0; //变频信号归零
beep=~beep; TR0=1; //使开启定时器 0 继续运行;if 语句中关开定时器用了大约 2 个机器周期,即 12×2=24 微秒,相对 500 很小
}
} t=0; pd++; if(pd>6)
//300mS 执行完了以后将定时器脉冲数归零 //再将频段变换
//频段变换超出范围则归零
{
pd=0;
}
}
}
******************************
同时用两个定时器控制蜂鸣器发声,定时器 0 控制频率,定时器 1 控制同个频率持续的时间, 间隔 300ms 依次输出 1,10,50,100,200,400,800,1k(hz)的方波。此题出题略有错误,应 去掉 1Hz,原因见注释
***************方法 1(747code)***************
TL0=(65536-yanshi[bp])%256;//给定时器 0 赋初值
TH1=(65536-50000)/256;
TL1=(65536-50000)%256; //给定时器 1 赋初值 TR0=1;TR1=1;//启动两个定时器;可以测试一次给字节赋值
}
void main()
{
bp=0;pd=0;beep=1;t=0;
TMOD=0x11; //同时定义两个定时器的工作模式
TH0=(65536-yanshi[bp])/256;
TL0=(65536-yanshi[bp])%256;//给定时器 0 赋初值
TH1=(65536-50000)/256;
TL1=(65536-50000)%256; //给定时器 1 赋初值