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

標題: 一邊點陣屏顯示生日快樂,一邊生日歌 同時進行 求單片機程序思路? [打印本頁]

作者: pingfunny    時間: 2022-1-24 20:21
標題: 一邊點陣屏顯示生日快樂,一邊生日歌 同時進行 求單片機程序思路?
一邊點陣屏顯示生日快樂,一邊生日歌,怎么寫。(同時進行)

作者: 188610329    時間: 2022-1-24 22:59
你是要思路還是代碼?
思路是:
如果對生日歌要求不高,
兩個定時器
一個控制點陣的動態掃描以及滾動。
一個負責定時器頻率輸出驅動揚聲器,播放生日歌。

對生日歌有要求的,可以買一個音樂IC也就幾毛錢的東西,接揚聲器播放生日歌。
對生日歌要求高的,可以買一個MP3播放芯片,又單片機控制播放生日歌。

這個思路,一般會寫代碼的都能想到。
想不到的……,估計代碼是寫不出來的……
作者: npn    時間: 2022-1-25 10:19
需要兩個定時器和頻率輸出控制寄存器,只有STC部分型號可以實現。
作者: 累不死的狗    時間: 2022-1-25 15:25
第一種方案,51單片機有操作系統,可以使用一下
第二種方案,可以考慮用兩個單片機進行串口通信
第三種方案,買一個儲存好音樂的音樂片,由單片機控制放歌,然后再顯示
作者: npn    時間: 2022-1-25 17:25
累不死的狗 發表于 2022-1-25 15:25
第一種方案,51單片機有操作系統,可以使用一下
第二種方案,可以考慮用兩個單片機進行串口通信
第三種方 ...

沒用過操作系統,要啥串口通信? 音樂片? 你自己編的曲都可以放進去。
作者: pingfunny    時間: 2022-1-25 19:59
npn 發表于 2022-1-25 10:19
需要兩個定時器和頻率輸出控制寄存器,只有STC部分型號可以實現。

我用的是STC 80C52,調試了好久,沒能實現,不知啥情況。這是我的代碼。
  1. #include "reg51.h"                         //此文件中定義了單片機的一些特殊功能寄存器
  2. #include "intrins.h"
  3. typedef unsigned int u16;          //對數據類型進行聲明定義
  4. typedef unsigned char u8;
  5. u8 w;
  6. u16 j,n,m;

  7. sbit SRCLK=P3^6;
  8. sbit RCLK=P3^5;
  9. sbit SER=P3^4;
  10. sbit speaker=P1^5;

  11. u8 code led[9][10]={      
  12. {0x28,0xBF,0x24,0x01,0xF7,0x98,0xF7,0x01},       //祝
  13. {0x44,0x48,0x5F,0x69,0x49,0x49,0x4F,0x40},       //石
  14. {0x25,0x6D,0xB5,0x25,0x00,0x41,0x7F,0x41},       //紅
  15. {0x24,0x28,0xFF,0x28,0x00,0x5F,0xDF,0x5F},       //梅
  16. {0x15,0x25,0x65,0x25,0xFF,0x25,0x25,0x25},       //生
  17. {0x00,0x7F,0x49,0x49,0x49,0x49,0x7F,0x00},       //日
  18. {0x38,0xFF,0x38,0x01,0x2A,0xFC,0x2A,0x39},       //快
  19. {0x18,0x29,0x4A,0x88,0xBF,0x88,0x0A,0x09},       //樂

  20. };
  21. unsigned char timer0h,timer0l,time;
  22. //生日歌
  23. code unsigned char sszymmh[]={5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4,
  24. 5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,
  25. 5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2,
  26. 4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4};
  27. // 音階頻率表 高八位
  28. code unsigned char FREQH[]={
  29. 0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
  30. 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
  31. 0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
  32. 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
  33. } ;
  34. // 音階頻率表 低八位
  35. code unsigned char FREQL[]={
  36. 0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
  37. 0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
  38. 0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
  39. 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
  40. };

  41. void delay(unsigned char t)
  42. {
  43. unsigned char t1;
  44. unsigned long t2;
  45. for(t1=0;t1<t;t1++)
  46. {
  47. for(t2=0;t2<8000;t2++)
  48. {
  49. ;
  50. }
  51. }
  52. TR1=0;
  53. }
  54. void t0int() interrupt 1
  55. {
  56. TR0=0;
  57. speaker=!speaker;
  58. TH0=timer0h;
  59. TL0=timer0l;
  60. TR0=1;
  61. }
  62. void song()
  63. {
  64. TH0=timer0h;
  65. TL0=timer0l;
  66. TR0=1;
  67. delay(time);
  68. }
  69. void play()
  70. {
  71.         
  72.                 unsigned char k,i;
  73.         TMOD=1; //置CT0定時工作方式1
  74.         EA=1;
  75.         ET0=1;//IE=0x82 //CPU開中斷,CT0開中斷
  76.         while(1)
  77.         {  
  78.                 int a=0;
  79.                    i=0;
  80.            while(i<75){ //音樂數組長度 ,唱完從頭再來
  81.            k=sszymmh[i]+7*sszymmh[i+1]-1;
  82.            timer0h=FREQH[k];
  83.            timer0l=FREQL[k];
  84.            time=sszymmh[i+2];
  85.            i=i+3;
  86.                    song();}}}  

  87. /*******************************************************************************
  88. * 函 數 名         : delay
  89. * 函數功能                   : 延時函數,i=1時,大約延時10us
  90. *******************************************************************************/
  91. void delay1(u16 i)
  92. {
  93.         while(i--);        
  94. }

  95. /*******************************************************************************
  96. * 函數名         : Hc595SendByte(u8 dat)
  97. * 函數功能                   : 向74HC595發送一個字節的數據
  98. * 輸入           : 無
  99. * 輸出                  : 無
  100. *******************************************************************************/
  101. void Hc595SendByte(u8 dat)
  102. {
  103.         u8 a;
  104.         SRCLK=0;
  105.         RCLK=0;
  106.         for(a=0;a<8;a++)
  107.         {
  108.                 SER=dat>>7;
  109.                 dat<<=1;

  110.                 SRCLK=1;
  111.                 _nop_();
  112.                 _nop_();
  113.                 SRCLK=0;        
  114.         }

  115.         RCLK=1;
  116.         _nop_();
  117.         _nop_();
  118.         RCLK=0;
  119. }

  120. void deng()
  121. {

  122.                 while(1)
  123.                 {
  124.            for(n=0;n<8;n++)        //第一維下標取值范圍為祝、石、紅、梅、生、日、快、樂,7個字符
  125.             {for(m=0;m<200;m++)        //每個字符掃描顯示200次,控制每個字符顯示漢字
  126.                   {         w=0x01; //行初值
  127.                      for(j=0;j<9;j++) //第二維下標取值范圍為0~7,控制8行
  128.                           {Hc595SendByte(w); //行控制
  129.                            P0=~led[n][j]; //列控制,將指定數組元素取反后賦值給P0口,顯示碼
  130.                            delay1(60);
  131.                            w<<=1; //行變量左移指向下一行
  132.                            P0=0xff;
  133.                                                    }
  134.                                    }
  135.                      }}}
  136.                         
  137. void init()
  138. {
  139.     TMOD=0x01;
  140.         TL0=0;
  141.         TH0=0;
  142.         ET0=1;
  143.         EA=1;
  144.         TR0=1;
  145. }                                                         
  146. /*******************************************************************************
  147. * 函 數 名       : main
  148. * 函數功能                 : 主函數
  149. * 輸    入       : 無
  150. * 輸    出             : 無
  151. *******************************************************************************/
  152. void main()
  153. {
  154. init();
  155.    while(1)
  156.    {   
  157.    
  158.    deng();
  159.    }   
  160. }
  161. void time0() interrupt 3  
  162. {
  163. play();                                                                                                                                      
  164. }   
