欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 51單片機通過I/O口控制蜂鳴器播放音樂程序 [打印本頁]

作者: zhouwei888    時間: 2023-9-10 13:20
標題: 51單片機通過I/O口控制蜂鳴器播放音樂程序
/*********************************************************************************
* 【外部晶振】: 11.0592mhz   
* 【主控芯片】: STC89C52
* 【編譯環境】: Keil μVisio4   
* 【程序功能】: 點亮開發板上的LED1                                                      
* 【使用說明】:
**********************************************************************************/
#include <reg52.h>
sbit beep = P2^3;
unsigned char timer0H, timer0L, time;

//單片機晶振采用11.0592MHz
// 頻率-半周期數據表 高八位     本軟件共保存了四個八度的28個頻率數據
code unsigned char FREQH[] = {
    0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8,    //低音1234567
    0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i
    0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE,            //高音 234567
    0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF};   //超高音 1234567
// 頻率-半周期數據表 低八位
code unsigned char FREQL[] = {
    0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6,    //低音1234567
    0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i
    0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D,             //高音 234567
    0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16};   //超高音 1234567
//數據表           
code unsigned char song[] = {
5, 2, 2, 6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 2, 1, 2, 6, 5, 1, 6, //
1, 2, 2, 3, 2, 2, 1, 3, 2, 7, 2, 2, 6, 2, 3, 3, 2, 1, 5, 2, 12,            //一刻也不能分割
6, 2, 2, 7, 2, 2, 6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 6, 6, 1, 6,    //無論我走到哪里
7, 1, 2, 6, 1, 2, 5, 1, 2, 5, 2, 2, 1, 2, 3, 2, 2, 1, 3, 2, 12,            //都唱出一首贊歌
5, 2, 2, 6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 2, 1, 2, 6, 5, 1, 6,    //我歌唱每一座高山
1, 2, 2, 3, 2, 2, 1, 3, 2, 7, 2, 2, 2, 3, 3, 1, 3, 1, 6, 2, 12,            //我歌唱每一條河
1, 3, 2, 7, 2, 2, 6, 2, 2, 5, 2, 6,                                        //裊裊炊煙
6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 6,                                        //小小村落
7, 1, 4, 6, 1, 2, 5, 1, 4, 2, 2, 2, 1, 2, 12,                            //路上一道轍
8, 2, 2, 2, 3, 2, 3, 3, 2, 2, 3, 2, 8, 2, 2, 6, 2, 2, 7, 2, 2, 6, 2, 3, 3, 2, 1, 5, 2, 12,//
8, 2, 2, 2, 3, 2, 3, 3, 2, 2, 3, 2, 8, 2, 2, 6, 2, 2, 7, 2, 2, 5, 2, 3, 3, 2, 1, 6, 2, 12,//我永遠緊依著你的心窩
5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 6, 7, 1, 2, 6, 1, 2, 5, 1, 2, 3, 2, 6,4, 2, 6, 2, 2, 4, 1, 2, 2,1, 2, 10,//你用你那母親的脈搏和我訴說
};
//一個音符有三個數字。前為第幾個音、中為第幾個八度、后為時長(以半拍為單位)。
//6, 2, 3 分別代表:6, 中音, 3個半拍;
//5, 2, 1 分別代表:5, 中音, 1個半拍;

void t0int() interrupt 1         //T0中斷程序,控制發音的音調
{
    TR0 = 0;                     //先關閉T0
    beep = !beep;          //輸出方波, 發音
    TH0 = timer0H;               //下次的中斷時間, 這個時間, 控制音調高低
    TL0 = timer0L;
    TR0 = 1;                     //啟動T0
}

void delay(unsigned char t)     //延時程序,控制發音的時間長度
{
    unsigned char t1;
    unsigned long t2;
    for(t1 = 0; t1 < t; t1++)    //雙重循環, 共延時t個半拍
      for(t2 = 0; t2 < 4000; t2++); //延時期間, 可進入T0中斷去發音
    TR0 = 0;                        //關閉T0, 停止發音
}

void sing()                      //演奏一個音符
{
    TH0 = timer0H;               //控制音調
    TL0 = timer0L;
    TR0 = 1;                     //啟動T0, 由T0輸出方波去發音
    delay(time);                 //控制時間長度
}

void main(void)
{
    unsigned char k, i;
    TMOD = 1;                    //置T0定時工作方式1
    ET0 = 1;                     //開T0中斷
    EA = 1;                      //開總中斷
    while(1)
    {
      i = 0;
      time = 1;
      while(time)
      {
        k = song[i] + 7 * song[i + 1] - 1;//第i個是音符, 第i+1個是第幾個八度
        timer0H = FREQH[k];      //從數據表中讀出頻率數值
        timer0L = FREQL[k];      //實際上, 是定時的時間長度
        time = song[i + 2];   //讀出時間長度數值
        i += 3;
        sing();                  //發出一個音符
      }  
    }  
}


作者: 周工58    時間: 2023-9-10 15:57
不錯。注解詳細,




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1