2019-07-15 16:31发布
Aidaohuakai 发表于 2015-7-24 17:59 T=1/F=1/(500khz)=2us,定时器要1us中断一次,你认为51单片机能实现吗?就算是STM32实现起来也很麻烦!
天水边落落 发表于 2016-5-20 21:57 我也要用AD0809,请问你是怎么解决的
最多设置5个标签!
看来只能求助于分频器了
/*
同时用两个定时器控制蜂鸣器发声,
定时器0控制频率,定时器1控制同个
频率持续的时间,间隔2s依次输出
1,10,50,100,200,400,800,
1k(hz)的方波?
设晶振频率为12MHz。
*/
#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep=P2^3;
uchar tt;
uint fre,flag;
void main()
{
fre=50000;
beep=0;
TMOD=0x11; //设置定时器0,定时器1为工作方式1
TH0=(65536-fre)/256;
TL0=(65536-fre)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET0=1;
ET1=1;
TR1=1;
TR0=1;
while(1);
}
void timer0() interrupt 1
{
TR0=0; //进中断后先把定时器0中断关闭,防止内部程序过多而造成中断丢失,每打开再关闭只执行一段if,再进来再执行下一个if
TH0=(65536-fre)/256;
TL0=(65536-fre)%256;
tt++;
if(flag<40)
if(tt==10)
{
tt=0; //10个脉冲 一个脉冲50ms×2=100ms
fre=50000;
beep=~beep;
}
if(flag>=40&&flag<80) //单独扩起来就不用关TR0再开开了
{
tt=0;
fre=50000;
beep=~beep;
}
if(flag>=80&&flag<120)
{
tt=0;
fre=10000;
beep=~beep;
}
if(flag>=120&&flag<160)
{
tt=0;
fre=5000;
beep=~beep;
}
if(flag>=160&&flag<200)
{
tt=0;
fre=2500;
beep=~beep;
}
if(flag>=200&&flag<240)
{
tt=0;
fre=1250;
beep=~beep;
}
if(flag>=240&&flag<280)
{
tt=0;
fre=625;
beep=~beep;
}
if(flag>=280&&flag<320)
{
tt=0;
fre=312;
beep=~beep;
}
if(flag>=320&&flag<360)
{
tt=0;
fre=156;
beep=~beep;
}
TR0=1;
}
void timer1() interrupt 3 //定时器1中断用来产生2秒时间定时
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
flag++;
if(flag==360)
{
flag=0;
fre=50000;
}
}
7404做一个分频器 用单片机的ALE信号做输入 近期尝试
一周热门 更多>