temp

ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT0
ORG 0013H
LJMP INT1
ORG 0030H
MAIN: SETB IT0 ; 外部中斷0爲 負跳沿觸發
CLR IT1 ;  外部中斷1爲 低電平觸發
SETB EX0 ; 開外部中斷0
SETB EX1 ; 開外部中斷1
SETB PX0 ; 設外部中斷0爲高優先級
CLR PX1 ;設外部中斷1爲低優先級
MOV R0,#00H
SETB EA ;開總中斷
DISPLAY:CJNE R0,#10,NEXT
MOV R0,#00H ;滿10,清0
NEXT: MOV A,R0
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P2,A
JMP DISPLAY
TAB:DB  0x3F,0x06,0x5B,0x4F ;數碼管數據表
    DB  0x66,0x6D,0x7D,0x07,0x7F,0x6F


INT0: ;;;;;CLR EA;
LCALL DELAY
JB P3.2,RETURN0 ;消抖,如果外部觸發引腳爲這時爲高電平,說明是錯誤信號
INC R0
WAIT0: JNB P3.2,WAIT0 ;等待按鍵鬆開
RETURN0:;;;;;SETB EA
RETI


INT1: ;;;;;;CLR EA;
LCALL DELAY
JB P3.3,RETURN1 ;消抖,如果外部觸發引腳爲這時爲高電平,說明是錯誤信號
INC R0
WAIT1: JNB P3.3,WAIT1 ;等待按鍵鬆開
RETURN1:;;;;;;SETB EA
RETI


DELAY: MOV R7,#40 ;10毫秒延時
DEL1: MOV R6,#125
DEL2: DJNZ R6,DEL2
DJNZ R7,DEL1
RET




ORG 0000H
LJMP MAIN
ORG 000BH
LJMP CT0
ORG 001BH
LJMP CT1
ORG 0030H
MAIN: MOV SP,#60H
MOV TMOD,#11H ;設置T0,T1工作方式1,軟觸發
MOV TH0,#3CH ;定時50ms
MOV TL0,#0B0H
MOV TH1,#0FEH ;定時500us
MOV TL1,#0CH
SETB PT0
SETB ET0
SETB ET1
SETB EA
MOV R1,#0AH ;定時0.5秒的計數變量
MOV R0,#00H ;數碼管顯示的偏移量,清0
CLR F0
LOOP: MOV A,#0FFH
MOV P1,A
MOV A,P1
CJNE A,#0FFH,AGAIN ;有按鍵按下,查哪個按鍵
JMP LOOP ;無按鍵按下,跳回繼續掃描
AGAIN: MOV A,#0FFH
MOV P1,A
MOV A,P1
CJNE A,#0FFH,NEXT ;有按鍵按下,查哪個按鍵
NEXT: MOV R0,#00H
MOV R2,A  ;用於定時器取反
LOOP1: RRC A  ; 循環以得出偏移量
JNC DISPLAY
INC R0;Cy位不爲0,變量加一,繼續右循環
JMP LOOP1
DISPLAY:MOV A,R0
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P2,A
SETB TR0;啓動定時器0,以閃爍LED
JMP LOOP
CT0: MOV TH0,#3CH; 定時50ms
MOV TL0,#0AFH;
DJNZ R1,RETURN
JB F0,MIE;標記位爲1,滅燈
MOV P0,R2;標記位爲0,亮燈,啓動定時器1,標記變量F0
SETB TR1
SETB F0
MOV R1,#0AH
JMP RETURN
MIE: MOV P0,#0FFH
CLR TR1
CLR F0
MOV R1,#0AH
RETURN: RETI
CT1: MOV TH1,#0FEH; 定時500us
MOV TL1,#0BH;
CPL P3.0
RETI
DELAY: MOV R7,#40 ;10毫秒延時
DEL1: MOV R6,#125
DEL2: DJNZ R6,DEL2
DJNZ R7,DEL1
RET
TAB:DB  0x3F,0x06,0x5B,0x4F ;數碼管數據表

    DB  0x66,0x6D,0x7D,0x07,0x7F,0x6F


