久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 22915|回復: 22
打印 上一主題 下一主題
收起左側

51單片機聲控+語音播報的小風扇制作

  [復制鏈接]
跳轉到指定樓層
樓主
這是一個能控制轉速的風扇,我這個風扇特色功能(學校課程,為了加分)就是聲音控制,語音提醒。機械結構是3D打印的。使用單片機芯片為STC12C5A60S2,音頻DAC為TDA1543A(這個不太會用,這個項目中還有些問題,要仔細調調電位器才能發出正常聲音),功放為LM386,咪頭的放大器用的LM358。至于大家最關心的喇叭怎么說話的問題:聲音數是通過電腦端用文本轉語音軟件生成的,是一個.wav文件,然后編個小程序把聲音數據轉換成數組,然后把這個數組掐頭去尾只留中間(去除掉無用數據,51單片機儲存實在小),再復制到單片機代碼里的(由于弄個文件系統也很麻煩,而且速度很慢,所以就這樣搞了)。具體原理(大神勿噴)是以一定的時間間隔(一般是8KHz)把數組中的數據通過DAC轉換成電壓信號輸送給功放芯片,在經過功放芯片送給喇叭,這樣由于變化的電壓使喇叭震動,發出聲音。
下面附上原理圖,照片,代碼和工程文件。請多多指教。

實物圖


原理圖

程序說明:
............................................................
版本號Beta0.0
本驅動工具包主要包含以下驅動(xxx.c文件和xxx.h文件共同使用,下面不再寫后綴)
1“define.h”----包含了類型定義與開發板屬性的設置(如晶振頻率等)
2“delay”----定義了兩個延時函數,支持STC大多數芯片(除15H系列..)
【提示】本函數庫中驅動多數依賴于"delay.c""delay.h"和"define.h"文件
3“digital_display”----數碼管顯示驅動(硬件是基于兩個373鎖存器分別用作段數據和位數據)
4“digital_to_string”----包含了浮點數轉換成字符串的函數
5“DS18B20”----溫度傳感器驅動
6“DS1302”----時鐘芯片驅動
7“I2C”----軟件模擬I2C總線驅動
8“Keyboard”----矩陣鍵盤驅動
9“LCD_1602_display”----1602液晶屏驅動(并口)
10“LCD_12864_display”----12864液晶屏驅動(并口帶中文字庫)(只是顯示文字,不包含畫圖)
11“NEC_IR_coding”----用一個紅外LED實現紅外編碼發射的驅動
12“NEC_IR_decoding”----紅外解碼驅動
13“NRF24L01”----2.4G無線通訊模塊驅動
14“Uart”----串口驅動相關函數   
未完待續...
............................................................
............................................................
版本號Beta0.1
修復了數碼管有關殘影的bug
取消了矩陣鍵盤的松手檢測,以檢測不到鍵按下時返回0代替
未完待續...
............................................................
............................................................
版本號Beta0.2
加入了獨立按鍵的檢測,兼容矩陣按鍵,修復了矩陣鍵盤關于不同開發板兼容性的bug
增加了串口不同波特率的初始化程序
未完待續...
............................................................
............................................................
版本號Beta0.3
調整了數碼管顯示驅動的結構代碼,方便不同開發板移植
未完待續...
............................................................

