keil c 與vb6.0溝通的問題

本帖最後由 bckcookie 於 2010-4-29 22:48 編輯

改了如下的keil c 但仍未能自動傳送代號碼到PC(vb6.0), 究竟是否兩個程式有問題??
流程如下:
開始 -> 1200bps-> 令串列埠工作於模式1->當8051收到load1(即sensor)所傳送+5v, 由串列埠讀取從代碼"1"送出電腦->依照代碼令控制板上的load1著燈->當8051收到load1(即sensor)...
Circuit.JPG
2010-4-29 22:40


#include<REGX52.H>
#include<STDIO.H>
void load1(void);
void send(unsigned char k) ;

main()
{
  TMOD=0x20;
  TH1=230;
  TL1=230;
  TR1=1;

  SCON=0x70;
  TI=0;
          while(1)
    {
      RI=0;
            while(RI==0);
          
          {while(P1==0xff);
          
          switch(P1)
          
          {
          case 0x01:

          {
          P1_1=0;
          SBUF=P1;
          load1();
          break        ;
    }
}
                }
  
  }
        }
void load1(void)
{
  P1_0= !P1_0;
  if(P1_0==0)  send('1');
  else   send('0');
}
void send(unsigned char k)
{
  TI=0;
  SBUF=k;
  while(TI==0);
}
至於在vb6.0, 程式如下, 自動接收即load1代號, 從而自動顯示通電燈:
VB6.0.JPG
2010-4-29 22:42

Private Sub Command1_Click()
tex1.Text = "³s½u¤¤"
MSComm1.Output = "1"
delayms 100
buf = MSComm1.Input
If buf = "0" Then
   LOAD1.FillColor = RGB(0, 255, 0)
   
ElseIf buf = "1" Then
   LOAD1.FillColor = RGB(255, 0, 0)
   Text0(0).Text = Text0(0).Text + "GasSensor-" + Format(Now, "DD.MMM.YYYY.HH:MM:SS") + vbNewLine
   
Else
   tex1.Text = "³s½u¥¢±Ñ"
End If
End Sub
Private Sub Command7_Click()
On Error GoTo OUTPUTERR
Dim i As Integer, iFile As String
iFile = "c:\data logger\test.txt"
Do While Dir(iFile) <> ""
    i = i + 1
    iFile = "c:\data logger\test-" & i & ".txt"
Loop

Open iFile For Output As #1
Print #1, Text0(0).Text
Directory.Text = iFile
Close #1
Exit Sub '¦pªG­n¥Î On Error GoTo ªº¸Ü....§A­n¦bµ{§Çµ²§À¥[ªð­Ó Exit Sub ¥ý±o¬[
OUTPUTERR:
MsgBox Err.Description, vbCritical, "¦sÀÉ¥¢±Ñ"
End Sub
Private Sub Command8_Click()

Text0(0).Text = Empty

End Sub

Private Sub Form_Load()
On Error Resume Next
LOAD1.FillColor = RGB(0, 255, 0)
LOAD2.FillColor = RGB(0, 255, 0)
LOAD3.FillColor = RGB(0, 255, 0)
LOAD4.FillColor = RGB(0, 255, 0)
MSComm1.PortOpen = False
MSComm1.CommPort = 1
MSComm1.PortOpen = True
If MSComm1.PortOpen = True Then
   MSComm1.PortOpen = False
   MSComm1.CommPort = 1
   MSComm1.Settings = "1200,n,8,1"
   MSComm1.PortOpen = True
   tex1.Text = "¤w¦Û°Ê¿ï¥ÎCOM1"
Else
    MSComm1.PortOpen = False
    MSComm1.CommPort = 2
    MSComm1.PortOpen = True
  If MSComm1.PortOpen = True Then
    MSComm1.PortOpen = False
    MSComm1.CommPort = 2
    MSComm1.Settings = "1200,n,8,1"
    MSComm1.PortOpen = True
    tex1.Text = "¤w¦Û°Ê¿ï¥ÎCOM2"
  Else
    MSComm1.PortOpen = False
    tex1.Text = "³q°T°ðµLªkµ¹±z¥Î"
  End If
