fzr_7 发表于 2013-12-19 11:41:51

自製手機儀表測試方享

本帖最後由 fzr_7 於 2013-12-19 12:02 編輯

先說明此文章只分享如何用8051傳資料給手機和手機如何接收8051傳的資料
其他像是8051如何抓取機車的各項數據請參考我發過的自製表裡的電路和程式
把那些數據傳給另1顆8051後用那顆8051接藍牙傳給手機
你要直接用原始的8051也可以,記得保留P3.0和P3.1

全部只剩電路還沒焊接,之前做的雙LCD液晶的電路無法共用
手機程式方面還可以加強一下藍牙的處理

藍牙模組就網拍最便宜的就好,8051記得買+5V動作的,不要買到+3.3V的
藍牙AT指令和設定請跟賣家要或是網路找一下有PDF檔,我就是自己找PDF,如何使用請GOOGLE會比我仔細

NnErouZOhY8
HD畫質,本來想說用FULL HD,想一想算了
開始圖片是誰一看就知,應該沒看到大奶就認不出吧:lol

我的棒球偶像,我們家都是猿的球迷居多


家裡手機裡面的怪照片,被打馬賽克看不出來是誰,被程式找出來貼上
因為手機不是我的,我的TWM A5粉色還在等, 知道的不要炮我,這邊不是政治文


8051接藍牙的電路很簡單,就RX和TX兩條線而已,GOOGLE或看書就會

8051的組合語言程式,很簡單的增加數據來傳給手機做測試用,自己看一下書就會傳機車的資料前先傳個數據來判斷下一個數據是機車的什麼資料
鮑率記得跟藍牙模組用一樣的,不用太快,除非你需要


      ORG      00H
      JMP      START
START:
      MOV      P0,#0FFH                ;ND輸入
      MOV      P1,#0FFH                ;NR、NN輸入
      MOV      P2,#0FFH                ;NS輸入
      MOV      P3,#00000011B             ; P3.0和P3.1要用來接藍牙的TX和RX
      MOV      31H,#8                        ;轉速8~245,傳後要+10
      MOV      32H,#7                        ;檔位0~7
      MOV      33H,#0                        ;時速0~149
      MOV      34H,#0                        ;里程150~159
      MOV      35H,#0                        ;油溫0=0度,99=99度
      MOV      36H,#0                        ;汽油量+100,100=0,120=10.0
      MOV      37H,#0                        ;電壓+121,121=LOW,122=10.0v
                                                         ;132=11.0v,167=14.5v,168=HI
      MOV      R0,#0
      MOV      TMOD,#00100000B
      ANL      PCON,#01111111B
      MOV      TH1,#244                ;鮑率2.4K最低
      MOV      TL1,#244
      SETB      TR1
      MOV      SCON,#01010000B
START0:
      MOV      A,SBUF
      JNB      RI,$
      CLR      RI
      CALL      DELAY
      CJNE      A,#100,START0                ;100是手機傳給8051一個開始接收訊號
START1:
      MOV      SBUF,#255                ;油溫 傳送一個數據約3.3ms 有7組14個0.052
      JNB      TI,[      DISCUZ_CODE_262      ]nbsp;                     ;傳送1組數據+DELAY約106.6ms
      CLR      TI
      CALL      DELAY
      MOV      A,35H
      MOV      SBUF,A
      JNB      TI,$
      CLR      TI
      CALL      DELAY
      INC      35H
      MOV      A,35H
      CJNE      A,#100,STA5
      MOV      35H,#0
STA5:
      MOV      SBUF,#254                ;汽油量
      JNB      TI,$
      CLR      TI
      CALL      DELAY
      MOV      A,36H
      MOV      SBUF,A
      JNB      TI,$
      CLR      TI
      CALL      DELAY
      INC      36H
      MOV      A,36H
      CJNE      A,#21,STA6
      MOV      36H,#0
