找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1868|回复: 1
打印 上一主题 下一主题
收起左侧

C8051F350单片机红外语音系统源程序

[复制链接]
跳转到指定楼层
楼主
概述
智能红外语音警示柱采用C8051单片机作为处理单元,集成了 MP3、WAV 的硬解码数字语音功放,配合广角度红外传感器,驱动红绿数码管作为爆闪提醒。能联动信号控制系统,实现一种与交通行人信号红绿灯配套使用的声响提示装置,使行人横穿马路时更加注意安全,本产品红外检测灵敏,声音指向性明确,外型美观大方,安装简单。

特点:
1、采用高增益大功率的音频放大;
2、采用红外数字脉冲探测,感应速度为50-700ms,警戒距离达30米,两光束水平光轴范围180度,上下光轴范围20度。
3、采用不锈钢材料通过特殊工艺处理,具有耐腐蚀、防水和防撞等功能;
4、同步红绿灯信号显示,强化行人过街视觉与听觉双重辅助提醒;
5、语音简洁、动听,且音量大小可调,夜间不会产生噪声;
6、外形设计精致、时尚、美观,提升城市交通品质与档次。

制作出来的实物图如下:


单片机源程序如下:
  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时钟源选择系统时钟的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. //查询红灯状态:                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.             //设置音量
  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); //延时500毫秒
  135.                                                                          index=0x01;    //红灯
  136.                                                                    delay(4000);
  137.                 }               
  138.             }
  139.             else
  140.             {
  141.                                                           delay(2500);
  142.                                                           index = 0x02 ;        //绿灯  
  143.                                                          
  144.             }
  145.             //组织语音播放数据
  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;                //编号
  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. }
复制代码

所有程序51hei提供下载:
红外语音系统程序源码.zip (106.79 KB, 下载次数: 28)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1111745 发表于 2024-2-28 16:25 | 只看该作者
您好,我想问一下用C8051F350制作高精度热电偶数采集模块该如何下手?请大佬给给思路
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表