51单片机定时器问题,题目如图所示,蜂鸣器的位置在P3^6

作者&投稿:弓袁 (若有异议请与网页底部的电邮联系)
51单片机,定时器控制蜂鸣器 TH TL 音谱~

蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。三极管的作用为驱动,通过三极管放大驱动电流,从而可以让蜂鸣器发出声音。
有源蜂鸣器和无源蜂鸣器的区别:
这里的“源”不是指电源。而是指震荡源。 也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。 而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K~5K的方波去驱动它。 有源蜂鸣器往往比无源的贵,就是因为里面多个震荡电路。 无源蜂鸣器的优点是:1。便宜,2。声音频率可控,可以做出“多来米发索拉西”的效果。3。在一些特例中,可以和LED复用一个控制口 有源蜂鸣器的优点是:程序控制方便 。

例程,参考自网络。
1 /************************************************************************
2 [文件名] C51音乐程序(八月桂花)
3 [功能] 通过单片机演奏音乐
4
5 /**********************************************************************/
6 #include
7 #include
8 //本例采用89C52, 晶振为11.0592MHZ
9 //关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.
10 //频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;
11 //所以拿出谱子, 试探编吧!
12
13 sbit Beep = P1^5 ;
14
15 unsigned char n=0; //n为节拍常数变量
16 unsigned char code music_tab[] ={
17 0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,
18 0x20, 0x40, 0x1C , 0x10,
19 0x18, 0x10, 0x20 , 0x10,
20 0x1C, 0x10, 0x18 , 0x40,
21 0x1C, 0x20, 0x20 , 0x20,
22 0x1C, 0x20, 0x18 , 0x20,
23 0x20, 0x80, 0xFF , 0x20,
24 0x30, 0x1C, 0x10 , 0x18,
25 0x20, 0x15, 0x20 , 0x1C,
26 0x20, 0x20, 0x20 , 0x26,
27 0x40, 0x20, 0x20 , 0x2B,
28 0x20, 0x26, 0x20 , 0x20,
29 0x20, 0x30, 0x80 , 0xFF,
30 0x20, 0x20, 0x1C , 0x10,
31 0x18, 0x10, 0x20 , 0x20,
32 0x26, 0x20, 0x2B , 0x20,
33 0x30, 0x20, 0x2B , 0x40,
34 0x20, 0x20, 0x1C , 0x10,
35 0x18, 0x10, 0x20 , 0x20,
36 0x26, 0x20, 0x2B , 0x20,
37 0x30, 0x20, 0x2B , 0x40,
38 0x20, 0x30, 0x1C , 0x10,
39 0x18, 0x20, 0x15 , 0x20,
40 0x1C, 0x20, 0x20 , 0x20,
41 0x26, 0x40, 0x20 , 0x20,
42 0x2B, 0x20, 0x26 , 0x20,
43 0x20, 0x20, 0x30 , 0x80,
44 0x20, 0x30, 0x1C , 0x10,
45 0x20, 0x10, 0x1C , 0x10,
46 0x20, 0x20, 0x26 , 0x20,
47 0x2B, 0x20, 0x30 , 0x20,
48 0x2B, 0x40, 0x20 , 0x15,
49 0x1F, 0x05, 0x20 , 0x10,
50 0x1C, 0x10, 0x20 , 0x20,
51 0x26, 0x20, 0x2B , 0x20,
52 0x30, 0x20, 0x2B , 0x40,
53 0x20, 0x30, 0x1C , 0x10,
54 0x18, 0x20, 0x15 , 0x20,
55 0x1C, 0x20, 0x20 , 0x20,
56 0x26, 0x40, 0x20 , 0x20,
57 0x2B, 0x20, 0x26 , 0x20,
58 0x20, 0x20, 0x30 , 0x30,
59 0x20, 0x30, 0x1C , 0x10,
60 0x18, 0x40, 0x1C , 0x20,
61 0x20, 0x20, 0x26 , 0x40,
62 0x13, 0x60, 0x18 , 0x20,
63 0x15, 0x40, 0x13 , 0x40,
64 0x18, 0x80, 0x00
65 };
66
67 void int0() interrupt 1 //采用中断0 控制节拍
68 { TH0=0xd8;
69 TL0=0xef;
70 n--;
71 }
72
73 void delay (unsigned char m) //控制频率延时
74 {
75 unsigned i=3*m;
76 while(--i);
77 }
78
79 void delayms(unsigned char a) //豪秒延时子程序
80 {
81 while(--a); //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!
82 }
83
84 void main()
85 { unsigned char p,m; //m为频率常数变量
86 unsigned char i=0;
87 TMOD&=0x0f;
88 TMOD"=0x01;
89 TH0=0xd8;TL0=0xef;
90 IE=0x82;
91 play:
92 while(1)
93 {
94 a: p=music_tab[i];
95 if(p==0x00) { i=0, delayms(1000); goto play;} //如果碰到结束符,延时1秒,回到开始再来一遍
96 else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延时100ms,继续取下一音符
97 else {m=music_tab[i++], n=music_tab[i++];} //取频率常数 和 节拍常数
98 TR0=1; //开定时器1
99 while(n!=0) Beep=~Beep,delay(m); //等待节拍完成, 通过P1口输出音频(可多声道哦!)
100 TR0=0; //关定时器1
101 }
102 }