main.c
  1. #include "define.h"
  2. #include "delay.h"
  3. #include "mic.h"
  4. #include "play.h"
  5. #include "motor.h"
  6. #include "led.h"
  7. #include "sfkj.h"
  8. #include "zstz.h"
  9. u8 mode = 0; //速度級別
  10. void change_mode()
  11. {
  12.         static u8 i=0,j=0;     //計時變量約為8ms
  13.          if(mic_flag==2)
  14.                 {
  15.                          i++;
  16.                         if(i>10&&mic_flag==2)
  17.                         {
  18.                         //開機確認
  19.                                 if(mode==0)
  20.                                 {
  21.                                         Play_music(PCM8sfkj,sizeof(PCM8sfkj));
  22.                                         j=50;
  23.                                         mic_flag=0;
  24.                                         while(j--)
  25.                                         {
  26.                                                 delay_ms(100);
  27.                                                 if(mic_flag==2)
  28.                                                 {
  29.                                                         Play_music(PCM8zstz,sizeof(PCM8zstz));
  30.                                                         mode=1;
  31.                                                         mic_flag=0;
  32.                                                         break;
  33.                                                 }               
  34.                                         }
  35.                                 }
  36.                                 else if(mode==1)      
  37.                                 {      
  38.                                         mode=2;
  39.                                 }
  40.                                 else if(mode==2)      
  41.                                 {
  42.                                         Play_music(PCM8zstz,sizeof(PCM8zstz));                                       
  43.                                         mode=1;
  44.                                 }      
  45.                                 mic_flag=0;
  46.                                 i=0;
  47.                         }
  48.                 }
  49.                 else if(mic_flag==3)
  50.                 {
  51.                          i++;
  52.                         if(i>15&&mic_flag==3)
  53.                         {
  54.                           mode=0;
  55.                                 mic_flag=0;
  56.                                 i=0;
  57.                         }
  58.                 }
  59. }
  60. void change_PWM()
  61. {
  62.                 if(mode==0)
  63.                 {
  64.                         PCA_PWM0 = 0x03;
  65.                         CCAP0H = CCAP0L = 0xff;
  66.                 }
  67.                 else if(mode==1)
  68.                 {
  69.                         PCA_PWM0 = 0x00;
  70.                         CCAP0H = CCAP0L = CCAP0L-1;
  71.                 }
  72.                 else if(mode==2)
  73.                 {
  74.                         PCA_PWM0 = 0x00;
  75.                         CCAP0H = CCAP0L = CCAP0L;
  76.                 }
  77. }
  78. void main()
  79. {
  80.   Timer1Init();
  81.         IT0Init();
  82.         PWMInit();
  83.         Play_init();
  84.         delay_ms(1000);
  85.         while(1)
  86.         {
  87.                 change_mode();
  88.                     change_PWM();
  89.                 Digital_Display_One(CCAP0L/16);
  90.                 delay_ms(50);
  91.         }
  92.   
  93. }
  94. DELAY.c
  95. #include"DELAY.h"
  96. void delay_ms(uint ms)  
  97. {      
  98.          unsigned char i, j;
  99.         do
  100.         {                    
  101.                 i = TIME_I;
  102.                 j = TIME_J;
  103.                 do
  104.                 {
  105.                         while (--j);
  106.                 } while (--i);      
  107.         }while(--ms);
  108. }
  109. #if Machine_Cycle==12UL
  110. void delay5us()                //@12.000MHz
  111. {
  112.         _nop_();
  113. }
  114. #elif Machine_Cycle==2UL
  115. void delay5us()                //@12.000MHz
  116. {
  117.         unsigned char i;
  118.         i = 12;
  119.         while (--i);
  120. }
  121. #endif
  122. led.c
  123. #include "led.h"
  124. #define  Digital_Data P2
  125. code unsigned char leddata[]={
  126.                 0xB7,  //"0"
  127.                 0x06,  //"1"
  128.                 0x73,  //"2"
  129.                 0x57,  //"3"
  130.                 0xC6,  //"4"
  131.                 0xD5,  //"5"
  132.                 0xF5,  //"6"
  133.                 0x07,  //"7"
  134.                 0xF7,  //"8"
  135.                 0xD7,  //"9"
  136.                                                                 0xE7,  //"A"
  137.                 0xF4,  //"B"
  138.                 0xB1,  //"C"
  139.                 0x76,  //"D"
  140.                 0xF1,  //"E"
  141.                 0xE1,  //"F"
  142.                 0x00,  //熄滅
  143.                 0x00  //自定義
  144.                          };
  145. //函數名:Digital_Display_One
  146. //功能:                顯示單個數碼管
  147. //參數:                Digit:要顯示的數字
  148. //                                pos:  要顯示的位置
  149. //注意:                不同開發板只需要改寫此函數,本文件其他數碼管驅動即可使用
  150. void  Digital_Display_One(u8 Digit)
  151. {
  152.                 Digital_Data = leddata[Digit];
  153. }
  154. mic.c
  155. #include "mic.h"
  156. void IT0Init(void)                //100微秒@11.0592MHz
  157. {
  158.         IT0=1;
  159.         EX0=1;
  160.         EA=1;
  161. }
  162. void Timer1Init(void)                //50毫秒@11.0592MHz
  163. {
  164.         AUXR &= 0xBF;                //定時器時鐘12T模式
  165.         TMOD &= 0x0F;                //設置定時器模式
  166.         TMOD |= 0x10;                //設置定時器模式
  167.         TL1 = 0x66;                //設置定時初值
  168.         TH1 = 0xFC;                //設置定時初值
  169.         TF1 = 0;                //清除TF1標志
  170.         TR1 = 1;                //定時器1開始計時
  171.         EA = 1;
  172.         ET1 = 1;
  173. }     
  174. u32 times=0;
  175. void T1INT() interrupt 3
  176. {
  177.         TL1 = 0x66;                //設置定時初值
  178.         TH1 = 0xFC;                //設置定時初值
  179.         times++;
  180. }
  181. u8 mic_flag=0;
  182. void EX0INT(void)  interrupt 0
  183. {  
  184.         static u32 last_time=0;
  185.         u32 differ;
  186.         differ=times-last_time;
  187.         last_time=times;
  188.         if(differ>1000)
  189.         {
  190.                 mic_flag=1;
  191.         }
  192.         else if(mic_flag>0&&differ>100&&differ<500)
  193.         {
  194.                  mic_flag++;
  195.         }
  196. }
  197. motor.c
  198. #include "motor.h"
  199. void PWMInit()
  200. {      
  201.         CCON = 0;                       //清除PCA控制寄存器
  202.                                  
  203.         CL = 0;                         //復位PCA定時器計數值
  204.         CH = 0;
  205.         CMOD=0x0a;                                                                                        //工作模式:頻率=Sysclk/4/256=10800Hz 無中斷
  206.       
  207.         CCAP0H = CCAP0L = 0xff;         //PWM0設置占空比50%
  208.         PCA_PWM0 = 0x03;
  209.         CCAPM0 = 0x42;                  //PCA模塊0 工作在8比特方式 無中斷
  210.         CR = 1;                         //PCA定時器運行
  211. }
  212. play.c
  213. #include "play.h"
  214. sbit I2SDATA=P1^4;
  215. sbit I2SWS = P1^5;
  216. sbit I2SBCK = P1^6;
  217. void I2S_Send(u8 dat)
  218. {
  219.         u8 i;
  220.         u8 t;               
  221.   I2SDATA=0;
  222.         for(i=0;i<8;i++)
  223.         {
  224.                 I2SBCK=1;
  225.                 I2SBCK=0;
  226.         }
  227.         t=dat;
  228.         for(i=0;i<8;i++)
  229.         {
  230.                 t=t<<1;
  231.                 I2SDATA=CY;
  232.                 I2SBCK=1;
  233.                 I2SBCK=0;
  234.         }
  235.         I2SWS=~I2SWS;
  236.         I2SBCK=1;
  237.         I2SBCK=0;
  238.       
  239. }
  240. void Play_init()
  241. {
  242.         I2S_Send(0x80);
  243.         I2S_Send(0x80);
  244.         I2S_Send(0x80);
  245.         I2S_Send(0x80);
  246. }
  247. void Play_music(u8 *Music,u16 sz)
  248. {
  249.         u16 i=0,j=0;
  250.         u8 flag=0;
  251.         for(i=0;i<sz;i++)
  252.         {
  253.                 I2S_Send(Music);      
  254.                 I2S_Send(0);
  255.         }                       
  256. }
  257. 音頻數據
  258. code const u8 PCM8sfkj[]={
  259. 0x80,0x7e,0x80,0x86,0x7c,0x7a,0x81,0x7c,
  260. 0x80,0x87,0x7a,0x7c,0x87,0x7d,0x7a,0x86,
  261. 0x81,0x78,0x81,0x85,0x7c,0x7d,0x85,0x82,
  262. 0x7c,0x7c,0x82,0x81,0x7f,0x83,0x7e,0x7f,
  263. 0x80,0x7a,0x81,0x84,0x7f,0x7e,0x7e,0x80,
  264. };

  265. //只是一部分.........太長了...省略...可以去工程中看
