8051程式 -------------------------------------------------------------------------------- ORG 0000H JMP START ; 跳到主程式,避開0023H之串列中斷副程 ORG 0023H JMP INTERR ; 跳到串列中斷副程式。 ;---------------------------------- START MOV SP,#70H ; 把堆疊指標,移到70H MOV R0,#00H ; 把#00H放入R0中 MOV IE,#10010000B ; 設定中斷致能暫存器EA=1,ES(串列中斷)=1。 MOV SCON,#01110000B ; 設定串列埠控制存器,模式1,SM2=1,REN=1允許接收 MOV TMOD,#00100000B ; 設定計時/計數器1,為模式2,自動載入功能。 MOV TH1,#0FDH ; 石英振盪器為11.059MHz,串列傳輸飽率9600bps, ; TH1=0FDH。如果為12Mhz,則TH1=243,鮑率為2400bps SETB TR1 ; 啟動計時器1。 ;---------------------------------- MAIN AJMP MAIN ; 等待串列埠中斷 ;---------------------------------- INTERR PUSH A ; 把A之內容推入堆疊 JBC TI,TIINT ; 傎測串列中斷是否為發射中斷,是則跳到TIINT CLR RI ; 清除接收中斷RI旗標 MOV A,SBUF ; 把SBUF接收到的資料放入A累積器 CLR C ; 清除進位旗標 SUBB A,#30H ; 把A之內容減去#30H MOV R0,A ; 把A之內放入R0中 XRL A,#17H ; 判斷從PC端接收之資料是"G"字元,ASCII碼是47H JZ STOP ; A累積器為零,則跳到STOP MOV A,R0 ; 再把R0之內容放入A中 MOV DPTR,#TABLE1 ; 把指標暫存器指向TABLE1 MOVC A,@A+DPTR ; 取資料表內相對之七段顯示器字型碼 MOV P1,A ; 從PORT1輸出 AJMP TIINT ; 跳到TIINT發射相對的ASCII碼 RETI STOP MOV P1,#0FFH ; 把#FFH由PORT1輸出,七段顯示器熄滅 POP A RETI ;------------------------ TIINT MOV DPTR,#TABLE2 ; 把指標暫存器指向TABLE2 MOV A,R0 ; 把R0之資料放入A中 MOVC A,@A+DPTR ; 取出相對的ASCII碼放入A中 MOV SBUF,A ; 把放入發射暫存器的資料發射出去 JNB TI,$ ; 等待8BIT發射完 CLR TI ; 清除發射中斷旗標 POP A RETI ;---------------------------------------- ;七段顯示器顯示的字型碼 ;---------------------------------------- TABLE1 DB 11000000B ; 0 DB 11111001B ; 1 DB 10100100B ; 2 DB 10110000B ; 3 DB 10011001B ; 4 DB 10010010B ; 5 DB 10000010B ; 6 DB 11111000B ; 7 DB 10000000B ; 8 DB 10010000B ; 9 DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 11111111B DB 10001000B ; A DB 10000011B ; B DB 10100111B ; C DB 10100001B ; D DB 10000110B ; E DB 10001110B ; F ;---------------------------------------- ; 0-F 的ACSII碼 ;---------------------------------------- TABLE2 DB 30H ;0 DB 31H ;1 DB 32H ;2 DB 33H ;3 DB 34H ;4 DB 35H ;5 DB 36H ;6 DB 37H ;7 DB 38H ;8 DB 39H ;9 DB 24H DB 24H DB 24H DB 24H DB 24H DB 24H DB 24H DB 41H ;A DB 42H ;B DB 43H ;C DB 44H ;D DB 45H ;E DB 46H ;F ;---------------------------------------- END VB程式 ------------------------------------------------------------------------------------------------------------- Public num As Integer '宣告num為整數公共變數 '========================================================== '關閉通訊埠之執行鈕,關閉後讓通訊埠指示燈熄滅 '========================================================== Private Sub CLOSEsw_Click() Timer1.Enabled = False '設定計時器關閉 MSComm1.Output = "G" '傳送字串"G"到MCS-51端 MSComm1.PortOpen = False '關閉通訊埠 OPENsw.Enabled = True '把OPENcom按鈕致能 CLOSEsw.Enabled = False '把CLOSEcom按鈕失效 ONsw.Enabled = False '讓ONcom按鈕失效 OFFsw.Enabled = False '讓OFFcom按鈕失效 For i = 0 To 7 LED1(i).FillColor = RGB(0, 0, 0) Next i PWRled.FillColor = RGB(0, 0, 0) '通訊埠指示燈熄滅 num = 0 End Sub '========================================================== '啟動按鈕,啟動計時器 '========================================================== Private Sub ONsw_Click() Timer1.Enabled = True '設定計時器開始計時 ONsw.Enabled = False CLOSEsw.Enabled = True OFFsw.Enabled = True End Sub '========================================================== '停止按鈕傳送字串"G"到MCS-51端 '========================================================== Private Sub OFFsw_Click() Dim i As Integer MSComm1.Output = "G" '傳送"G"字元到MCS-51端,也可送出其他字元 ONsw.Enabled = True OFFsw.Enabled = False Timer1.Enabled = False For i = 0 To 7 LED1(i).FillColor = RGB(0, 0, 0) Next i End Sub '========================================================== '開啟通訊埠之執行鈕,開啟後讓通訊埠指示燈亮起 '========================================================== Private Sub OPENsw_Click() MSComm1.PortOpen = True '開啟通訊埠 PWRled.FillColor = RGB(0, 255, 0) '通訊埠指示燈亮起 OPENsw.Enabled = False '把OPENcom按鈕失效 CLOSEsw.Enabled = True '把CLOSEcom按鈕致能 ONsw.Enabled = True End Sub '========================================================== '表單載入 '========================================================== Private Sub Form_Load() CLOSEsw.Enabled = False '把CLOSEcom按鈕失效 ONsw.Enabled = False OFFsw.Enabled = False num = 0 '設定num初始值為0 End Sub '========================================================== '串列埠通訊事件,利用ComEvReceive事件當接收緩衝區中的 '接收位元組數達到RThreshold屬性設定值後即引發事件 '========================================================== Private Sub MSComm1_OnComm() Select Case MSComm1.CommEvent Case comEvReceive '收到最小接收字元數的字元 Dim buf As String Dim decnum As Integer buf = MSComm1.Input '把接收的字元放放在buf中 Select Case buf Case "0" decnum = &HC0 '數字0之16進位顯示碼 Case "1" decnum = &HF9 '數字1之16進位顯示碼 Case "2" decnum = &HA4 '數字2之16進位顯示碼 Case "3" decnum = &HB0 '數字3之16進位顯示碼 Case "4" decnum = &H99 '數字4之16進位顯示碼 Case "5" decnum = &H92 '數字5之16進位顯示碼 Case "6" decnum = &H82 '數字6之16進位顯示碼 Case "7" decnum = &HF8 '數字7之16進位顯示碼 Case "8" decnum = &H80 '數字8之16進位顯示碼 Case "9" decnum = &H90 '數字9之16進位顯示碼 Case "A" decnum = &H88 '數字A之16進位顯示碼 Case "B" decnum = &H83 '數字B之16進位顯示碼 Case "C" decnum = &HA7 '數字C之16進位顯示碼 Case "D" decnum = &HA1 '數字D之16進位顯示碼 Case "E" decnum = &H86 '數字E之16進位顯示碼 Case "F" decnum = &H8E '數字F之16進位顯示碼 End Select display (decnum) End Select End Sub '========================================================= ' 把16進位的值轉換成2進位LED的顯示值 ' "0"LED亮綠燈,"1"LED燈熄,(低態動作) '========================================================= Public Sub display(decnum) Dim i As Integer For i = 0 To 7 '重覆8次 If (decnum And 2 ^ i) = 2 ^ i Then '轉換成2進位中那一位元為"1",那一位元為"0" LED1(i).FillColor = RGB(0, 0, 0) '如果是"1",則讓這個(i)位元的LED燈熄 Else LED1(i).FillColor = RGB(255, 0, 0) '如果是"0",則讓這個(i)位元LED燈亮 End If Next i End Sub '========================================================= 'Timer1計時器副程式,傳送0-F之資料到MCS-51端 '========================================================= Private Sub Timer1_Timer() Dim i As Integer Dim data(16) As String '宣告data陣列有16個資料 data(0) = "0" data(1) = "1" data(2) = "2" data(3) = "3" data(4) = "4" data(5) = "5" data(6) = "6" data(7) = "7" data(8) = "8" data(9) = "9" data(10) = "A" data(11) = "B" data(12) = "C" data(13) = "D" data(14) = "E" data(15) = "F" If num <= 15 Then '如果num小於或等於15 MSComm1.Output = data(num) '則傳送data(num)到MCS-51端 num = num + 1 'num加一 Else num = 0 '如果num大於15,則重設num=0 End If End Sub