找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1961|回复: 0
收起左侧

基于stc51单片机的广告牌程序+PCB原理图文件

[复制链接]
ID:235531 发表于 2020-1-8 19:23 | 显示全部楼层 |阅读模式
基于stc51的广告牌,语音播报,超声波检查到人停了,变回电机转动
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
51hei.png 51hei.png

单片机源程序如下:
  1. #include <reg51.h>
  2. #include <stdio.h>
  3. #include <intrins.h>

  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define MotorData P0      //步进电机控制接口定义,使用P0的0123

  7. uchar phasecw[4] ={0x08,0x04,0x02,0x01};//正转 电机导通相序 D-C-B-A
  8. uchar phaseccw[4]={0x01,0x02,0x04,0x08};//反转 电机导通相序 A-B-C-D
  9. /**************超声波相关参数定义******************************/
  10. unsigned int  time=0;
  11. unsigned int  timer=0;
  12. float S=0;        //超声波距离
  13. float a;
  14. bit  flag =0; //标志位
  15. sbit  RX = P1^1;
  16. sbit  TX = P1^2;
  17. uchar nBkm = 0x00;

  18. /***************语音模块相关参数定义******************************/
  19. #define HEADLEN       5  //数据包头的长度
  20. #define BKM_OFFSET    4  //背景音乐命令偏移
  21. #define LEN_OFFSET    2  //长度字节的偏移量(一般不会超过255字节,因此只使用1字节长度)
  22. #define BKM_MAX      15         //背景音乐数量

  23. //数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
  24. uchar head[HEADLEN] = {0xfd,0x00,0x00,0x01,0x00};


  25. //延时
  26. void Delay(uint n)
  27. {
  28.     uchar i=112;

  29.         while(n--)
  30.         {
  31.                 while(i--);
  32.         }
  33. }

  34. /******************以下为语音模块相关代码***************************************/

  35. void delayms(unsigned int ms)
  36. {
  37.         unsigned char i=100,j;
  38.         for(;ms;ms--)
  39.         {
  40.                 while(--i)
  41.                 {
  42.                         j=10;
  43.                         while(--j);
  44.                 }
  45.         }
  46. }

  47. //串口初始化,波特率为9600bps。
  48. void UART_Init(void)
  49. {
  50.         SCON=0xD8 ;   
  51.         TMOD=0x20 ;
  52.         PCON=0x00 ;          
  53.         TH1 = 0xFD;         //晶振为11.059MHZ时,设定串口波特率为9600bit/s,方式3  
  54.         TR1=1;       
  55.         TMOD=0x21;                   //设T0为方式1,GATE=1;
  56.         SCON=0x50;
  57.         TH1=0xFD;
  58.         TL1=0xFD;
  59.         TH0=0;
  60.         TL0=0;
  61.         TR0=1;  
  62.         ET0=1;             //允许T0中断
  63.         TR1=1;                           //开启定时器
  64.         TI=1;
  65.         EA=1;                           //开启总中断
  66. }

  67. //串口发送数据
  68. void SendChar(uchar n)
  69. {
  70.         SBUF = n;
  71.         while (TI==0);//发送数据
  72.         TI=0;
  73. }                               

  74. //背景音乐(参数为0表示关闭背景音乐)
  75. void BkMusic(uchar num)
  76. {
  77.         num %= BKM_MAX + 1;
  78.         nBkm = num;
  79. }

  80. //发声程序
  81. void Speech(uchar *buf)
  82. {
  83.         uchar i = 0;          //循环计数变量
  84.         uchar xor = 0x00;     //校验码初始化
  85.         uchar ch = 0x00;
  86.     uchar len = 0x00;

  87.     while(buf[len++]);

  88.         //发送数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
  89.         for(i = 0; i < HEADLEN; i++)
  90.         {
  91.                 if(i == BKM_OFFSET)
  92.                         ch = nBkm << 3; //写入背景音乐
  93.                 else if(i == LEN_OFFSET)
  94.                         ch = len + 3;
  95.                 else
  96.                         ch = head[i];

  97.                 xor ^= ch;
  98.                 SendChar(ch);
  99.                 Delay(1);
  100.            }

  101.         //发送文字内容
  102.         for(i = 0; i < len; i++)
  103.         {
  104.                 xor ^= buf[i];
  105.                 SendChar(buf[i]);
  106.                 Delay(1);
  107.         }

  108.         SendChar(xor);         //发送校验位

  109.         Delay(50);
  110.         //while(BUSY);         //等待合成结束
  111.         Delay(50);

  112. }
  113. /*************超声波测距代码**********************/
  114. void  StartModule()                          //启动模块
  115.   {
  116.           TX=1;                                         //800MS  启动一次模块
  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.           _nop_();
  131.           _nop_();
  132.           _nop_();
  133.           _nop_();
  134.           _nop_();
  135.           _nop_();
  136.           _nop_();
  137.           _nop_();
  138.           TX=0;
  139.   }

  140. float Conut(void)
  141. {
  142.          time=TH0*256+TL0;
  143.          TH0=0;
  144.          TL0=0;
  145.          S=(time*1.87)/100;     //算出来是CM
  146.          if(flag==1)                    //超出测量
  147.          {
  148.           flag=0;
  149.          }
  150.          return S;

  151. }

  152. /****************以下为步进电机代码*********************************/
  153. void Delay_xms(uint x)
  154. {
  155. uint i,j;
  156. for(i=0;i<x;i++)
  157.   for(j=0;j<112;j++);
  158. }
  159. //顺时针转动
  160. void MotorCW(void)
  161. {
  162. uchar i;
  163. for(i=0;i<4;i++)
  164.   {
  165.    MotorData=phasecw[i];
  166.    Delay_xms(4);//转速调节
  167.   }
  168. }
  169. //逆时针转动
  170. void MotorCCW(void)
  171. {
  172. uchar i;
  173. for(i=0;i<4;i++)
  174.   {
  175.    MotorData=phaseccw[i];
  176.    Delay_xms(4);//转速调节
  177.   }
  178. }
  179. //停止转动
  180. void MotorStop(void)
  181. {
  182. MotorData=0x00;
  183. }

  184. //主函数
  185. void main()
  186. {
  187.         uint i;       
  188.         uchar nBkm = 0x01;  //演示背景音乐编号
  189.         UART_Init();        //初始化串口为 9600bps          
  190.         BkMusic(1);         //关闭背景音乐
  191.         Delay(3000);
  192.         Speech("初始化完成"); //系统初始化
  193.         while(1)
  194.         {
  195.          StartModule();                //启动超声波
  196.          while(!RX);                //当RX为零时等待
  197.          TR0=1;                            //开启计数
  198.          while(RX);                        //当RX为1计数并等待
  199.          TR0=0;                                //关闭计数
  200.      a=Conut();                        //计算
  201.          if(a<=150.0)                //判断是否有人靠近
  202.          {
  203.                  Speech("检测到行人");
  204.                  delayms(300);         //延时
  205.                 StartModule();         //再次启动检测
  206.                  while(!RX);                //当RX为零时等待
  207.                  TR0=1;                            //开启计数
  208.                  while(RX);                        //当RX为1计数并等待
  209.                  TR0=0;                                //关闭计数
  210.              a=Conut();                        //计算
  211.                 if(a<=150.0)                //若行人停留
  212.                 {
  213.                  Speech("开始播放广告");          //开始播放广告
  214.                  for(i=0;i<500;i++)                 //步进电机转动
  215.                   {
  216.                    MotorCW();   //顺时针转动
  217.                   }
  218.                   MotorStop();  //停止转动
  219.                   Delay_xms(500);

  220.                 }
  221.          }       
  222.         delayms(100);                //100MS               
  223.         }
  224.          
  225. }
复制代码

所有资料51hei提供下载:
代码PCB设计资料.rar (3.07 MB, 下载次数: 20)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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