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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1760|回復: 4
收起左側

大佬幫忙看一下單片機程序,藍牙小車不能加上超聲波避障的功能

[復制鏈接]
ID:967138 發表于 2021-9-19 18:25 來自手機 | 顯示全部樓層 |閱讀模式
//芯片為stc89c52.有三個定時器T0T1T2
T0分給了超聲波測距使用,T1給舵機的pwm調速使用,t2定時器給藍牙使用。
自動避障代碼單獨調試的時候可以正常運行
t2藍牙小車單獨使用的時候也同上
我把兩者合到一塊(將自動避障的主函數改成了一個我自己命名的函數,藍牙小車的哪一塊正常為主函數,將這個我自己命名的函數放在藍牙的stwich函數的case之中)就發生了故障,故障一般有兩種情況,。都不能正常運行,要么就是舵機不能動了,要么就是藍牙沒用了,小車在自己動。
//超聲波自動避障的獨立代碼模塊
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit in1=P1^0;//in1,in2控制左電機
sbit in2=P1^1;
sbit in3=P1^2;//in3,in4控制右電機
sbit in4=P1^3;
sbit Echo=P2^1;        //超聲波的ECHO口,發射一個超聲波
sbit Trig=P2^2;        //超聲波的TRIG口,接受返回超聲波
sbit duoji=P2^0;//舵機信號口
uint zbjl,qmjl,ybjl;//左邊距離,前面距離,右邊距離
int S,i;//測算距離
uint shijian,time,jishu;
int csbceju()//超聲波測距                        
  {        TH0=0x00;//初始化定時器
    TL0=0x00;
          S=0;  //初始化
           Trig=0;
                Echo=0;
                _nop_();//延遲1us
    Trig=1;//給Trig 10us的高電平脈沖信號
                for( i=0;i<12;i++)
                {
          _nop_();
                }//12us
                Trig=0;//觸發超聲波
    while(!Echo);            //等待高電平
    TR0=1;                //開啟計數
    while(Echo);            //等待低電平
    TR0=0;                //關閉計數
    time=TH0*256+TL0;//通過超聲波往返的時間計算距離 距離=往返時間*1.7
    S=(time*1.7)/100;//計算cm      
                Echo=0;
    TH0=0x00;
    TL0=0x00;
                return S;//返回一個最終結果
  }
