求一个程序思路,关于蜂鸣器。
cnt100us是全局变量,因为定时器设置了100us自动重载(可根据实际需要更改),中断发生1次cnt100us+1,num也是全局变量,可以在按键程序中++/- -。num数值越大频率越低,反之亦然。
你这不已经是思路了吗,思路就是你想要做什么,达到什么目标,你这连先做什么,后做什么都有了。
......问题是不知道 怎么开始写了。也许我上面的陈述有错。好尴尬 又是大哥 你。
陈述没错啊,
一,检测按键
二,如果按键按下,频率加1
三,显示频率
没错啊
那这个问题。问得我自己都 笑了。按键和显示我都可以写出来。就是这个频率是什么 ?怎么去写?
蜂鸣器分有源和无源两种,有源的蜂鸣器驱动不需要改变频率,无源蜂鸣器需要一定频率的脉冲来驱动。
频率可以用定时器来实现,那更改频率就是更改定时器的定时时间。
按键和显示你都可以写出来,这个你应该一看就明白了。
void Timer0Init(void) //100微秒@12.000MHz
{
TMOD = 0x02; //设置定时器自动重载模式
TL0 = 0x9C; //设置定时初值
TH0 = 0x9C; //设置定时重载值
TR0 = 1; //定时器0开始计时
EA=1; //开总中断
ET0=1; //开定时器0中断
}
void timer0() interrupt 1 //中断服务程序
{
Cnt100us++; //定时器中断计数变量自+1
if(Cnt100us>=num) //改变num值就改变频率(反比)
{ //频率=1/秒/2/num
Cnt100us=0; //定时器中断计数变量清0
Buzzer=~Buzzer; //蜂鸣器端口取反
}
}
因为刚学,所以不是很明白 。我想问一下你这个cnt100us怎么来? 是不是要在上面写一个延时函数? 还有那个num是不是也要在上面定义一个全局变量num?就比如说我那个按键按下num++这样来改变他的值吗?
那不是和我的初忠相反了。我是想让按键按下后频率++ 让数码管显示频率 出来。
而且大神,我还想补充下。我按照你上面的去写了 蜂鸣器可以响。但那是当cnt100us=0时才会响。但我是想测试这个蜂鸣器到达哪个频率时响声最大。 所以需要一个数码管显示出它的频率。 频率从0开始++
那里打错了。是cnt100us>=num时就会响、。
无源电磁式蜂鸣器常识
额定电压:电磁式蜂鸣器以1 / 2方波驱动
工作电压:可正常工作的适用电压范围,但不保证低于额定电压时仍能达到最低音压 。
消耗电流:正常发声后,持续的消耗电流量。而启动瞬间需要的电流,一般至少需要持续耗电流的三倍 。
直流电阻:以电表直接量测的直流阻抗。
声音输出:加以额定的电压,1 / 2方波,以数据库表在距离10厘米测得。
额定频率:蜂鸣器每一个频率都仍有声音,额定的频率指建议使用的最大,且音压一致性较好的频点 。
操作温度:能维持正常动作的温度-30 - +70度。
以某品牌无源电磁式蜂鸣器为例,在额定电压下其谐振频率附近就是最大音量,但我通常取2.5KHz,音质清脆。
额定电压:1.5V
电压范围:1.0V--3.0V
消耗电流:最大45mA(在1.5V, 2048Hz, 1/2 方波)
线圈阻抗:16.0±4.0 Ω
输出音压:85dB
谐振频率:2048 Hz
操作温度:-20℃-- +60℃
贮藏温度:-30℃-- +70℃
虽然还不是很懂,但你已经帮我解释很多了。最后还想问你最后 一个问题,
TL0 = 0x9C;
TH0 = 0x9C;
这两个地方的0x9c是怎么计算的?
因为是自学 所以问题比较多。麻烦了。
百度一下,单片机定时器初值计算方式,应该就能解决这个问题了。PS:因为不知道你用什么单片机,所以只能指引你自己去搜索答案了。
51单片机的定时器0模式2是8位自动重装模式,在12M晶振时,最大定时256us,如果设定100us就用256-100=156=0x9c。当计数100个脉冲TL0溢出不仅置位TF0,而且会自动动将TH0的内容重新装入TL0。知道这个道理就行,实际使用中可以借助定时器计算器。
51单片机的定时器0模式2是8位自动重装模式,在12M晶振时,最大定时256us,如果设定100us就用256-100=156=0x9c。当计数100个脉冲TL0溢出不仅置位TF0,而且会自动动将TH0的内容重新装入TL0。知道这个道理就行,实际使用中可以借助定时器计算器。
强烈支持小编ing……
说的很详细。谢了 那我要改变它的频率值不是可以直接改变这个0x9c就行了?我试了下把这个0x9c改成一个变量 然后按键按下后定义这个变量++ 蜂鸣器的声音会变大呢、。
可以这么做,只要搞懂定时器的工作原理,代码随意写。