STA6:
      MOV      SBUF,#253                ;電壓
      JNB      TI,$
      CLR      TI
      CALL      DELAY
      MOV      A,37H
      MOV      SBUF,A
      JNB      TI,$
      CLR      TI
      CALL      DELAY
      INC      37H
      MOV      A,37H
      CJNE      A,#48,STA7
      MOV      37H,#0
STA7:
      MOV      SBUF,#252                ;轉速
      JNB      TI,$
      CLR      TI
      CALL      DELAY
      MOV      A,31H
      MOV      SBUF,A
      JNB      TI,$
      CLR      TI
      CALL      DELAY
      MOV      A,31H
      ADD      A,R1
      MOV      31H,A
      CJNE      A,#246,STA01
STA01:
      JC      STA1
      MOV      31H,#8
STA1:
      MOV      SBUF,#251                ;檔位
      JNB      TI,$
      CLR      TI
      CALL      DELAY
      MOV      A,32H
      MOV      SBUF,A
      JNB      TI,$
      CLR      TI
      CALL      DELAY
      INC      32H
      MOV      A,32H
      CJNE      A,#8,STA2
      MOV      32H,#0
STA2:
      MOV      SBUF,#250                ;時速
      JNB      TI,$
      CLR      TI
      CALL      DELAY
      MOV      A,33H
      MOV      SBUF,A
      JNB      TI,$
      CLR      TI
      CALL      DELAY
      MOV      A,33H
      ADD      A,R0
      MOV      33H,A
      CJNE      A,#150,STA02
STA02:
      JC      STA3
      MOV      33H,#0
STA3:
      MOV      SBUF,#249                ;里程
      JNB      TI,$
      CLR      TI
      CALL      DELAY
      MOV      A,34H
      MOV      SBUF,A
      JNB      TI,$
      CLR      TI
      CALL      DELAY
      INC      34H
      MOV      A,34H
      CJNE      A,#10,STA4
      MOV      34H,#0
STA4:
      INC      R0
      CJNE      R0,#10,STA15
      MOV      R0,#0
STA15:
      INC      R1
      CJNE      R1,#100,STA16
      MOV      R1,#0
STA16:
      JMP      START1
DELAY:      MOV      R7,#1                ;延遲0.05秒
DEL1:      MOV      R6,#249
DEL2:      MOV      R5,#100
DEL3:      DJNZ      R5,DEL3
      DJNZ      R6,DEL2
      DJNZ      R7,DEL1
      RET
      END