復制代碼
     
作者: wulin    時間: 2022-1-26 08:07
pingfunny 發表于 2022-1-25 19:59
我用的是STC 80C52,調試了好久,沒能實現,不知啥情況。這是我的代碼。

開兩個定時器中斷,一個控制點陣掃描和音樂節奏,另一個控制音樂頻率。具體的輸出內容由主函數調配。不要試圖一次調試成功。可以先顯示一個字符和播放一個音符。調通后再豐富內容就水到渠成了。

作者: wulin    時間: 2022-1-26 08:34
pingfunny 發表于 2022-1-25 19:59
我用的是STC 80C52,調試了好久,沒能實現,不知啥情況。這是我的代碼。

給你一個簡易電子琴的仿真示例,按這個構架把數碼管動態顯示改為點陣屏,鍵盤改為固定順序演奏。你的愿望就可以實現。 簡易電子琴.rar (89.27 KB, 下載次數: 7)




作者: lkc8210    時間: 2022-1-26 10:00
pingfunny 發表于 2022-1-25 19:59
我用的是STC 80C52,調試了好久,沒能實現,不知啥情況。這是我的代碼。

你只是把兩個程序復制粘貼在一起吧
主程序一個while(1)
定時中斷內又一個while(1)
還加上一個內含8000個循環的delay
能跑得起來才怪

想辦法把兩個while(1)合起來
想辦法用其他方法實現8000個循環的delay
就可以成功
作者: man1234567    時間: 2022-1-28 08:23
一邊點陣屏顯示生日快樂,一邊生日歌 同時進行 ? 求思路 ?
款點的做法是送蘋果手機,那個是可以一邊顯一邊歌甚至還可以動用3D,錢的事都不是事;
如果%%還想玩浪,就用手繪嘴唱,反正你也不會寫程序,編程思路對你沒什么用
作者: lkc8210    時間: 2022-1-28 14:14
手癢幫你弄了一個0.2倍速版


AT89C52.rar (1.04 KB, 下載次數: 18)





作者: lucheng77    時間: 2022-1-28 19:20
幾毛錢一個音樂芯片就可以解決的事情,何必大費周章呢?量產都沒必要去編這些程序吧?畢竟時間也是成本,雖然程序不是太難。
作者: fbn20050523    時間: 2022-1-28 22:40
你可以建立一個與點陣屏同大小的緩沖區,運用定時器以60hz進行刷屏。主程序只需改變這個緩沖區即可完成滾動,顯示文字的效果。音樂可以考慮MP3存入SD卡,去百度一個解碼庫,然后根據采樣頻率刷新dac,與刷屏共用定時器也可以。SD也可以建立緩沖區,類似環形但是新數據不能覆蓋未播放的老數據。main只需讀取SD卡即可。即保證了音樂不卡頓和刷屏的及時。




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