久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

SLH89F5162單片機的藍牙控制小車程序+PCB設計

[復制鏈接]
跳轉到指定樓層
樓主
  主控芯片為深聯華SLH89F5162,開發環境為Keil 4;測距方式為超聲波回聲測距,使用模塊HC-SR04完成;通訊方式為藍牙2.0,車體使用HC-05藍牙串口模塊,PC使用自帶藍牙適配器;總電源使用2節3500mAh/3.7V的UltraFire鋰離子充電電池串聯供電;MCU電源則由LM7805穩壓芯片對7.4V總電源進行處理后供給;車體驅動電機使用2個減速比為1:48的6~9V直流有刷電機,驅動使用TOSHIBA-ULN2003APG芯片;

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


單片機源程序如下:
  1. #include "SLH89F5162.h"
  2. #include "system.h"
  3. #include "car.h"
  4. #include "hc05_slh.h"
  5. #include "command.h"
  6. #include "ds18b20.h"
  7. #include "usart.h"

  8. /*超聲波模塊*/
  9. #define MAXTIME  65535 //最大計時時間
  10. #define TICKTIME 55295//一次中斷5ms 11.0592 1T
  11. #define ECHOF P0_1
  12. #define FRONT P3_6

  13. /*PWM模塊*/

  14. /*全局變量*/
  15. extern u8 totalengine;
  16. DataSet mydata;//距離+溫度數據
  17. static u8 car_order;
  18. u8 buf[3];//串口1輸入緩存
  19. static u16 SoundSpeed=331;//聲速 單位m/s
  20. static u8 rangeflag=0,timecnt=0; //距離標志位

  21. /*獲取前方的距離*/
  22. void GetFrtDist()
  23. {
  24.         SoundSpeed=331+(u16)(0.61*mydata.temp.temp_f);//更新聲速

  25.         FRONT=1;delay_us(30);FRONT=0;
  26.         while(ECHOF==0)//等待高電平到來
  27.         {
  28.                 TH0=(65535-MAXTIME)/256;
  29.                 TL0=(65535-MAXTIME)%256;
  30.                 TR0=1;
  31.                 if(timecnt==1) {timecnt=0;mydata.dist[2]=255;return;}        //超時設置為255
  32.         }
  33.         TR0=0;
  34.         TH0=(65535-MAXTIME)/256;
  35.         TL0=(65535-MAXTIME)%256;
  36.         TR0=1;
  37.         while(ECHOF==1);TR0=0;//直到高電平結束停止計數        
  38.         if(rangeflag==1) {mydata.dist[2]=255;rangeflag=0;}
  39.         else mydata.dist[2]=(u8)(SoundSpeed*(65535L*timecnt+TH0*256+TL0+MAXTIME-65535)/11/10000)/2;//單位厘米
  40.         

  41. }


  42. void main()
  43. {
  44.         /*系統引腳設置*/
  45.         EA=1;//打開所有中斷

  46.         /*初始化藍牙波特率9600*/
  47.         HC05_Init(96);
  48.         /*定時器T0中斷設置*/
  49.         TMOD=0;
  50.         TMOD|=0x01;                   //設T0為方式1,GATE=0,用于測距
  51.         TH0=(65535-MAXTIME)/256;
  52.         TL0=(65535-MAXTIME)%256;
  53.         IPL0=0;IPH0=0;
  54.         ET0=1;//T0允許中斷

  55.         /*定時器T2中斷設置*/
  56.         T2MOD=0x00;                   //設T2引腳為普通方式,遞增計數,用于小車轉彎,優先級次高
  57.         T2CON=0;
  58.         TH2=(65535-TICKTIME/5)/256;
  59.         TL2=(65535-TICKTIME/5)%256;
  60.         RCAP2H=(65535-TICKTIME/5)/256;
  61.         RCAP2L=(65535-TICKTIME/5)%256;//重載值 每次重載1ms
  62.         ET2=1;//T1允許中斷        中斷服務程序在system.c中
  63.         /*PWM設置 使用PWM0:P4.6 PWM1:P2.7*/
  64.         PWM0CON=0;
  65.         PWM0CON|=0x31;//打開PWM0引腳功能 16分頻 BIT4_5控制分頻系數
  66.         PWM0P=0xff;//256×時鐘周期 12MHZ 16分頻 對應于12khz/16=750hz
  67.         PWM0D=0;
  68.         PWM1CON=0;
  69.         PWM1CON|=0x31;//打開PWM1引腳功能
  70.         PWM1P=0xff;
  71.         PWM1D=0;

  72.         
  73.         /*初始化后部距離數據為0*/
  74.         mydata.dist[0]=0;
  75.         mydata.dist[1]=0;
  76.         mydata.dist[2]=0;
  77.         mydata.dist[3]=0;
  78.         

  79.     DS18B20_GetData(&mydata);//僅在開機時啟動18B20一次獲取溫度
  80.         delay_ms(200);
  81.         delay_ms(200);
  82.         DS18B20_GetData(&mydata);//必須讀2次才能讀到正確值
  83.         if(mydata.temp.temp_f>40.0||mydata.temp.temp_f<-20.0) mydata.temp.temp_f=15.0;

  84.         while(1)
  85.         {
  86.                 /*溫度信息*/
  87.                 DS18B20_GetData(&mydata);
  88.                 if(mydata.temp.temp_f>40.0||mydata.temp.temp_f<-20.0) mydata.temp.temp_f=15.0;                                                
  89.                
  90.                 /*避障信息*/
  91.                 GetFrtDist();
  92.                 if(mydata.dist[2]<=50&&car_order==GOAHEAD)
  93.                 {
  94.                         Car_Stop();
  95.                         car_order=STOP;        
  96.                 }
  97.                 else
  98.                 {
  99.                         Car_Move(car_order);
  100.                         if(car_order==GOAHEAD) delay_ms(100);
  101.                         else {delay_ms(25);car_order=STOP;}
  102.                 }
  103.                
  104.                 /*發送距離溫度和位移方式*/
  105.                 Send_Data(mydata);
  106.                 Send_Stat(car_order);
  107.                                                         
  108.         }
  109.         
  110. }

  111. void T0_Interrupt() interrupt 1
  112. {
  113.         TH0=(65535-MAXTIME)/256;
  114.         TL0=(65535-MAXTIME)%256;
  115.         timecnt++;
  116.         if(timecnt==2) {timecnt=0;rangeflag=1;TR0=0;}//超時啦
  117.         
  118. }




  119. void Process_Input(u8 recdata)
  120. {
  121.         static u8 read_cnt=0;//需要讀取的字節數
  122.         static u8 flag=0;//1為stat 2為data 3為mode


  123.         if(read_cnt==0 && recdata<=0x80) return;//丟棄首次無效數據
  124.         else if(read_cnt==0 && recdata>0x80 && recdata<0x8f)//read_cnt為0 收到有效起始字節
  125.         {
  126.                 read_cnt=recdata&0x0f; //記錄要讀取的字節數
  127.                 switch(recdata)//設置要讀取的字節類型
  128.                 {
  129.                         case STAT:
  130.                                    flag=1;break;
  131.                         case MODE:
  132.                                    flag=3;break;
  133.                 }               
  134.         }
  135.         else if(read_cnt>0)//read_cnt不為0 正在接收數據
  136.         {
  137.                 /*根據flag值判斷讀取字節的類型*/
  138.                 if(flag==1)//stat
  139.                 {
  140.                         switch(recdata)
  141.                         {
  142.                                 case START:
  143.                                            car_order=START;break;
  144.                                 case GOAHEAD:
  145.                                            car_order=GOAHEAD;break;
  146.                                 case GORIGHT:
  147.                                            car_order=GORIGHT;break;
  148.                                 case GOLEFT:
  149.                                            car_order=GOLEFT;break;
  150.                                 case ACCEL:
  151.                                            totalengine=(totalengine>=0xff-0x20)?0xf0:(totalengine+0x20);break;
  152.                                 case SLOWD:
  153.                                            totalengine=(totalengine<=0x4f+0x20)?0xbf:(totalengine-0x20);break;
  154.                                 case STOP:
  155.                                            car_order=STOP;break;
  156.                                 default:
  157.                                                 flag=0;read_cnt=0;return;//如果第二個字節錯誤則清除所有標志位
  158.                         }
  159.                         read_cnt--;
  160.                         flag=(read_cnt==0)?0:flag;
  161.                 }
  162.                
  163.         }
  164. }
  165. //usart1中斷服務程序
  166. //只處理接收數據
  167. void EUSART1_Interrupt() interrupt 9
  168. {        
  169.         u8 recdata=0;//串口1數據
  170.         recdata=SBUF1;
  171.         //EUSART1_SendByte(recdata);
  172.         Process_Input(recdata);        
  173.         RI1=0;
  174. ……………………

  175. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
01 基于安芯一號SLH89F5162的藍牙控制小車.zip (4.26 MB, 下載次數: 14)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:510402 發表于 2019-4-12 12:40 | 只看該作者
這個厲害了
回復

使用道具 舉報

板凳
ID:510402 發表于 2019-4-12 12:59 | 只看該作者
學習了
回復

使用道具 舉報

地板
ID:510402 發表于 2019-4-12 13:10 | 只看該作者
本帖最后由 cc05142 于 2019-4-12 16:28 編輯

感謝樓主分享,樓主有成品嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕视频在线 | 国内成人免费视频 | 欧美jizzhd精品欧美巨大免费 | 欧美成人h版在线观看 | 精品久久精品 | 日韩免费视频一区二区 | 久久久91 | 操射视频| 国产高清一区二区 | 国产美女视频黄 | 在线观看黄视频 | 国产精品久久精品 | 中文字幕免费视频 | 欧美日韩高清免费 | 国产一区二区三区在线看 | 国产人成精品一区二区三 | 日韩av免费看 | 欧美日韩视频在线 | 久久国产精品亚洲 | 亚洲综合无码一区二区 | 国产丝袜人妖cd露出 | 日本在线你懂的 | 日韩电影中文字幕 | 亚洲电影一区二区三区 | 亚洲精品久久久 | 亚洲午夜精品在线观看 | 免费在线观看av网站 | 免费黄色的网站 | 久久不射电影网 | 操操日| 99精品国产在热久久 | 国产精品综合色区在线观看 | 午夜免费观看 | 亚洲电影专区 | av中文字幕在线播放 | 国产区在线视频 | 欧美另类视频在线 | 国产精品亚洲欧美日韩一区在线 | 日韩欧美字幕 | 91免费入口| 精品一区二区三区在线播放 |