void yanchi(uchar s)
{
uint i;
for(;s>0;s--)
  for(i=500;i>0;i--);
}
void djhs()interrupt 3//舵機的pwm調速,t1中斷
{
   TH1=0xff; // 0.1ms
   TL1=0x9c; //65536-100
   jishu++;
        if(jishu<=shijian){ duoji = 1; }
        else { duoji = 0; }
        if (jishu>= 200){jishu = 0; }
}
void main()//自動避障模塊
{TMOD=0x11;                   //設T0為方式1,T1方式為1
        TH0=0x00;//t0初始化
        TL0=0x00;         
  TH1=0xff;            
        TL1=0x9c;
        ET0=1;
  ET1=1;
  TR0=1;           //允許T0中斷
        EA=1;        
        while(1){
             shijian=14;//舵機旋轉至81°
      jishu=0;
      yanchi(100);
     TR1=1;
     yanchi(100);
     TR1=0;
    qmjl=csbceju();//獲得一個正前方的距離
     shijian=5;//舵機旋轉至0°
      jishu=0;
      yanchi(100);
                   TR1=1;
    yanchi(200);
     TR1=0;
    ybjl=csbceju();//獲得一個右邊的距離
    shijian=20;//舵機旋轉至135°
      jishu=0;
      yanchi(100);
                   TR1=1;
     yanchi(200);
     TR1=0;
    zbjl=csbceju();//獲得一個左邊的距離
if(qmjl>40&&ybjl<qmjl)
{
in1=0;in2=1;in3=0;in4=1;//前進
yanchi(50);//前進一段時間停止
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl>40&&zbjl<qmjl)
{
in1=0;in2=1;in3=0;in4=1;
yanchi(50);
in1=0;in2=0;in3=0;in4=0;
}
else if(zbjl>40&&ybjl<zbjl)
{
in1=1;in2=1;in3=1;in4=0; //左轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(zbjl>40&&qmjl<zbjl)
{
in1=1;in2=1;in3=1;in4=0; //左轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(ybjl>40&&ybjl>qmjl)
{
in1=1;in2=0;in3=1;in4=1;//右轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(ybjl>40&&ybjl>zbjl)
{
in1=1;in2=0;in3=1;in4=1;//右轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl>30&&ybjl<qmjl)
{
in1=0;in2=1;in3=0;in4=1;//前進
yanchi(50);//前進一段時間停止
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl>30&&zbjl<qmjl)
{
in1=0;in2=1;in3=0;in4=1;
yanchi(50);
in1=0;in2=0;in3=0;in4=0;
}
else if(zbjl>30&&ybjl<zbjl)
{
in1=1;in2=1;in3=1;in4=0; //左轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(zbjl>30&&qmjl<zbjl)
{
in1=1;in2=1;in3=1;in4=0; //左轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(ybjl>30&&ybjl>qmjl)
{
in1=1;in2=0;in3=1;in4=1;//右轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(ybjl>30&&ybjl>zbjl)
{
in1=1;in2=0;in3=1;in4=1;//右轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl<30&&ybjl<10&&zbjl<10)
{
in1=1;in2=0;in3=1;in4=0;//后退
yanchi(100);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl<10&&ybjl<30&&zbjl<10)
{
in1=1;in2=0;in3=1;in4=0;//后退
yanchi(100);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl<10&&ybjl<10&&zbjl<30)
{
in1=1;in2=0;in3=1;in4=0;//后退
yanchi(100);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl>20&&ybjl<qmjl)
{
in1=0;in2=1;in3=0;in4=1;//前進
yanchi(50);//前進一段時間停止
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl>20&&zbjl<qmjl)
{
in1=0;in2=1;in3=0;in4=1;
yanchi(50);
in1=0;in2=0;in3=0;in4=0;
}
else if(zbjl>20&&ybjl<zbjl)
{
in1=1;in2=1;in3=1;in4=0; //左轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(zbjl>20&&qmjl<zbjl)
{
in1=1;in2=1;in3=1;in4=0; //左轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(ybjl>20&&ybjl>qmjl)
{
in1=1;in2=0;in3=1;in4=1;//右轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(ybjl>20&&ybjl>zbjl)
{
in1=1;in2=0;in3=1;in4=1;//右轉
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl<20&&ybjl<10&&zbjl<10)
{
in1=1;in2=0;in3=1;in4=0;//后退
yanchi(100);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl<10&&ybjl<20&&zbjl<10)
{
in1=1;in2=0;in3=1;in4=0;//后退
yanchi(100);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl<10&&ybjl<10&&zbjl<20)
{
in1=1;in2=0;in3=1;in4=0;//后退
yanchi(100);
in1=0;in2=0;in3=0;in4=0;//停止
}
}
  }
//t2定時器藍牙小車
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar tmp;
sfr T2MOD=0xc9;
sbit in1=P1^0;//in1,in2控制左電機
sbit in2=P1^1;
sbit in3=P1^2;//in3,in4控制右電機
sbit in4=P1^3;
void init()
{
ES=0;
T2MOD=0x01;//工作方式1
T2CON=0X30;//接收發送模式
TH2=0xFD;//初值,比特率9600
TL2=0xDC;
RCAP2H=0xFF;
RCAP2L=0xDC;
SCON=0x50;
PCON=0x00;
TR2=1;//開啟T2
ET2=1;
PCON &= 0x7f;
TI=0;
RI=0;
PS=1;//設置藍牙為最高優先級
EA=1;//開總中斷
ES=1;//開串口中斷
}
//藍牙小車
void main()
{

init();
  while(1)
          {         
                  if(RI==1)                     // 是否有數據到來
                  {
                   RI = 0;
                  tmp = SBUF;                   // 暫存接收到的數據
                                  switch(tmp)
                                  {
                                  case '1':in1=1;in2=0;in3=1;in4=0;break;        //后退                                
                                        case '2':in1=0;in2=1;in3=0;in4=1; break;//前進
                                        case '3':in1=1;in2=1;in3=1;in4=0; break;//左轉
                                        case '4':in1=1;in2=0;in3=1;in4=1; break;//右轉
                                        case '0':in1=0;in2=0;in3=0;in4=0;break;//停止

                                  }
                                  }      
          }
}
回復

使用道具 舉報

ID:967138 發表于 2021-9-20 09:28 來自手機 | 顯示全部樓層
謝謝大佬們
回復

使用道具 舉報

ID:624769 發表于 2021-9-20 00:18 | 顯示全部樓層
T2CON=0X30;//接收發送模式       你選了,T2做串口的波特率
ET2=1;       你這里又開 T2 中斷??  差不多8年沒用 89C52了,但是印象當中記得,T2作了波特率發生器,只能開 ES, 一開ET2 就會死。
另外,你T2 的中斷函數也沒看到。ES 的中斷函數也沒看到, 所以也不好判斷。
回復

使用道具 舉報

ID:57657 發表于 2021-9-19 21:30 | 顯示全部樓層
串口中斷打開了,中斷入口函數 interrupt 4 哪里去了?
回復

使用道具 舉報

ID:967138 發表于 2021-9-19 19:33 來自手機 | 顯示全部樓層
沒人嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲欧美视频在线观看 | 97色在线观看免费视频 | 91视频进入 | 中文字幕在线视频免费观看 | 国产一区二区小视频 | 免费黄色录像片 | 人人射人人草 | 亚洲顶级毛片 | 亚洲精品在线免费观看视频 | 久久久久久国产精品免费免费狐狸 | 日韩毛片免费看 | 欧美亚洲高清 | 91国内精精品久久久久久婷婷 | 日韩中文字幕 | 成年男女免费视频网站 | 精品国产乱码久久久久久丨区2区 | 国产高清在线精品一区二区三区 | 中文字幕在线观看国产 | 二区三区视频 | www.亚洲精品 | 欧美在线视频一区二区 | 久久av网| 久久久久国产一区二区三区 | 色小姐综合网 | 91av在线视频观看 | 亚洲av一级毛片 | 成人不卡 | 中文字幕一区二区三区不卡 | 91亚洲一区 | 欧美日韩福利视频 | 成人午夜性成交 | 国产黄色一级片 | 久久久久国产精品一区 | 欧美日韩久久精品 | 国产精品视频免费观看 | 亚洲aⅴ| 国产福利在线 | 91精品国产91久久久久久 | 三级在线免费 | 亚洲视频第一页 | 亚洲成人av一区二区 |