找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 2625|回復(fù): 1
收起左側(cè)

C8051F350單片機(jī)紅外語音系統(tǒng)源程序

[復(fù)制鏈接]
ID:352781 發(fā)表于 2021-2-2 17:23 | 顯示全部樓層 |閱讀模式
概述
智能紅外語音警示柱采用C8051單片機(jī)作為處理單元,集成了 MP3、WAV 的硬解碼數(shù)字語音功放,配合廣角度紅外傳感器,驅(qū)動(dòng)紅綠數(shù)碼管作為爆閃提醒。能聯(lián)動(dòng)信號(hào)控制系統(tǒng),實(shí)現(xiàn)一種與交通行人信號(hào)紅綠燈配套使用的聲響提示裝置,使行人橫穿馬路時(shí)更加注意安全,本產(chǎn)品紅外檢測(cè)靈敏,聲音指向性明確,外型美觀大方,安裝簡單。

特點(diǎn):
1、采用高增益大功率的音頻放大;
2、采用紅外數(shù)字脈沖探測(cè),感應(yīng)速度為50-700ms,警戒距離達(dá)30米,兩光束水平光軸范圍180度,上下光軸范圍20度。
3、采用不銹鋼材料通過特殊工藝處理,具有耐腐蝕、防水和防撞等功能;
4、同步紅綠燈信號(hào)顯示,強(qiáng)化行人過街視覺與聽覺雙重輔助提醒;
5、語音簡潔、動(dòng)聽,且音量大小可調(diào),夜間不會(huì)產(chǎn)生噪聲;
6、外形設(shè)計(jì)精致、時(shí)尚、美觀,提升城市交通品質(zhì)與檔次。

制作出來的實(shí)物圖如下:

紅外語音警示柱

紅外語音警示柱