#include

sbit beep = P1^7;
char sss;
bit bbb;

//*****************************
void sleep(int ms) //延时
{
int i;
for(;ms > 0; ms--) for(i = 0; i < 124; i++);
}
//******************************
void init() //初始化定时器0
{
TMOD = 0x01;
TH0 = (65535 - 50000) / 256;
TL0 = (65535 - 50000) % 256;
TR0 = 1;
ET0 = 1;
EA = 1;
}
//*******************************
void main()
{
char i;
init(); // 中断
while(1) {
if (bbb) { //蜂鸣器发出多.
bbb = 0;
for (i = 0; i < 124; i++) {
beep = ~beep;
sleep(1);
}
}
}
}
//********************************
void TIMER0() interrupt 1
{
TH0 = (65535 - 50000) / 256;
TL0 = (65535 - 50000) % 256;
sss++;
if (sss == 20) {
sss = 0;
bbb = 1;
}
}
//********************************

#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;//开定时器0中断
ET1=1;
TR1=1;
TR0=1;//启动定时器0
while(1);//等待中断产生

}

void timer0() interrupt 1 //定时器0中断
{
TR0=0; //进中断后先把定时器0中断关闭,防止内部程序过多而造成中断丢失
TH0=(65536-fre)/256;
TL0=(65536-fre)%256;
tt++;
if(flag<40) //以下几个if分别用来选取不同的频率
if(tt==10)
{
tt=0;
fre=50000;
beep=~beep;
}
if(flag>=40&&flag<80)
{
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;
}
}

一、间隔300ms,那同一个频率 的时间呢?如500Hz 的时间长度。
还是说,每个频率时间长度都是300ms,中间没有间隔。如果真是这样,1Hz 的周期为1s,半周都500ms了,300ms不够用。所以300ms只是两个频率之间过渡的空白吧。
二、蜂鸣器 是高电平 驱动 还是 低电平 驱动?频率过渡之间的空白是停止蜂鸣器,还是不管?
三、最后 1KHz的频率结束后,该如何?是停止 还是 循环?
四、系统 晶振是多大的呢?

控制蜂鸣器发声,声音,这个词,不是随便用的。

声音的频率范围是:20Hz ~20kHz。

题目中的 1Hz、10Hz,都不是声音。

此题无解。

关闭了吧。

1个足够


单片机的定时器计算问题?
你提问的单片机的定时器计算问题,是针对51单片机的。确实很对,晶振频率是12MHz,机器周期是1us,而机器周期=12\/fosc,因为,一个机器周期是12个时钟周期,那时钟周期是频率倒数,即1\/12,所以除12,应该是除晶振频率。