復制代碼


所有資料51hei提供下載:
我的風扇.rar (169.62 KB, 下載次數: 177)


評分

參與人數 4黑幣 +115 收起 理由
jinmei1314 + 5 很給力!
凳子 + 5 絕世好帖!
qjzyx + 5 贊一個!
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏22 分享淘帖 頂3 踩
回復

使用道具 舉報

沙發
ID:276118 發表于 2018-1-31 17:44 | 只看該作者
聲音處理部分有學問
回復

使用道具 舉報

板凳
ID:280994 發表于 2018-2-2 23:03 | 只看該作者
聲音處理部分代碼,純C語言,在電腦上編譯生成一個.exe可執行程序后,將音頻文件復制到與.exe同級目錄下,運行軟件,輸入音頻文件名,回車
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. #include "Music2.h"
  5. int main()
  6. {
  7.     FILE *fpwav,*fp;
  8.     int i=0,j=0,f;
  9.     int size=0;
  10.     short temp=0;
  11.     unsigned short u8data;
  12.     char s[30],cmd[30];
  13.     printf("Please input xx.wav\n");
  14.     scanf("%s",s);
  15.     if((fp=fopen("PCM8.h","w+"))==NULL)
  16.     {
  17.         printf("Can't Creat File\n");
  18.         system("pause");
  19.         exit(0);
  20.     }
  21.     if((fpwav=fopen(s,"rb"))==NULL)
  22.     {
  23.         printf("Can't Open %s\n",s);
  24.         system("pause");
  25.         exit(0);
  26.     }
  27.     fseek(fpwav,0x2a,0);
  28.     fread(&size,sizeof(int),1,fpwav);
  29.     printf("SIZE:%d\n",size);
  30.     printf("Wait process of %s......\n",s);
  31.     fseek(fpwav,0x2e,0);
  32.     rewind(fp);
  33.     fprintf(fp,"const u8 PCM8[]={\n");
  34.     for(i=1;i<=size/sizeof(short);i++)
  35.     {
  36.         for(j=0;j<8;j++)
  37.         {
  38.             f=fread(&temp,sizeof(short),1,fpwav);
  39.             u8data=temp*2+32768;
  40.             u8data=u8data/256;
  41.             fprintf(fp,"0x%x,",u8data);
  42.         }
  43.         fprintf(fp,"\n");
  44.     }
  45.     fprintf(fp,"\n};");
  46.     fclose(fp);
  47.     fclose(fpwav);
  48.     sprintf(cmd,"notepad.exe PCM8.h");
  49.     system(cmd);
  50.     system("pause");
  51.     return 0;
  52. }
