自製手機儀表測試方享
本帖最後由 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小時
大多參考別人的範例然後修改成自己想要的,有些指令會用但是意思沒有去深入了解
完全版要過年後了,有機會會錄個上車實測上來分享
Good,最近剛好碼表線斷了,也想自己搞一套數位儀表出來。個人目前看上Arduino跟Raspberry Pi,不過苦無時間啊。 使用干將的麵包板,嗯...有歷史的好物~ 靠腰
完全看不懂{:5_148:} 太專業啦~我的老天啊~~~~
页:
[1]