从零开始的单片机学习(十一)

十一、蜂鸣器
    1、蜂鸣器的原理
        a、无源蜂鸣器
            (1)早期蜂鸣器都是无源的
            (2)内部构造和材料:材料为两个金属片。其平行放置,距离很近
            (3)发声原理:方波信号输入谐振装置转换为声音信号输出从而发出声音。
            (4)控制信号:高低电平相间的信号
            (5)电路图:蜂鸣器一段接电阻接地,另一端接一个NPN三极管的N级,三极管另一个N级接电源VCC,
         单片机引脚接三极管的P级,控制两个N级的导通与否。 
            (6)音调如何控制,音调受震动频率控制,就等于控制信号的频率。频率越高音调越高,听起来就越刺
         耳。频率越低音调越低,声音听起来就越厚重。
            (7)声音大小如何控制,受硬件决定的,不受软件控制,无法写代码来控制声音大小的控制。

        b、有源蜂鸣器
            (1)无源蜂鸣器的缺陷:控制较为麻烦
            (2)内置振荡电路后形成有源蜂鸣器
            (3)有源蜂鸣器也可以用频率信号驱动

    2、让蜂鸣器响起来    
        a、确定接线:J7链接到P0。0引脚上(这部分依照开发板集体情况和个人喜好而定)

        b、最简单:使用delay让蜂鸣器响起来
            代码:
                while(1)
                {
                    buzzer = 1;
                    delay_ms();
                    buzzer = 0;
                }

        c、调节delay时间感受音调的变化
            不同时间的delay蜂鸣器的音调不同,要有比较明显的声音需要微妙级别的延时。毫秒级别声音不明显。

    3、用定时器控制蜂鸣器音调
        a、上节课驱动方法的问题
            (1)不容易精准控制时间
            (2)CPU控制蜂鸣器的时候不可以做其他事情

        b、定时器控制蜂鸣器响
            (1)10KHz => (1/10000)s = 0.1ms = 100μs => 高电平加低电平的时间是100μs。所以要定的
         时间就是50μs。
             (2)外部晶振12MHz + 12T设置 => 内部时钟频率1MHz => 1μs => TL0 = (65536 - 50)%256
         THO = (65536 - 50) / 256[此处是加法定时器,如果是减法定时器,那么TL0 = 50,TH0 = 0]

        c、音调改变
            (1)代码:
                #include <REGX51.H>
                #include <intrins.h>
                #define smg P2
                #define xhz 20
                #define count (1000000/(2*xhz))
                #define low ((65536-count)%256)
                #define high ((65536-count)/256)
                sbit buzzer = P0^0;            //buzzer的驱动引脚  

                unsigned char duan[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
                                            0xf8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e};
                void delay(unsigned int t);
                void tim0_buzzer() interrupt 1 using 1
                {
                    TL0 = low;
                    TH0 = high;
                    buzzer = ~buzzer;
                }
                void main(void)
                {
                    unsigned char i;
                    TMOD = 0x01;
                    TL0 = low;
                    TH0 = high;
                    TR0 = 1;
                    ET0 = 1;
                    EA  = 1;
                    
                    while(1)
                    {
                        for (i=0; i<16; i++)
                        {
                            smg = duan[i];
                            delay(150);
                        }
                    }
                }
                void delay(unsigned int t)
                {
                    while(t--)
                    {
                        unsigned char i = 2;
                        unsigned char j = 239;
                        do
                        {
                            while(--j);
                        }while(--i);        
                    }
                }
            (2)结论:通过该xhz这个宏的值就修改蜂鸣器的音调。总的来说xhz越大声音越尖锐,xhz越小声音越
         低沉。

    4、蜂鸣器发出滴滴声
        代码:
            #include <REGX51.H>
            
            #define smg P2
            #define xhz 1000
            #define count (1000000/(2*xhz))
            #define low ((65536-count)%256)
            #define high ((65536-count)/256)
            #define num (xhz/2)
            sbit buzzer = P0^0;            //buzzer的驱动引脚  

            unsigned int j;
            unsigned char flag = 0;
            unsigned char duan[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
                                        0xf8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e};
            void delay(unsigned int t);
            void tim0_buzzer() interrupt 1 using 1
            {
                TL0 = low;
                TH0 = high;
                if(j-- == 0)
                {
                    if(flag == 0)
                    {
                        j = num*10;
                        flag = 1;
                    }else
                    {
                            j = num;
                            flag = 0;
                            buzzer = !buzzer;
                    }
                }
                else
                {
                    if(flag == 0)
                    {
                            buzzer = !buzzer;
                            
                    }else
                    {            
                    }
                }
            }
            void main(void)
            {
                unsigned char i;
                TMOD = 0x01;
                TL0 = low;
                TH0 = high;
                TR0 = 1;
                ET0 = 1;
                EA  = 1;
                j = num;
                flag = 0;
                buzzer = 1;
                while(1)
                {
                    for (i=0; i<16; i++)
                    {
                        smg = duan[i];
                        delay(150);
                    }
                }
            }
            void delay(unsigned int t)
            {
                while(t--)
                {
                    unsigned char i = 2;
                    unsigned char j = 239;
                    do
                    {
                        while(--j);
                    }while(--i);        
                }
            }

    5、让蜂鸣器唱歌1
        a、为什么蜂鸣器可以唱歌?
            (1)发声音调可变
            (2)发声长度可变
        b、体验已经写好的唱歌程序
            (1)复制代码
            (2)修改蜂鸣器的IO引脚定义
        c、理解代码
            (1)按照习惯调好代码风格再去看。

    6、让蜂鸣器唱歌2
        a、简单的学习如何看简谱
            简谱:(数字下方有两点)1    2     3     4     5         6     7
            唱名:                    do  re mi  fa  sol    la  si(大字组)
            简谱:(数字下方有一点)1    2     3     4     5         6     7
            唱名:                    do  re mi  fa  sol    la  si(小字组)
            简谱:(数字下方没有点)1    2     3     4     5         6     7
            唱名:                    do  re mi  fa  sol    la  si(小字一组)
            简谱:(数字上方有一点)1    2     3     4     5         6     7
            唱名:                    do  re mi  fa  sol    la  si(小字二组)
            (1)1 = D4/4:“4/4”从上往下看其代表以四分音符为一拍,每小节为四拍
            (2)简谱中数字下方有横线:音值减半,譬如一个四份音符时长是500ms,加了下划线则变成250ms
            (3)简谱数字右边有一个点,那个点被称为附点音符。附点音符代表这个数字代表的音符时长延长二分
         之一。譬如一个四分音符时长为500ms,加了附点音符后时长变为500+250 = 750ms。
             (4)每个小节的时长是一定的,一般来说一小节的时长都是四个四分音符。
             (5)简谱数字后面跟着一个横线代表这个这个音符占据俩拍的时长。譬如一个四分音符时长是500Ms,
         那么加了这个符号后时长变为500+500=1000ms。
             (6)数字左上角加了一个“#“,代表将这个音符提高半个音级;而相对的左上角加“b”代表降低这个音符
         半个音级。
             (7)在两个数字上方有一道弧线相连,那么这个弧线被称为延音线,一般连在两个相同的音符之间,代
         表在演奏或者播放的时候这两个音符是连续播放的,不是断开的。
             (8)下一个音符的频率 = 上一个音符的频率 * 2^(1/12)。譬如在c调中低音1的频率为262Hz,那么
         低音1#的频率为262*2^(1/12) = 277.579,与对照表基本相同。

        b、代码:
                #include <REGX51.H>
                #include <intrins.h>

                #define SMG P0
                #define KEY P1

                #define SPEED 500
                #define LOW(RNUM) (RNUM%256)
                #define HIGH(RNUM) (RNUM/256)

                sbit buzzer = P2^7;            //buzzer的驱动引脚  

                unsigned char code duan[16]=
                {
                    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
                    0xf8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e
                };

                unsigned int code FreqTable [38] =
                {
                    63628, 63731, 63835, 63928, 64021, 64103, 64185, 64260, 64331,
                    64400, 64463, 64524, 64580, 64633, 64684, 64732, 64777, 64820,
                    64860, 64898, 64934, 64968, 65000, 65030, 65058, 65085, 65110,
                    65134, 65157, 65178, 65198, 65217, 65235, 65252, 65268, 65283,
                    0, 0xff
                };
                unsigned char code music []=
                {    
                     12, 12, 19, 19, 21, 21, 19, 17, 17, 16, 16, 14, 14, 12,
                   19, 19, 17, 17, 16, 16, 14, 19, 19, 17, 17, 16, 16, 14,
                     12, 12, 19, 19, 21, 21, 19, 17, 17, 16, 16, 14, 14, 12,
                     36,
                     1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2,
                     1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2,
                     1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2,
                };
                unsigned char freqselect, musicselect;
                void delay(unsigned int t);

                void tim0_buzzer() interrupt 1 using 1
                {
                    TL0 = LOW(FreqTable[freqselect]);
                    TH0 = HIGH(FreqTable[freqselect]);
                    buzzer = !buzzer;
                }

                void main(void)
                {
                    unsigned char num = 0;
                    TMOD = 0x01;
                    TL0 = LOW(FreqTable[36]);
                    TH0 = HIGH(FreqTable[36]);
                    TR0 = 1;
                    ET0 = 1;
                    EA  = 1;
                    
                    while(1)
                    {    
                        if(music[musicselect] != 36)
                        {
                            freqselect = (music[musicselect]);    
                            delay(SPEED*(music[musicselect+43]));
                            musicselect++;
                            TR0 = 0;
                            delay(5);
                            TR0 = 1;    
                        }
                        else
                        {
                            TR0 = 0;
                        }
                            
                    }
                }

                void delay(unsigned int t)
                {
                    while(t--)
                    {
                        unsigned char i = 2;
                        unsigned char j = 239;
                        do
                        {
                            while(--j);
                        }while(--i);        
                    }
                }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例 基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例 基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例 基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例 基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例
