<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 軟硬結(jié)合——酷我音樂盒的逆天玩法

          軟硬結(jié)合——酷我音樂盒的逆天玩法

          作者: 時(shí)間:2017-01-18 來(lái)源:網(wǎng)絡(luò) 收藏

            1 /***********************************************************

          本文引用地址:http://www.ex-cimer.com/article/201701/343047.htm

            1 /***********************************************************************************************************/

            2 //HC-SR04 超聲波測(cè)距模塊應(yīng)用程序

            3 //MCU: STC89C52/STC89C51

            4 //晶振:11。0592

            5 //接線:模塊TRIG接 P1.2 ECH0 接P1.1

            6 //波特率9600

            7 /***********************************************************************************************************/

            8 #include

            9 #include

            10 #include

            11

            12 #define uchar unsigned char

            13 #define uint unsigned int

            14 #define RX P1_1

            15 #define TX P1_2

            16

            17

            18 unsigned int time=0;

            19 unsigned int timer=0;

            20 unsigned char S=0,a;

            21 bit flag =0,usart_flag;

            22

            23

            24 /*--------------------------------------------

            25 USAR初始函數(shù)包括所有需要的中斷和時(shí)鐘,超聲波時(shí)鐘也在內(nèi)]

            26 ---------------------------------------------*/

            27 void USRT_init()

            28 {

            29 TMOD=0x21; //設(shè)置T1定時(shí)器工作方式2,設(shè)T0為方式1,GATE=1;

            30 SCON=0x50;

            31 TH1=0xfd; //T1定時(shí)器裝初值

            32 TL1=0xfd;

            33 TH0=0; //超聲波測(cè)距計(jì)時(shí)器裝初始值

            34 TL0=0;

            35 TR1=1; //啟動(dòng)T1定時(shí)器

            36 TR0=1;

            37 REN=1; //允許中斷接收、

            38 ET0=1; //允許T0中斷

            39 SM0=0; //設(shè)定工作方式

            40 SM1=1;

            41 EA=1; //開總中斷

            42 ES=1; //開串口中斷

            43 }

            44 /*--------------------------------------------

            45 串口發(fā)送函數(shù)

            46 ---------------------------------------------*/

            47 void SeriPushSend(unsigned send_data)

            48 {

            49 SBUF=send_data;

            50 while(!TI);

            51 TI=0;

            52 }

            53 /*--------------------------------------------

            54 串口中斷程序

            55 ---------------------------------------------*/

            56 void ser()interrupt 4

            57 {

            58 RI=0;

            59 a=SBUF;

            60 usart_flag=1;

            61 }

            62 /*--------------------------------------------

            63 超聲波距離計(jì)算函數(shù)

            64 ---------------------------------------------*/

            65 void Conut(void)

            66 {

            67 time=TH0*256+TL0;

            68 TH0=0;

            69 TL0=0;

            70 S=(int)(time*1.87)/100; //算出來(lái)是CM

            71 if(flag==1 || S>30) //超出測(cè)量或無(wú)效數(shù)據(jù)

            72 {

            73 flag=0;

            74 SeriPushSend(0x88);

            75 }

            76 else

            77 {

            78 SeriPushSend(S);

            79 }

            80 }

            81 /*--------------------------------------------

            82 毫秒延時(shí)函數(shù)

            83 ---------------------------------------------*/

            84 void delayms(unsigned int ms)

            85 {

            86 unsigned char i=100,j;

            87 for(;ms;ms--)

            88 {

            89 while(--i)

            90 {

            91 j=10;

            92 while(--j);

            93 }

            94 }

            95 }

            96 /*--------------------------------------------

            97 超聲波測(cè)距中斷函數(shù)[計(jì)時(shí)用]

            98 ---------------------------------------------*/

            99 void zd0() interrupt 1 //T0中斷用來(lái)計(jì)數(shù)器溢出,超過(guò)測(cè)距范圍

            100 {

            101 flag=1; //中斷溢出標(biāo)志

            102 }

            103 /*--------------------------------------------

            104 超聲波測(cè)距啟動(dòng)函數(shù)

            105 ---------------------------------------------*/

            106 void StartModule() //T1中斷用來(lái)掃描數(shù)碼管和計(jì)800MS啟動(dòng)模塊

            107 {

            108 TX=1; //800MS 啟動(dòng)一次模塊

            109 _nop_();

            110 _nop_();

            111 _nop_();

            112 _nop_();

            113 _nop_();

            114 _nop_();

            115 _nop_();

            116 _nop_();

            117 _nop_();

            118 _nop_();

            119 _nop_();

            120 _nop_();

            121 _nop_();

            122 _nop_();

            123 _nop_();

            124 _nop_();

            125 _nop_();

            126 _nop_();

            127 _nop_();

            128 _nop_();

            129 _nop_();

            130 TX=0;

            131 }

            132 /*--------------------------------------------

            133 main函數(shù)

            134 ---------------------------------------------*/

            135 void main(void)

            136 {

            137 USRT_init();

            138 while(1)

            139 {

            140 StartModule();

            141 while(!RX); //當(dāng)RX為零時(shí)等待

            142 TR0=1; //開啟計(jì)數(shù)

            143 while(RX); //當(dāng)RX為1計(jì)數(shù)并等待

            144 TR0=0; //關(guān)閉計(jì)數(shù)

            145 Conut(); //計(jì)算

            146 delayms(10); //10MS

            147 }

            148 }

            >_<:下面將重點(diǎn)介紹如何從距離信息轉(zhuǎn)換為按鈕觸發(fā)消息的!

            6.1、檢測(cè)手勢(shì):

            下圖是當(dāng)有手進(jìn)入測(cè)距區(qū)時(shí)超聲波測(cè)距儀采集到的數(shù)據(jù),其中橫軸為時(shí)間,縱軸為距離單位厘米。從圖中可以看出當(dāng)沒有障礙物時(shí)距離維持在42CM處(這是我在示波器軟件中故意設(shè)置的一個(gè)閾值,硬件代碼里也設(shè)了閾值即:超出30cm就發(fā)送距離為0x88cm)。當(dāng)手揮進(jìn)對(duì)應(yīng)區(qū)域時(shí)出現(xiàn)一個(gè)下降沿,當(dāng)手離開時(shí)出現(xiàn)一個(gè)上升沿,當(dāng)手在區(qū)域中停留的時(shí)間越長(zhǎng)其對(duì)應(yīng)跨度越大。(圖中共有4個(gè)凹槽,表示手4次揮進(jìn)揮出區(qū)域,其中第3次停留時(shí)間較長(zhǎng))

              

           

            6.2、干擾信號(hào):

            如下圖(不要管上面的圖標(biāo),當(dāng)時(shí)用的時(shí)候沒修改圖表的單位和名稱,嘻嘻~)當(dāng)沒有手進(jìn)入?yún)^(qū)域時(shí)有時(shí)候硬件會(huì)出現(xiàn)干擾而產(chǎn)生一個(gè)很尖的下降和上升沿,其實(shí)這時(shí)并沒有手揮進(jìn)區(qū)域,這個(gè)干擾會(huì)對(duì)結(jié)果造成影響,甚至出現(xiàn)錯(cuò)誤的控制!!!

              

           

            6.3、去除干擾:

            如下圖最下面的窗口是距離-時(shí)間圖,其中第1、2、4為手揮進(jìn)測(cè)距區(qū),第3個(gè)是一次干擾。我是這樣轉(zhuǎn)換的:將距離-時(shí)間圖轉(zhuǎn)換為左上角的時(shí)長(zhǎng)-時(shí)間圖,每個(gè)波的峰值就是對(duì)應(yīng)距離時(shí)間圖中跳變時(shí)間,這樣我們就能將每次手進(jìn)入或者是干擾持續(xù)的時(shí)間的值獲得!(由于干擾幾乎都是瞬間跳變,所以濾掉那個(gè)最小的第3個(gè)時(shí)長(zhǎng)-時(shí)間波峰對(duì)應(yīng)的距離-時(shí)間圖中的跳變就行啦)

              

           

            6.4、時(shí)長(zhǎng)分段產(chǎn)生將控制信號(hào)signal:

            這里將遮蔽時(shí)長(zhǎng)進(jìn)行分段產(chǎn)生3種不同的控制信號(hào):[參見5.1.2串口數(shù)據(jù)接收函數(shù)的第21~27行](這里num就是時(shí)長(zhǎng),可見:當(dāng)時(shí)長(zhǎng)為2~5時(shí)產(chǎn)生signal為1的信號(hào),參看Timer部分可以發(fā)現(xiàn)這個(gè)信號(hào)控制點(diǎn)擊下一曲;當(dāng)時(shí)長(zhǎng)在6~9的時(shí)候觸發(fā)上一曲;當(dāng)時(shí)長(zhǎng)在10以上觸發(fā)暫停)因?yàn)槲医?jīng)常要下一曲所以設(shè)成手一揮就執(zhí)行,暫停一般操作較少就讓它時(shí)長(zhǎng)長(zhǎng)一點(diǎn)(就像筆記本電腦的關(guān)機(jī)按鈕!),加入上一曲是為了防止失誤時(shí)能回到上面一個(gè)。!!!注意到這里沒有把時(shí)長(zhǎng)為1的包含在內(nèi),這就是上面分析的結(jié)果,即所謂的濾波!消除干擾~

            1 if (num > 1 && num < 6){

            2 signal = 1;

            3 }else if (num > 5 && num < 10){

            4 signal = 2;

            5 }else if (num > 9){

            6 signal = 3;

            7 }

              

           

            7、總結(jié):

            哈哈,終于寫完啦!>_<:快天亮啦~其實(shí)我本來(lái)想用腦電波來(lái)控制的,但是現(xiàn)在手頭有點(diǎn)吃緊,買不起腦電波呀~只能又一次玩廉價(jià)消費(fèi)品啦~不過(guò)想一下連揮一揮手都不用的操作,是不是酷炫極啦!


          上一頁(yè) 1 2 3 下一頁(yè)

          關(guān)鍵詞: C# 串口

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();