日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] 這個小程序仍然是定時(shí)器的運(yùn)用,比較簡單,具體的地方都在注釋中注明了,參考注釋。/*********************************************程序功能:MCU控制蜂鳴器演奏歌曲《祝你平安》--------------------

這個小程序仍然是定時(shí)器的運(yùn)用,比較簡單,具體的地方都在注釋中注明了,參考注釋。


  1. /*********************************************

  2. 程序功能:MCU控制蜂鳴器演奏歌曲《祝你平安》

  3. ----------------------------------------------

  4. 撥碼開關(guān)設(shè)置:將BUZZER位撥至ON,其余位撥至OFF

  5. 測試說明:聆聽蜂鳴器“唱出”的樂曲

  6. 既然是演奏樂曲對于一個音符應(yīng)該包括兩個部分

  7. 一是聲調(diào)二是持續(xù)時(shí)間,在這個程序中聲調(diào)是用簡單的

  8. 延時(shí)-電平翻轉(zhuǎn)來實(shí)現(xiàn)的,改變了延時(shí)的時(shí)間就改變了

  9. 聲調(diào),而時(shí)間是通過計(jì)數(shù)比較來實(shí)現(xiàn)的,當(dāng)計(jì)數(shù)值相等時(shí)

  10. 就跳出循環(huán)演奏下一個音符。

  11. *********************************************/

  12. #include

  13. typedefunsignedcharuchar;

  14. #include"music.h"

  15. #defineBuzzerBIT7

  16. #defineBuzzer_PortP6OUT

  17. #defineBuzzer_DIRP6DIR

  18. ucharcounter;

  19. voidPlay_Song(void);

  20. /***************主函數(shù)****************/

  21. voidmain(void)

  22. {

  23. uchari;

  24. /*下面六行程序關(guān)閉所有的IO口*/

  25. P1DIR=0XFF;P1OUT=0XFF;

  26. P2DIR=0XFF;P2OUT=0XFF;

  27. P3DIR=0XFF;P3OUT=0XFF;

  28. P4DIR=0XFF;P4OUT=0XFF;

  29. P5DIR=0XFF;P5OUT=0XFF;

  30. P6DIR=0XFF;P6OUT=0XFF;

  31. P6DIR|=BIT2;P6OUT|=BIT2;//關(guān)閉電平轉(zhuǎn)換

  32. WDTCTL=WDTPW+WDTHOLD;//關(guān)閉看門狗

  33. /*------選擇系統(tǒng)主時(shí)鐘為8MHz-------*/

  34. BCSCTL1&=~XT2OFF;//打開XT2高頻晶體振蕩器

  35. do

  36. {

  37. IFG1&=~OFIFG;//清除晶振失敗標(biāo)志

  38. for(i=0xFF;i>0;i--);//等待8MHz晶體起振

  39. }

  40. while((IFG1&OFIFG));//晶振失效標(biāo)志仍然存在?

  41. BCSCTL2|=SELM_2+SELS;//主時(shí)鐘和從時(shí)鐘都選擇高頻晶振

  42. //設(shè)置定時(shí)器A每10ms中斷一次

  43. CCTL0=CCIE;

  44. CCR0=10000;//改變這個值就改變了演奏的速度

  45. TACTL|=TASSEL_2+ID_3;

  46. //設(shè)置控制蜂鳴器的IO方向?yàn)檩敵?/p>

  47. Buzzer_DIR|=Buzzer;

  48. //打開全局中斷

  49. _EINT();

  50. //循環(huán)演奏歌曲

  51. while(1)

  52. {

  53. Play_Song();

  54. }

  55. }

  56. /*******************************************

  57. 函數(shù)名稱:TimerA_ISR

  58. 功能:定時(shí)器A的中斷服務(wù)函數(shù)

  59. 參數(shù):無

  60. 返回值:無

  61. ********************************************/

  62. #pragmavector=TIMERA0_VECTOR

  63. __interruptvoidTimerA_ISR(void)

  64. {

  65. counter++;

  66. }

  67. /*******************************************

  68. 函數(shù)名稱:Delay_Nms

  69. 功能:延時(shí)N個ms的函數(shù)ps:不知道這個地方怎么算出來的是延時(shí)毫秒

  70. 參數(shù):n--延時(shí)長度

  71. 返回值:無

  72. ********************************************/

  73. voidDelay_Nms(ucharn)

  74. {

  75. uchari,j;

  76. for(i=0;i

  77. {

  78. for(j=0;j<3;j++)

  79. _NOP();

  80. }

  81. }

  82. /*******************************************

  83. 函數(shù)名稱:Play_Song

  84. 功能:播放《祝你平安》的樂曲

  85. 參數(shù):無

  86. 返回值:無

  87. ********************************************/

  88. voidPlay_Song(void)

  89. {

  90. ucharTemp1,Temp2;

  91. ucharaddr=0;

  92. counter=0;//中斷計(jì)數(shù)器清0

  93. while(1)

  94. {

  95. Temp1=SONG[addr++];

  96. if(Temp1==0xFF)//休止符

  97. {

  98. TACTL&=~MC_1;//停止計(jì)數(shù)

  99. Delay_Nms(100);

  100. }

  101. elseif(Temp1==0x00)//歌曲結(jié)束符

  102. {

  103. return;

  104. }

  105. else

  106. {

  107. Temp2=SONG[addr++];

  108. TACTL|=MC_1;//開始計(jì)數(shù)

  109. while(1)

  110. {

  111. Buzzer_Port^=Buzzer;//電平取反

  112. Delay_Nms(Temp1);//Temp1的值決定了延時(shí)的長短,也決定了聲音的頻率

  113. if(Temp2==counter)//決定了音調(diào)持續(xù)的時(shí)間,計(jì)數(shù)時(shí)間到時(shí)就跳出循環(huán)演奏下一個。

  114. {

  115. counter=0;

  116. break;

  117. }

  118. }

  119. }

  120. }

  121. }



本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