单片机定时器问题
的意思是给定时器设定一个目标时间(可以根据时钟计算出时间),定时器T0从初值开始在时钟的上升沿或者下降沿加1,当T0的计数值和达到TH0=256,TL0=256时,即可产生中断或者置位TF0=1同时清零;至于 “P1=TL0; \/\/计数器TL0加1后送P1口显示”这个怎么解释要“加1”表示定时器T0设定的外部技术模式,...

请问单片机中的定时器1的溢出率是怎么回事呢?
当单片工作在12分频模式时,定时器T1的溢出率=(fsys\/12)\/(256-TH1)。解释一下,fsys作为单片机CPU、内部接口的时钟成为系统时钟。您给出的fosc,据我所知是时钟源(振荡器时钟)信号的频率。fsys与fosc有什么关系呢?因为时钟源信号需要经过一个可编程(也就是可以位操作或直接对某寄存器操作)的时钟...

单片机定时器问题
程序如下:ORG 0000H AJMP MAIN ORG 000BH AJMP INTER MAIN:MOV TMOD, #01H MOV TH0, #3CH MOV TL0, #0B0H SETB TR0 SETB EA SETB ET0 ;定时器初始化结束,下面循环显示即可.;MOV R7, #20 ;50ms计数.MOV R1, #00H ;0~99计数.AA1:MOV A, R1 MOV B, #10...

单片机STC15定时器(1)中断,数码管自动加1的电子钟,为什么不自动加1
单片机STC15定时器1显示的电子钟,这程序问题太多了,虽然能生成HEX文件,可那HEX代码有错误,电子钟当然不会自动加1计时了。主程序格式就不对,应该是下图这样。那中断程序应该有interrupt 1,才可以中断后执行中断程序。而你这样是不会执行中断程序的。中断程序中的变量是全局变量,红框内的变量应在...

单片机,当定时器\/计数器工作方式于1下,晶振频率为6M,请计算最短定时时间...
定时器是通过计数溢出来计时的,工作方式1是16位计数方式。晶振频率为6M,那么计数器加1需要一个机器周期2us。机器周期=12\/fosc,fosc为晶振频率。计数初值为1时,定时最短为2us,最长是计2的16次方(即65536),最长时间=2*65536us=131.072ms 。在工作方式1下,定时时间:t=(65536-T0初始值)*...

关于单片机中断程序的定时器0和定时器1
首先,你所说的两种赋值方法,实际上是一种,就是就是寄存器的高8为位个低8位赋值。你说的第二种(TH0=(65536-50000)\/256)所赋的值是经过计算(=(65536-50000)\/256)得到的,你知道定时计数器的工作原理就清楚了。其次,赋值大小要根据你的晶振以及单片机工作模式确定机器周期,然后才能确定...

希望高手帮忙,说明一下单片机中定时器0和定时器1中断执行过程
定时器1 50ms中断一次,每次中断FLAG加1 40次即为2秒,所以在定时器0中断时,要判断是0-40,40-80等时间段 定时器0中断时,要再次装入定时时间常数,但在0-40,40-80等时间段内装入的时间常数是不同的,因此beep取反的频率就不同 但由于定时器0中断10次BEEP才取反一次,所以当fre=50000;...

avr单片机定时器1中断问题
中断没有问题,有问题的是把中断初始化和下面几句放在while(1)中了:1)--DDRF = 0x01; ---设置端口PF0为输入,其他为输出 2)--PORTF = 0x01;---设置端口PF0为高电平,其他为低电平(包括PF1)3)--DDRF = 0x02;---设置端口PF1为输入,其他为输出 4)--PORTF = 0x02;---...

1.单片机定时器中知道溢出时间,知道取值范围,知道时间间隔,怎么算TH...
首先应该知道一个脉冲周期是多少 ?24MHZ时,输给定时器的脉冲频率是2MHZ,一个脉冲周期是0.5US因此,此时定时 器可以最长定时65536*0.5=32.768MS 0.2秒一次不能完成,需多次累积,如一次定时20ms,累积10次,定时20MS需要计数的脉冲个数是40000个初值可以直接这么写 初值=65536-40000 且初值=...