-------------------------zoupp-----------------------------------------------

(1)    ORG 0000H

JMP MAIN

ORG 001BH

RETI

ORG 0023H

JMP S_INT

MAIN:MOVR0,#30H;R0發送起始地址

MOV R1,#40H;R1接收起始地址

MOV R2,#0;R2用來判斷按鍵值

MOV R3,#0;R3計按下次數

MOV SP,#60H

MOV TMOD,#20H;T1工作方式2

MOV TL1,#0FAH;在fosc=11.0592MHz時

MOV TH1,#0FAH;波特率爲4800b/s

MOV PCON,#00H

MOV SCON,#50H;工作方式1,允許接收

SETB ET1;開中斷

SETB TR1

SETB ES

SETB EA

LOP1:MOV P1,#0FFH

ACALL DELAY;防抖

MOV A,P1

CJNEA,#0FFH,LOP2;等待按鍵按下

JMP LOP1

LOP2: RRC A ;按鍵按下時計算按鍵值

      JNC LOP3

INC R2

JMP LOP2

LOP3: MOV A,R2   ;按鍵值送A

MOV @R0,A ;按鍵值存入發送區

MOV SBUF,A ;發送按鍵值

INC R0;放送地址指針加一

LOP4:MOV A,P1;等待按鍵鬆開

CJNEA,#0FFH,LOP4

MOV R2,#0

INC R3;按鍵按下個數加一

JMP LOP1

DISP: MOV DPTR,#TB;顯示子程序

MOVC A,@A+DPTR

MOV P2,A

RET

TB:db 3fh,06h,5bh,4fh,66h,6DH,7DH,07H;0—7  

DELAY: MOV 20H,#100H;延時子程序

DEL1:MOV 21H,#100H

     DJNZ 21H,$

     DJNZ 20H,DEL1

     RET

S_INT: JB TI,SEND ;TI=1則發送結束跳到SEND; 串行口中斷程序

       MOV A,SBUF;接收取值

MOV @R1,A ;把接收數據存入接收地址

INC R1 ;接收地址指針加一

ACALL DISP ;調用顯示子程序

CLR RI;清接收標準位

RETI

SEND: CLR TI;清發送標誌位

RETI

(2)ORG 0000H

JMP MAIN

ORG 0023H

JMP S_INT

MAIN:CLR F0;F0 用於區分接收到的數據是

MOV P0,#0;按鍵次數,還是按鍵值

MOV P2,#0

MOV R0,#30H;R0發送起始地址

MOV R1,#40H;R1接收起始地址

MOV R2,#0;R2用來判斷按鍵值

MOV R3,#0;R3計按下次數

MOV SP,#60H

MOV TMOD,#20H;T1工作方式2

MOV TL1,#0F4H;在fosc=11.0592MHz時

MOV TH1,#0F4H;波特率爲2400b/s

MOV PCON,#00H

MOV SCON,#0D0H;工作方式3,允許接收SM2=0

CLR  ET1     

SETB TR1;開中斷

SETB ES

SETB EA

LOP1:MOV P1,#0FFH

ACALL DELAY;防抖

MOV A,P1

CJNE A,#0FFH,LOP2;等待按鍵按下

JMP LOP1

LOP2: RRC A;按鍵按下時計算按鍵值

      JNC LOP3

INC R2

JMP LOP2

LOP3: MOV A,R2;按鍵值送A

MOV C,P;進行奇校驗

CPL C

MOV TB8,C;把奇校驗位送入TB8

MOV @R0,A;按鍵值存入發送區

ACALL DISP

MOV SBUF,@R0;發送按鍵值

JNB TI,$

CLR TI

INC R0;發送地址指針加一

LOP4: MOV A,P1;等待按鍵鬆開

CJNE A,#0FFH,LOP4

MOV R2,#0

INC R3    ;按鍵按下個數加一

MOV P0,R3 ;按下次數送P0顯示

MOV A,R3

MOV C,P   ;奇校驗

CPL C