復制代碼
回復

使用道具 舉報

地板
ID:280568 發表于 2018-2-3 11:20 | 只看該作者
挺好的
回復

使用道具 舉報

5#
ID:266116 發表于 2018-2-3 13:23 | 只看該作者
很好的!謝謝分享
回復

使用道具 舉報

6#
ID:301192 發表于 2018-4-4 09:10 來自手機 | 只看該作者
樓主,下載了密碼是多少呢
回復

使用道具 舉報

7#
ID:245836 發表于 2018-5-7 19:01 | 只看該作者
很好的!謝謝分享
回復

使用道具 舉報

8#
ID:324807 發表于 2018-5-8 10:05 | 只看該作者
不錯哦,希望有用
回復

使用道具 舉報

9#
ID:48413 發表于 2018-5-15 08:37 | 只看該作者
很有創意啊
回復

使用道具 舉報

10#
ID:215044 發表于 2018-7-5 11:29 | 只看該作者
語音加播報功能很不錯的創新
回復

使用道具 舉報

11#
ID:400844 發表于 2018-9-21 09:02 | 只看該作者
很給力
回復

使用道具 舉報

12#
ID:404066 發表于 2018-9-29 15:32 | 只看該作者
給力fight!
回復

使用道具 舉報

13#
ID:280994 發表于 2018-11-24 20:44 | 只看該作者
kkk123123123 發表于 2018-4-4 09:10
樓主,下載了密碼是多少呢

