欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2690|回復: 0
打印 上一主題 下一主題
收起左側

基于stc51單片機的廣告牌程序+PCB原理圖文件

[復制鏈接]
跳轉到指定樓層
樓主
基于stc51的廣告牌,語音播報,超聲波檢查到人停了,變回電機轉動
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


單片機源程序如下:
  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, 下載次數: 22)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表