MOV TB8,C

MOV SBUF,R3 ;送按下次數

JNB TI,$

CLR TI

JMP LOP1

DISP:MOV DPTR,#TB;顯示子程序

MOVC A,@A+DPTR

 P2,A

RET

TB:db 3fh,06h,5bh,4fh,66h,6DH,7DH,07H;0—7

DELAY: MOV 20H,#100H;延時子程序

DEL1:MOV 21H,#100H

       DJNZ 21H,$

       DJNZ20H,DEL1

      RET


S_INT: PUSH A;串行口中斷程序

JB TI,SEND;TI=1則發送結束跳到SEND

CPL F0

CLR RI;清接收標準位

MOV A,SBUF ;接收取值

MOV C,P;進行奇校驗

JNC S1      ;

JB RB8,REP  ;

AJMP S2     ;

S1:JNB RB8,REP

S2:JNB F0,GESHU ;F0=0則接收到按鍵個數據

MOV @R1,A;把接收數據存入接收地址

INC R1;接收地址指針加一

ACALL DISP;調用顯示子程序

REP:POP A

RETI

GESHU:MOV P0,SBUF ;把接收到的按鍵次數送顯

POP A

RETI

SEND: POP A ;發送結束

RETI



--------------------------chen----------------------------------------------

ORG       0000H

       LJMPMAIN

ORG 0030H//03 0B 13 1B 23

MAIN:    //初始化

              MOVSP,#70H

              MOVSCON,#0D0H//設置串口工作方式3,可接收1101

              MOVTMOD,#20H//設置T1,8位重載

              MOVPCON,#00H;

              MOVTH1,#0F4H//11.0592M,波特2400

              MOVTL1,#0F4H//

              SETBTR1//啓動產生波特率

 

              MOV  P0,#0FFH//LED顯示開關次數

              MOV  P2,#00H //數碼管顯示開關編號

 

              MOVR0,#00H//循環得出開關編號所用

              MOVR2,#00H// 開關動作總次數寄存器清0

              MOVR1,#40H//建立存放開關編號的RAM的數據指針

         //掃描鍵盤

RDK:      MOVP1,#0FFH;

              MOVA,P1

              CJNEA,#0FFH,AGAIN;//消抖

              JMPRDK ;無按鍵按下,跳回繼續掃描

AGAIN:        LCALLTIME110MS//延時110毫秒,proteus中10毫秒消抖作用不明顯

              MOVP1,#0FFH;

              MOVA,P1

              CJNEA,#0FFH,NEXT;有按鍵按下,查哪個按鍵

              JMPRDK ;無按鍵按下,跳回繼續掃描

 

              // 開關動作總次數顯示

NEXT:    INCR2;

              MOVP0,R2;

 

           //得出開關編號,並讓數碼管顯示

              MOVR0,#00H

LOOP:    RRCA

              JNCDISPLAY

              INCR0;Cy位不爲0,變量加一,繼續右循環

              JMPLOOP

DISPLAY:MOV A,R0

              MOVDPTR,#TAB

              MOVCA,@A+DPTR

              MOVP2,A

              //開關編號存入RAM

              MOV@R1,A

              INCR1

              //以下通過串口發送,按鍵次數和按鍵號

NUMBE: MOVC,P//奇校驗 TB8和P相反

              CPLC

              MOVTB8,C

              MOVSBUF,A

WAIT:     JBCTI,   RESPOND     //   發送完後,接收,看乙機是否正確接收

              SJMPWAIT

RESPOND:JB RI,JUDGE

              SJMPRESPOND

JUDGE:  MOVA,SBUF

              CLRRI

              CJNEA,#00H, NUMBE//接受到00H,傳輸沒問題,繼續發送開關總次數;接受非00H,出問題,再發

 

MANY:   MOVA,R2

              MOVC,P

              CPLC

              MOVTB8,C

              MOVSBUF,A

WAIT1:   JBCTI,RESPOND2

              SJMPWAIT1

RESPOND2:JB RI,JUDGE2

              SJMPRESPOND2