單片機(jī)源程序如下:
  1. #include "include.h"
  2. #include "sw_uart.h"
  3. #include "hw_uart.h"
  4. #include "timer2.h"
  5. #include "api.h"

  6. pt pt_comm;

  7. void init_gpio()
  8. {
  9.     // P0.0  -  Skipped,     Open-Drain, Digital
  10.     // P0.1  -  Skipped,     Open-Drain, Digital
  11.     // P0.2  -  Skipped,     Open-Drain, Digital
  12.     // P0.3  -  Skipped,     Open-Drain, Digital
  13.     // P0.4  -  TX0 (UART0), Push-Pull,  Digital
  14.     // P0.5  -  RX0 (UART0), Open-Drain, Digital
  15.     // P0.6  -  Skipped,     Open-Drain, Digital
  16.     // P0.7  -  Skipped,     Open-Drain, Digital

  17.     // P1.0  -  Skipped,     Open-Drain, Digital
  18.     // P1.1  -  CEX0 (PCA),  Open-Drain, Digital
  19.     // P1.2  -  Unassigned,  Open-Drain, Digital
  20.     // P1.3  -  Unassigned,  Open-Drain, Digital
  21.     // P1.4  -  Unassigned,  Open-Drain, Digital
  22.     // P1.5  -  Unassigned,  Open-Drain, Digital
  23.     // P1.6  -  Unassigned,  Push-Pull,  Digital
  24.     // P1.7  -  Unassigned,  Push-Pull,  Digital
  25.     // P2.0  -  Unassigned,  Open-Drain, Digital
  26.     // P2.1  -  Unassigned,  Open-Drain, Digital
  27.     // P2.2  -  Unassigned,  Open-Drain, Digital
  28.     // P2.3  -  Unassigned,  Open-Drain, Digital

  29.     P0MDOUT   = 0x10;
  30.     P1MDOUT   = 0xC0;
  31.     P0SKIP    = 0xCF;
  32.     P1SKIP    = 0x01;
  33.     XBR0      = 0x01;
  34.     XBR1      = 0x41;
  35. }

  36. void init_sysclock()
  37. {
  38.     OSCICN    = 0x83;
  39. }

  40. void init_wtd(void)
  41. {
  42.         //        PCA0MD    &= ~0x40;        // 向WDTE寫‘0’,禁止WDT   
  43.         //        PCA0MD    = 0x00;        // PCA時(shí)鐘源選擇系統(tǒng)時(shí)鐘的12分頻   
  44.         //        PCA0CPL2  = 0xFF;        // 裝入WDT更新偏移值為64.2ms   
  45.         //        PCA0MD    |= 0x40;        // 向WDTE寫‘1’,使能WDT

  46.         // Calculate Watchdog Timer Timeout
  47.         // Offset calculated in PCA clocks
  48.         // Offset = ( 256 x PCA0CPL4 ) + 256 - PCA0L
  49.         //        = ( 256 x 255(0xFF)) + 256 - 0
  50.         // Time   = Offset * (12/SYSCLK)   
  51.         //        = 255 ms ( PCA uses SYSCLK/12 as its clock source)               
  52.         PCA0MD  &= 0xBF;                          // WDTE = 0 (clear watchdog timer enable)
  53. //        PCA0L    = 0x00;                       // Set lower byte of PCA counter to 0  
  54. //        PCA0H    = 0x00;                       // Set higher byte of PCA counter to 0
  55.         PCA0CPL4  = 0xFF;               // Write offset for the WDT
  56.         PCA0MD  |= 0x40;                       // Enable the WDT
  57. }

  58. void feed_wtd(void)
  59. {
  60.         //CCF2  = 0x00;                                // Write a 'dummy' value to the PCA0CPH4
  61.                                                                    // register to reset the watchdog timer
  62.                                                                    // timeout. If a delay longer than the
  63.                                                                    // watchdog timer delay occurs between
  64.                                                                    // successive writes to this register,
  65.                                                                 // the device will be reset by the watch
  66.                                                                 // dog timer.
  67.         PCA0CPH4 =0x00;  
  68. }

  69. unsigned char get_lamp_status(void)
  70. {
  71.         if(PIN_RED_LAMP==0) return 1;
  72.         else return 0;
  73. }


  74. u8  xdata gRxdBuffer[MAX_HDLC_BUF+2]={0};
  75. u8  xdata gTxdBuffer[MAX_HDLC_BUF+2]={0};

  76. u8  xdata cmd_buffer[MAX_HDLC_BUF]={0};
  77. u8  xdata ack_buffer[MAX_HDLC_BUF]={0};

  78. u8  xdata com_status=RE_SYNC;
  79. u16 xdata framesize=0;


  80. //查詢紅燈狀態(tài):                7E FF A0 C0 9F 7E
  81. //播放第1首01音量:        7E FF A0 C1 01 01 9E 7E
  82. //播放第1首30音量:        7E FF A0 C1 1E 01 81 7E
  83. //播放第2首30音量:        7E FF A0 C1 1E 02 82 7E
  84. //播放第3首30音量:        7E FF A0 C1 1E 03 83 7E

  85. void delay(unsigned short dly)
  86. {
  87.         timer timer_delay;
  88.         timer_set(&timer_delay,dly);
  89.         for(;;)
  90.         {
  91.                 feed_wtd();
  92.                 if(timer_expired(&timer_delay))
  93.                 {
  94.                         break;
  95.                 }
  96.         }
  97. }

  98. unsigned short thread_comm(pt *pt)
  99. {
  100.         u8 ch=0;
  101.         u8 vol=0;
  102.   u8 index=0;
  103.   static u8 red_lamp_status=0;
  104.   static u8 radar_status=0;
  105.         static u8 run=0;
  106.         run=PIN_COM=0;
  107.         PT_BEGIN(pt);
  108.         for(;;)
  109.         {
  110.         PT_YIELD(pt);
  111.         if(PIN_RED_LAMP!=red_lamp_status || PIN_RADAR!=radar_status)
  112.         {
  113.             radar_status = PIN_RADAR;
  114.             red_lamp_status = PIN_RED_LAMP;
  115.             
  116.             //設(shè)置音量
  117.             cmd_buffer[0]=0x7E;
  118.             cmd_buffer[1]=0x03;
  119.             cmd_buffer[2]=0x31;
  120.             cmd_buffer[3]=30;                                        //音量
  121.             cmd_buffer[4]=0xEF;
  122.             sw_uart_send_bytes(cmd_buffer,5);
  123.                                           
  124.             if(red_lamp_status==0)             //檢查 led signal
  125.             {
  126.                 if(radar_status!=0)            //檢查radar
  127.                 {                                                                        
  128.                                                                         
  129.                                                                         index=0x03;    //闖紅燈
  130.                                                                         
  131.                 }
  132.                 else  
  133.                 {   
  134.                                                                          delay(500); //延時(shí)500毫秒
  135.                                                                          index=0x01;    //紅燈
  136.                                                                    delay(4000);
  137.                 }               
  138.             }
  139.             else
  140.             {
  141.                                                           delay(2500);
  142.                                                           index = 0x02 ;        //綠燈  
  143.                                                          
  144.             }
  145.             //組織語音播放數(shù)據(jù)
  146.             cmd_buffer[0]=0x7E;
  147.             cmd_buffer[1]=0x04;
  148.             cmd_buffer[2]=0x41;
  149.             cmd_buffer[3]=0x00;
  150.             cmd_buffer[4]=index;                //編號(hào)
  151.             cmd_buffer[5]=0xEF;
  152.             sw_uart_send_bytes(cmd_buffer,6);  
  153.         }
  154.         }
  155.         PT_END(pt);
  156. }

  157. void main(void)
  158. {
  159.         init_sysclock();
  160.         init_gpio();
  161.         init_timer0();
  162.         init_hw_uart();
  163.         init_sw_uart();
  164.         init_wtd();
  165.         
  166.         PT_INIT(&pt_comm);
  167.         EA=1;
  168.         for(;;)
  169.         {
  170.                 thread_comm(&pt_comm);
  171.                 feed_wtd();
  172.         }
  173. }
復(fù)制代碼

所有程序51hei提供下載:
紅外語音系統(tǒng)程序源碼.zip (106.79 KB, 下載次數(shù): 30)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:1111745 發(fā)表于 2024-2-28 16:25 | 顯示全部樓層
您好,我想問一下用C8051F350制作高精度熱電偶數(shù)采集模塊該如何下手?請(qǐng)大佬給給思路
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表