台江区13548959646: MCS - 51单片机的编程题:已知系统晶振频率为12MHZ,采用定时器T0的方式1,请编程实现1s的延时. -
枕之鱼腥: void timer0() interrupt 1 { uchar count; TH0 = (65536-50000)/256; TL0 = (65536-50000)%256; count++; if(count == 20) { count = 0; sec++; if(sec == 100) { sec = 0; } } }

台江区13548959646: 51单片机定时器中断问题 -
枕之鱼腥: 首先要理解定时器的功能: 说的通俗一点, 定时器可以让单片机每隔一段时间进入一次中断,然后在中断中判断是所关注的事件是否发生,程序如下:#include <reg51.h> sbit Data_in=P0^1;//T0初始化 ,以下是定时器初始化的步骤,有了这几...

台江区13548959646: 51单片机程序如下,问定时器为啥没工作,求改错. -
枕之鱼腥: TF0是什么?溢出中断请求标志位. T0计数溢出时由硬件自动置TF0为1.CPU响应中断后TF0由硬件自动清0. 中断是什么意思? 就拿 你这里来说,就是暂停执行你这里的主函数,去执行中断里面 的函数.你的程序过程是这样的: 定时器第...

台江区13548959646: 51单片机定时器问题 *** error 65: access violation at C:0x000B : no 'execute/read' permission -
枕之鱼腥: 任务占坑

台江区13548959646: stc51 单片机使用定时器问题
枕之鱼腥: #include<reg51.h> sbit P1^2 = led;//就当是它. unsigned char time;//全局变量 main(){ led = 0; IE = 0X82;//开T0中断、总中断 TMOD = 0X01;//方式1 TH0 = 0x3c;//高8初值 TL0 = 0xb0;//低8初值 TR0 = 1;//启动T0 //50ms周期 while(1){ if(...

台江区13548959646: 51单片机的计时器问题 -
枕之鱼腥: 0x是16进制数的前缀.0x01的意思是后面的01是一个16进制数字,换算成二进制就是00000001.意思就对TMOD寄存器依次赋值为00000001.因为TMOD的每一位都是针对于定时器的设置,所以这句话的意思就是设置定时器1工作在方式0,而定时器0工作在方式1.

台江区13548959646: 51单片机定时器中断问题
枕之鱼腥: 51单片机定时器, 不管用 方式0 或 方式1、方式2,只要 打开 定时器 就开始 计数, 不管进入中断 或 退出中断,定时器不关是不会 停止 计数的, 可以在 中断服务程序 中 重新设置 定时器 值.

台江区13548959646: 关于89C51单片机定时器T1问题. -
枕之鱼腥: 定时器有四种工作方式,如果T0设为方式3的话,T1的TF1就被T0占据了,当然就不能用于定时了.其他情况下这样做应该是可以的,T1只要在跑,溢出时就会影响TF1,而UART收发都是自动的,不占用CPU时钟,只是要一个T1溢出频率而已,所以中断方式和查询方式应该都能工作.楼上说的覆盖是什么意思?优先级可以通过IP来设,而且就算定时中断优先于串口中断被处理,大不了等定时中断结束再处理串口呗.关于为什么选用T1做波特率发生器而不是T0的问题,事实上很简单,人家硬件就这么设计的.芯片内部就是把T1的溢出信号连接在分频器上提供给了UART,它连的就不是T0,你就算想用T0也不好使,不愿意也没用,呵呵.

台江区13548959646: 51单片机定时器控制方式TMOD问题 -
枕之鱼腥: TMOD |=0x01 ;0x01“或”到TMOD (TMOD=0x01) TMOD |=0x10 ;0x10“或”到TMOD (最后TMOD=0x11 )

台江区13548959646: 单片机的定时器问题?
枕之鱼腥:控制寄存器中一般是有一位开关位的,比如AT89S52是TR0,TR1

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网