JUDGE2:       MOVA,SBUF

              CLRRI

              CJNEA,#00H, MANY//接受到00H,傳輸沒問題,;接受非00H,出問題,再發      

             

              JMPRDK

                             

TAB:DB 0x3F,0x06,0x5B,0x4F ;共陰編碼表,跟實驗電路板不一樣

   DB  0x66,0x6D,0x7D,0x07,0x7F,0x6F

TIME110MS:         MOVR5,#0FFH

TIME110MS_1:     MOV R6,#0FFH

                            DJNZR6,$

                            DJNZR5,TIME110MS_1

                            RET

END

//第二小實驗乙機程序

ORG       0000H

LJMP MAIN

ORG       0030H

MAIN:  MOV SP,#70H

              MOVSCON,#0D0H //設置串口工作方式1

              MOVPCON,#00H;

              MOVTMOD,#20H//設置T1,8位重載

              MOVTH1,#0F4H//11.0592M,波特率2400

              MOVTL1,#0F4H

              SETBTR1

              MOV  P1,#0FFH //開關動作總次數LED顯示清0

              MOVP2,#00H//數碼管顯示 滅

//以下接收通信數據

NUMBE: JBRI,JUDGE

              SJMPNUMBE

JUDGE:  MOVA,SBUF

              MOVC,P

              JCODD//8位數據有奇數個1

              JBRB8,GO//8位數據有偶數個1

              JMPAGAIN//傳輸出問題

ODD:      JNBRB8,GO//傳輸無問題

AGAIN:  MOVA,#05H//傳輸出問題,請求重發

              MOVSBUF,A

WAIT:     JBCTI,NUMBE

              SJMPWAIT

GO:        MOVP2,A

              CLRRI

RESPOND:MOV A,#00H

              MOVSBUF,A

WAIT1:   JBCTI,MANY

              JMPWAIT1

 

 

MANY:   JBRI,JUDGE2

              SJMPMANY

JUDGE2:       MOVA,SBUF

              MOVC,P

              JCODD1//8位數據有奇數個1

              JBRB8,GO1

              JMPAGAIN1//傳輸出問題

ODD1:    JNBRB8,GO1//傳輸無問題

AGAIN1:       MOVA,#05H//傳輸出問題,請求重發

              MOVSBUF,A

WAIT2:   JBCTI,MANY

              SJMPWAIT2

GO1:      MOVP1,A

              CLRRI

RESPOND1:MOV A,#00H

              MOVSBUF,A

WAIT3:   JBCTI,NUMBE

              JMPWAIT3

              END



ORG       0000H

       LJMPMAIN

ORG 0030H//03 0B 13 1B 23

MAIN:    //初始化

              MOVSP,#70H

              MOVSCON,#50H//設置串口工作方式1,可接收

              MOVTMOD,#20H//設置T1,8位重載

              MOVPCON,#80H;

              MOVTH1,#0F4H//11.0592M,波特率4800

              MOVTL1,#0F4H//

              SETBTR1//啓動產生波特率

              MOV  P0,#0FFH

              MOV  P2,#00H

              MOVR0,#00H//循環得出開關編號

              MOVR2,#00H//暫存A中存放的開關編號

              MOVR1,#40H//建立存放開關編號的RAM的數據指針

         //掃描鍵盤

RDK:      MOVP1,#0FFH;

              MOVA,P1

              CJNEA,#0FFH,AGAIN;//消抖

              JMPRDK ;無按鍵按下,跳回繼續掃描

AGAIN:        LCALLTIME110MS//延時110毫秒,proteus中10毫秒消抖作用不明顯

              MOVP1,#0FFH;

              MOVA,P1

              CJNEA,#0FFH,NEXT;有按鍵按下,查哪個按鍵

              JMPRDK ;無按鍵按下,跳回繼續掃描

           //得出開關編號,並讓數碼管顯示

NEXT:    MOVR0,#00H

LOOP:    RRCA

              JNCDISPLAY

              INCR0;Cy位不爲0,變量加一,繼續右循環

              JMPLOOP