沒有分享出手機的完整程式,因為每個人的8051抓機車數據不一樣,
傳給手機又不一樣,給了也沒用
以下藍牙程式取自http://fgchentech.blogspot.tw/2012/11/android.html
我把他改成1次抓2個BYTE後去判斷是傳機車的什麼數據
其他像layout和AndroidManifest.xml裡面要放的藍牙資料請自己處理
<font style="background-color: rgb(255, 255, 255);">import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Handler;
import android.view.View;
import android.widget.TextView;
import android.widget.EditText;
import android.widget.Button;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Set;
import java.util.UUID;
public class MainActivity extends Activity {
    TextView myLabel;
    EditText myTextbox;
    BluetoothAdapter mBluetoothAdapter;
    BluetoothSocket mmSocket;
    BluetoothDevice mmDevice;
    OutputStream mmOutputStream;
    InputStream mmInputStream;
    Thread workerThread;
    byte[] readBuffer;
    int readBufferPosition;
    int counter;
    volatile boolean stopWorker;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button openButton = (Button)findViewById(R.id.open);
Button sendButton = (Button)findViewById(R.id.send);
Button closeButton = (Button)findViewById(R.id.close);
myLabel = (TextView)findViewById(R.id.label);
myTextbox = (EditText)findViewById(R.id.entry);
//Open Button
openButton.setOnClickListener(new View.OnClickListener()
{
   public void onClick(View v)
   {
    try
    {
   findBT(); //搜尋藍芽裝置
   openBT(); //開啟藍芽裝置(連線)
    }
    catch (IOException ex) { }
             }
         });
         //Send Button
         sendButton.setOnClickListener(new View.OnClickListener()
         {
             public void onClick(View v)
             {
               try
               {
                     sendData();
               }
               catch (IOException ex) { }
             }
         });
         //Close button
         closeButton.setOnClickListener(new View.OnClickListener()
         {
             public void onClick(View v)
             {
               try
               {
                     closeBT(); //關閉藍芽裝置
               }
               catch (IOException ex) { }
             }
         });
}
    void findBT()
   {
      mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
      if(mBluetoothAdapter == null)
      {
            myLabel.setText("No bluetooth adapter available");
      }
      if(!mBluetoothAdapter.isEnabled())
      {
            Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBluetooth, 0);
      }
      Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
      if(pairedDevices.size() > 0)
      {
            for(BluetoothDevice device : pairedDevices)
            {
                if(device.getName().equals("KILL"))//KILL是我自己設的藍牙的名稱
                {
                  mmDevice = device;
                  break;
                }
            }
      }
      myLabel.setText(mmDevice.getName() + " found");
    }
    void openBT() throws IOException
    {
      UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); //Standard SerialPortService ID
      mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);      
      mmSocket.connect();
      mmOutputStream = mmSocket.getOutputStream();
      mmInputStream = mmSocket.getInputStream();
      beginListenForData(); //開始傾聽藍芽裝置的資料
      myLabel.setText(mmDevice.getName() + " Opened");
    }
    void beginListenForData()
    {
      final Handler handler = new Handler();
      final byte delimiter = 10; //This is the ASCII code for a newline character
      stopWorker = false;
      readBufferPosition = 0;
      readBuffer = new byte;
      workerThread = new Thread(new Runnable() //建立一條新執行緒進入傾聽來自藍芽裝置資料輸入程序
      {
            public void run()
            {               
               while(!Thread.currentThread().isInterrupted() && !stopWorker)
               {
                   try
                  {
            int bytesAvailable = mmInputStream.available();                        
                        if(bytesAvailable > 1)
                        {
                            byte[] packetBytes = new byte;//我改成1次讀2個BYTE就好
                            mmInputStream.read(packetBytes);
                                    int da1=packetBytes&0xff;
                                    final String da11=Integer.toString(da1);
                                    da1=packetBytes&0xff;
                                    final String da12=Integer.toString(da1);
                                    handler.post(new Runnable()
                                    {
                                        public void run()
                                        {
                                       myLabel.append("\r\n" + da11+","+da12);
                                        }
                                 });
                        }
                  }
                  catch (IOException ex)
                  {
                        stopWorker = true;
                  }
               }
            }
      });
      workerThread.start();
    }
    void sendData() throws IOException
    {
      String msg = myTextbox.getText().toString();
      msg += "\n";
      mmOutputStream.write(msg.getBytes());
      myLabel.setText("Data Sent");
    }
    void closeBT() throws IOException
    {
      stopWorker = true;
      mmOutputStream.close();
      mmInputStream.close();
      mmSocket.close();
      myLabel.setText("Bluetooth Closed");
    }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}</font>
最後有問題沒給你回覆請直接pm我,喇塞文太多偶爾會漏掉
android程式有問題請不要問我,我從沒用過到做出來才不到半個月,時間也沒有超過100小時
大多參考別人的範例然後修改成自己想要的,有些指令會用但是意思沒有去深入了解

完全版要過年後了,有機會會錄個上車實測上來分享

shenliow 发表于 2013-12-19 12:26:53

Good,最近剛好碼表線斷了,也想自己搞一套數位儀表出來。個人目前看上Arduino跟Raspberry Pi,不過苦無時間啊。

fox 发表于 2013-12-19 19:22:46

使用干將的麵包板,嗯...有歷史的好物~

xingtian0512 发表于 2013-12-19 23:02:13

靠腰

完全看不懂{:5_148:}

btfman 发表于 2013-12-22 14:43:13

太專業啦~我的老天啊~~~~

页: [1]
查看完整版本: 自製手機儀表測試方享