沒密碼啊
回復

使用道具 舉報

14#
ID:474972 發表于 2019-2-26 16:59 來自手機 | 只看該作者
語音識別功能怎么實現的
回復

使用道具 舉報

15#
ID:489701 發表于 2019-3-20 09:20 | 只看該作者
不錯哦,支持
回復

使用道具 舉報

16#
ID:63646 發表于 2019-4-28 18:54 | 只看該作者
聲音處理部分代碼,純C語言,在電腦上編譯生成一個.exe可執行程序后,將音頻文件復制到與.exe同級目錄下,運行軟件,輸入音頻文件名,回車
vc6.0編譯出現提示錯誤

21222.cpp(4) : fatal error C1083: Cannot open include file: 'Music2.h': No such file or directory
怎么處理
回復

使用道具 舉報

17#
ID:484435 發表于 2019-4-29 09:36 | 只看該作者
謝謝分享
回復

使用道具 舉報

18#
ID:468878 發表于 2019-4-29 12:07 | 只看該作者
還沒有玩過音頻啊!這個值得學習
回復

使用道具 舉報

19#
ID:280994 發表于 2019-5-1 12:08 | 只看該作者
longxiuchun 發表于 2019-4-28 18:54
聲音處理部分代碼,純C語言,在電腦上編譯生成一個.exe可執行程序后,將音頻文件復制到與.exe同級目錄下, ...

我是用的codeblocks,mingw編譯器
回復

使用道具 舉報

20#
ID:280994 發表于 2019-5-1 12:10 | 只看該作者
XiNanShan 發表于 2019-2-26 16:59
語音識別功能怎么實現的

沒有語音識別的功能,其實是拍手聲音控制的
回復

使用道具 舉報

21#
ID:517235 發表于 2019-5-4 18:11 | 只看該作者
聲音那里是用什么程序轉換的呢
回復

使用道具 舉報

22#
ID:552708 發表于 2019-8-1 00:08 | 只看該作者
還沒有玩過音頻啊!這個值得學習
回復

使用道具 舉報

23#
ID:636039 發表于 2019-11-5 15:34 | 只看該作者
ws1336 發表于 2019-5-1 12:10
沒有語音識別的功能,其實是拍手聲音控制的

是不是 拍手頻率越快  ,轉速越快了 ??
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美成年人网站 | 中文字幕高清视频 | 丁香综合 | 五月天天色 | 九九激情视频 | 亚洲精品久久久蜜桃 | 99精品免费久久久久久久久日本 | 91在线中文字幕 | 国产一区二区美女 | 中文字幕乱码一区二区三区 | 欧美日韩国产综合在线 | 欧美精品一区二区三区在线 | 久久久久久免费毛片精品 | 亚洲成人第一页 | 精品国产一区久久 | 国产精品久久久久久久久久久久 | 欧美一级片久久 | 天天精品在线 | 自拍偷拍欧美 | 亚洲一区二区三区桃乃木香奈 | 成人国产精品久久 | 六月色婷 | 狠狠的干狠狠的操 | 男女污污动态图 | 免费一级做a爰片久久毛片潮喷 | 欧美一级三级在线观看 | 一区二区三区四区在线视频 | 日本精品一区二区在线观看 | 亚洲精品久久嫩草网站秘色 | 五月槐花香 | 日韩精品极品视频在线观看免费 | 精品国产亚洲一区二区三区大结局 | 爱草在线 | 国产成都精品91一区二区三 | 天久久| 日韩中文字幕视频在线 | 日韩国产精品一区二区三区 | 中文字幕一区在线观看视频 | 亚洲a视频 | 在线观看欧美日韩视频 | 99精品久久久久久 |