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

標題: 51單片機聲控+語音播報的小風扇制作 [打印本頁]

作者: ws1336    時間: 2018-1-30 21:33
標題: 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)



作者: mamahuhu121    時間: 2018-1-31 17:44
聲音處理部分有學問
作者: ws1336    時間: 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. }
復制代碼

作者: 飛翔的大娃    時間: 2018-2-3 11:20
挺好的
作者: qjzyx    時間: 2018-2-3 13:23
很好的!謝謝分享
作者: kkk123123123    時間: 2018-4-4 09:10
樓主,下載了密碼是多少呢
作者: 389056325    時間: 2018-5-7 19:01
很好的!謝謝分享
作者: 嘿嘿修修    時間: 2018-5-8 10:05
不錯哦,希望有用
作者: meilidianzhi    時間: 2018-5-15 08:37
很有創意啊
作者: onemore    時間: 2018-7-5 11:29
語音加播報功能很不錯的創新
作者: QYH4523    時間: 2018-9-21 09:02
很給力
作者: 1336787356    時間: 2018-9-29 15:32
給力fight!
作者: ws1336    時間: 2018-11-24 20:44
kkk123123123 發表于 2018-4-4 09:10
樓主,下載了密碼是多少呢

沒密碼啊
作者: XiNanShan    時間: 2019-2-26 16:59
語音識別功能怎么實現的
作者: 鐵憨憨    時間: 2019-3-20 09:20
不錯哦,支持
作者: longxiuchun    時間: 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
怎么處理

作者: 遷就    時間: 2019-4-29 09:36
謝謝分享
作者: rsx9583    時間: 2019-4-29 12:07
還沒有玩過音頻啊!這個值得學習
作者: ws1336    時間: 2019-5-1 12:08
longxiuchun 發表于 2019-4-28 18:54
聲音處理部分代碼,純C語言,在電腦上編譯生成一個.exe可執行程序后,將音頻文件復制到與.exe同級目錄下, ...

我是用的codeblocks,mingw編譯器
作者: ws1336    時間: 2019-5-1 12:10
XiNanShan 發表于 2019-2-26 16:59
語音識別功能怎么實現的

沒有語音識別的功能,其實是拍手聲音控制的
作者: ealoo    時間: 2019-5-4 18:11
聲音那里是用什么程序轉換的呢
作者: qq1762350851    時間: 2019-8-1 00:08
還沒有玩過音頻啊!這個值得學習
作者: 13370353201    時間: 2019-11-5 15:34
ws1336 發表于 2019-5-1 12:10
沒有語音識別的功能,其實是拍手聲音控制的

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




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲欧美日韩国产综合 | 天天操天天插天天干 | 久久婷婷香蕉热狠狠综合 | 国产视频福利一区 | 国产精品久久久久久久久久了 | 久久9视频 | 午夜精品久久久久久久星辰影院 | 久久综合九九 | 99亚洲国产精品 | 国产高清一二三区 | 亚洲久久一区 | 午夜小影院 | 久久久久国产 | 国产精品视频网站 | 毛片免费视频 | 亚洲电影在线播放 | 国产精品美女久久久 | 在线日韩不卡 | 国产精品国产馆在线真实露脸 | 精品国产乱码久久久久久闺蜜 | 欧美一级视频免费看 | 中文字幕一区二区三区在线乱码 | 国产在线精品一区二区三区 | 欧美一区二区三区的 | 日韩中文在线视频 | 一区二区国产精品 | 成人av看片 | 精品欧美一区免费观看α√ | 天天摸天天干 | 欧美淫 | 国产精品亚洲精品日韩已方 | 最新国产视频 | av在线一区二区三区 | 亚洲精品4 | 毛片大全 | 色伊人网 | 欧美色综合 | 日本不卡高清视频 | 欧美伦理一区 | 亚洲狠狠爱 | 久久久视频在线 |