学习51单片机C语言需要有一定的基础知识,首先要了解C语言的基本语法和编程规范。可以通过阅读相关的书籍和资料,网上视频教程来系统地学习C语言的基础知识。掌握了C语言的基础知识之后,就可以开始学习51单片机的相关知识。 其次,需要了解51单片机的硬件结构、指令集和编程环境。可以通过查阅51单片机的相关资料和学习笔记来了解51单片机的基本知识和编程环境的搭建。学习过程中可以通过实验和练习加深理解,掌握51单片机的基本原理和编程方法。 学习过程中还需要具备一定的动手能力和实践经验,可以通过购买一些实验套件进行实际的操作和编程练习。通过实际操作可以更加深入地理解单片机的工作原理和编程方法,同时也可以提高自己的动手能力和解决问题的能力。 另外,学习51单片机C语言还需要有一定的毅力和耐心,因为学习过程中可能会遇到各种各样的困难和问题,需要持之以恒地克服这些困难。可以多参与一些相关的社区和论坛,向其他有经验的人请教和交流,可以更快地解决问题和提高自己的学习效率。 总之,学习51单片机C语言需要持续地学习和实践,掌握C语言的基础知识、了解51单片机的硬件结构和编程环境,提高动手能力和解决问题的能力,同时要有毅力和耐心,相信通过不懈的努力一定能够掌握这门技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值