End If
End Sub

你個圖是LED 當然不會有信號的轉變 換開關吧
805111.jpg
2010-4-29 23:03

TOP

LED 做INPUT..........
我老細有日都叫我用INPUT 出HIGH LOW
(原來佢想我改有PULL UP 同冇PULL UP)

TOP

8051 P0 沒內置上拉電阻要沒PULL UP 轉用P1,P2,P3

TOP

本帖最後由 oYueno 於 2010-4-30 00:53 編輯

LED 點做INPUT 我都想知
出HIGH LOW 就不是INPUT了吧

TOP

本帖最後由 bckcookie 於 2010-4-30 09:56 編輯

謝謝各位師兄的提點, 事實我本身對8051的認識不多, 工作上又沒有關係, 之前為了這個PROJECT, 我經常周圍去找料, 浪費了很多時間, 但我下星期就快要交DEMO, 如果失敗了, 我將付出更大的代價...
那如果我的SENSOR只能交出+5V, 那怎樣設計成開關線路! 至於PIN11 & 10(即TXD & )RXD是否SHORT 埋一起??據你們提供的線路, 請給以下的程式些意見:


#include<REGX52.H>
#include<STDIO.H>
void load1(void);
void send(unsigned char k) ;
main()
{
  TMOD=0x20;
  TH1=230;
  TL1=230;
  TR1=1;

  SCON=0x70;
  while(1)
    {

      RI=0;
          TI=0;
          SBUF=P1 | 0xf0;
            while(TI==0);

          while(RI==0);

          if(SBUF==0xfe)
             P1=0x3f;
          else if(SBUF==0xfd)
         P1=0xcf;
          else if(SBUF==0xfb)
         P1=0x0f;
          else if(SBUF==0xf7)
         P1=0xff;
    }
}

   TI=0;
          while(1)
    {
      RI=0;
            while(RI==0);
         
          {while(P1==0xff);
         
          switch(P1)
         
          {
          case 0x01:

          {
          P1_1=0;
          SBUF=P1;
          load1();
          break        ;
    }
}
                }
  
  }
        }
void load1(void)
{
  P1_0= !P1_0;
  if(P1_0==0)  send('1');
  else   send('0');
}
void send(unsigned char k)
{
  TI=0;
  SBUF=k;
  while(TI==0);
}

TOP

本帖最後由 oYueno 於 2010-4-30 15:03 編輯

你比一個一個不是你本身的硬體線路圖出來 叫人點睇你個程式

你個圖是P1.0-P1.4是LED 哪裡有SENSOR工能

你的SENSOR
是    常態 出"0" 觸發出"1"(5V)
OR  常態 出"1"(5V)觸發出"0"

TOP

至於PIN11 & 10(即TXD & )RXD是否SHORT 埋一起
當然不是SHORT 埋一起
要駁去MAX232

你本身要的功能要一次說明先幫到你
你是用SENSOR觸發"事件"由8051去電腦 P1我想不出何以是LED

你要SENSOR觸發"事件"由8051用P1 表示和去電腦 哪SENSOR的電路你又沒.

TOP

SCON=0x70;
while(1)
    {

      RI=0;
          TI=0;
          SBUF=P1 | 0xf0;
            while(TI==0);

          while(RI==0);

          if(SBUF==0xfe)
             P1=0x3f;
          else if(SBUF==0xfd)
         P1=0xcf;
          else if(SBUF==0xfb)
         P1=0x0f;
          else if(SBUF==0xf7)
         P1=0xff;
    }
}


這段LOOP 死了下面的好像 沒用了

   TI=0;
          while(1)
    {
      RI=0;
            while(RI==0);

TOP

本帖最後由 oYueno 於 2010-4-30 15:21 編輯

while(1)
    {

      RI=0;
          TI=0;
          SBUF=P1 | 0xf0;<-----這個&耙P1.4-P1.7(有"0"的信號送出去)但是你個圖P1.4-7都沒接........???
            while(TI==0);

TOP