DISPLAY:MOV A,R0

              MOVDPTR,#TAB

              MOVC A,@A+DPTR

              MOVP2,A

              MOVR2,A

              MOV@R1,A //開關編號存入RAM

              INCR1

              //以下是通信協議

SHHANDS1:MOV A,#06H //發送“握手碼06H”1次

              MOVSBUF,A

WAIT1:   JBCTI,SHHANDS2 //

              SJMPWAIT1

 

SHHANDS2:MOV A,#06H //發送“握手碼06H”2次

              MOVSBUF,A

WAIT2:   JBCTI,SHHANDS3 //

              SJMPWAIT2

 

SHHANDS3:MOV A,#06H //發送“握手碼06H”3次

              MOVSBUF,A

WAIT3:   JBCTI,RESPOND //

              SJMPWAIT3

 

RESPOND:JB RI,JUDGE//接受“應答碼”    //RESPOND:JBC RI,JUDGE//接受“應答碼”

              SJMPRESPOND//

JUDGE:  MOVA,SBUF

              CLRRI

              CJNEA,#00H,SHHANDS1//根據約定(00H正確),判斷,如果不是通信對象,重發“握手碼”

              //以下通過串口發送按鍵編號

              MOVSBUF,R2

WAIT4:   JBCTI,   RDK       //

              SJMPWAIT4

TAB:DB 0x3F,0x06,0x5B,0x4F ;共陰編碼表,跟實驗電路板不一樣

   DB  0x66,0x6D,0x7D,0x07,0x7F,0x6F

TIME110MS:         MOVR5,#0FFH

TIME110MS_1:     MOV R6,#0FFH

                            DJNZR6,$

                            DJNZR5,TIME110MS_1

                            RET

END

//第一小實驗乙機程序

ORG       0000H

LJMP MAIN

ORG       0030H

MAIN:  MOV SP,#70H

              MOVSCON,#50H //設置串口工作方式1

              MOVPCON,#80H;

              MOVTMOD,#20H//設置T1,8位重載

              MOVTH1,#0F4H//11.0592M,波特率4800

              MOVTL1,#0F4H

              SETBTR1

              MOV  P1,#0FFH //      開關動作總次數LED顯示清0

              MOVP2,#00H//數碼管顯示 滅

              MOVR1,#50H//保存數據起始地址

STA:       SETBF0

//以下是通信協議

SHHANDS1:JB RI,JUDGE1 //接受“握手碼06H”

              SJMPSHHANDS1

JUDGE1:       MOVA,SBUF

              CLRRI

              CJNEA,#06H,SIGN1//判斷

 

SHHANDS2:JB RI,JUDGE2 //接受“握手碼06H”

              SJMPSHHANDS2

JUDGE2:       MOVA,SBUF

              CLRRI

              CJNEA,#06H,SIGN2//判斷

 

SHHANDS3:JB RI,JUDGE3 //接受“握手碼06H”

              SJMPSHHANDS3

JUDGE3:       MOVA,SBUF

              CLRRI

              CJNEA,#06H,SIGN3//判斷

              LJMPRESULT

 

SIGN1:   CLRF0

              LJMPSHHANDS2

SIGN2:   CLRF0

              LJMPSHHANDS3

SIGN3:   CLRF0

 

 

RESULT: JBCF0,RIGHT//握手碼正確,發應答碼00H

              MOVA,#05H// 握手碼錯誤,發應答碼05H

              MOVSBUF,A

WAIT1:   JBCTI,STA    //等待甲機再發握手碼

             SJMPWAIT1

 

RIGHT:   MOVA,00H//發送“應答碼”

              MOVSBUF,A

WAIT:     JBCTI,JSHOU

              SJMPWAIT

//以下接收通信數據

JSHOU:  JBRI,NUMBE

              SJMPJSHOU

NUMBE: MOVA,SBUF

              MOVP2,A

              MOV@R1,A

              INCR1

              CLRRI

              SJMPSTA//回去,等待下次握手

              END



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章