E51p.asm
上传用户:qzrxzm02
上传日期:2013-04-11
资源大小:688k
文件大小:23k
源码类别:

并口编程

开发平台:

Asm

  1. ;波特率28800
  2. ;for at89c51系列
  3. ;增加AT89S51串行编程功能
  4. ;删除了烧at89c2051系列芯片的代码
  5. VPP         EQU     P3.2;接三极管,vpp电压控制
  6. VPP_12      EQU     P3.2;5-12V CONTROL FOR 89C51
  7. RST         EQU     P3.5;
  8. PROG        EQU     P3.3;编程脉冲控制
  9. BUSY        EQU     P3.4;
  10. MOSI        EQU     P1.5
  11. MISO        EQU     P1.6
  12. SCK         EQU     P1.7
  13. F_VPP       EQU     00H ;vpp电压标志
  14. F_RST       EQU     01H ;RST电压标志
  15. F_RXALL     EQU     02H
  16. TX0         EQU     30H;
  17. TX1         EQU     31H;
  18. TX2         EQU     32H;发送缓存
  19. TX3         EQU     33H;30-41 18BYTES BUFFER
  20. TX4         EQU     34H
  21. TX17        EQU     41H
  22. RX0         EQU     42H;42-53 18BYTES BUFFER
  23. RX1         EQU     43H;
  24. RX2         EQU     44H;
  25. RX3         EQU     45H;接收缓存
  26. RX4         EQU     46H
  27. RX17        EQU     53H
  28. ADDRESS_L   EQU     10H;
  29. ADDRESS_H   EQU     11H;
  30. PARAM0      EQU     12H
  31. PARAM1      EQU     13H
  32. PARAM2      EQU     14H
  33. PARAM3      EQU     15H
  34. RET0        EQU     16H
  35. RET1        EQU     17H
  36. RET2        EQU     18H
  37. RET3        EQU     19H
  38. BITS1       EQU     22H
  39. BITS2       EQU     23H
  40. SOUT        EQU     24H
  41. SIN         EQU     25H
  42. SOUT1       EQU     26H
  43. SOUT2       EQU     27H
  44. SOUT3       EQU     28H
  45. SOUT4       EQU     29H
  46. SIN1        EQU     2AH
  47. SIN2        EQU     2BH
  48. SIN3        EQU     2CH
  49. SIN4        EQU     2DH
  50. _R0         EQU     08H
  51. _R1         EQU     09H
  52. ;RX1表示器件型号:0-C51,1-C52,2-C55,10-S51,11-S52,12-S55
  53. C51         EQU     0H
  54. C52         EQU     1H
  55. C55         EQU     2H
  56. S51         EQU     10H
  57. S52         EQU     11H
  58. S55         EQU     12H
  59. WAIT_VOL    EQU     55H;等待电压稳定延时系数
  60.             ORG     0000H
  61.             SJMP    START
  62.             ORG     0023H
  63.             ;SJMP   RX_INT
  64.             ORG     0030H
  65. START:      MOV     SP,#60H
  66.             MOV     WAIT_VOL,#0FH
  67.             SETB    F_VPP
  68.             ACALL   SET_VPP5
  69.             SETB    P3.5;   SET AT89C51'S RST=1
  70.             MOV     R4,#08H
  71.             MOV     IP,#00H
  72.                              ;SCON: SM0|SM1|SM2|REN|TB8|RB8|TI|RI
  73.             MOV     SCON,#11010000B ; 1   1   0   1   0   0  0  0
  74.             MOV     A,PCON
  75.             ANL     A,#01111111B     ;SMOD=0
  76.             ;ORL      A,#10000000B     ;SMOD=1
  77.             MOV     PCON,A
  78.             MOV     TCON,#00H
  79.             MOV     IE,#00H
  80.             MOV     TH1,#0FFH       ;波特率28800*TMOD
  81.             MOV     TL1,#0FFH
  82.                               ;TMOD: GATE|C/!T|M1|M0|GATE|C/!T|M1|M0
  83.             MOV     TMOD,#00100000B;   0    0  1   0   0    0   0  1
  84.             MOV     TH0,#0FFH
  85.             MOV     TL0,#0FFH
  86.             SETB    TR1
  87.             CLR     ES         ;中断允许
  88.             CLR     EA         ;
  89.             CLR     RI
  90.             CLR     RI
  91.             CLR     TI
  92.             ACALL   INIT_PIN
  93. TEST_TX:    MOV     R0,#255   ;检查串口通讯
  94.             ACALL   DELAY
  95.             MOV     R0,#255
  96.             ACALL   DELAY
  97.             MOV     TX0,#01H
  98.             MOV     TX1,#'M'
  99.             MOV     TX2,#'P'
  100.             ACALL   TX_PC
  101. ;RX1表示器件型号:0-C51,1-C52,2-C55,3-S51,4-S52,5-S55
  102. WAIT_COMM:  ACALL   RX_PC
  103.             MOV     A,RX0
  104. _TEST_MP:   CJNE    A,#01H,_ERASE_ROM
  105.             AJMP    TEST_MP
  106. _ERASE_ROM: CJNE    A,#02H,_INIT_WRITE
  107.             AJMP    ERASE_ROM
  108. _INIT_WRITE:CJNE    A,#03H,_WRITE_ROM
  109.             AJMP    INIT_WRITE
  110. _WRITE_ROM: CJNE    A,#04H,_INIT_READ
  111.             AJMP    WRITE_ROM
  112. _INIT_READ: CJNE    A,#05H,_READ_ROM
  113.             AJMP    INIT_READ
  114. _READ_ROM:  CJNE    A,#06H,_LOCK_BIT
  115.             AJMP    WAIT_COMM
  116. _LOCK_BIT:  CJNE    A,#07H,_READ_SIGN
  117.             AJMP    LOCK_BIT
  118. _READ_SIGN: CJNE    A,#08,WAIT_COMM
  119.             AJMP    READ_SIGN
  120.             AJMP    WAIT_COMM
  121. TEST_MP:    ACALL   INIT_PIN
  122.             MOV     TX0,RX0
  123.             MOV     A,RX1
  124.             MOV     TX1,A
  125.             MOV     A,RX2
  126.             MOV     TX2,A
  127.             ACALL   TX_PC
  128.             AJMP    WAIT_COMM
  129. ERASE_ROM:  MOV     A,RX1
  130.             MOV     TX0,RX0
  131.             MOV     TX1,RX1
  132. ERASE_ROM_T0:
  133.             CJNE    A,#C51,ERASE_ROM_T1
  134.             AJMP    ERASE_C51
  135. ERASE_ROM_T1:
  136.             CJNE    A,#S51,ERASE_ROM_T2
  137.             AJMP    ERASE_S51
  138. ERASE_ROM_T2:
  139.             AJMP   _ERASE_20PINS
  140. _ERASE_C51:
  141.             ACALL   ERASE_C51
  142.             ACALL   TX_PC
  143.             AJMP    WAIT_COMM
  144. _ERASE_20PINS:
  145.             ACALL   REPORT_INVALID
  146.             AJMP    WAIT_COMM
  147. INIT_WRITE:
  148.             MOV      A,RX1
  149.             MOV      TX0,RX0
  150.             MOV      TX1,RX1
  151. INIT_WRITE_T0:
  152.             CJNE     A,#C51,INIT_WRITE_T1
  153.             AJMP     INIT_WRITE_C51
  154. INIT_WRITE_T1:
  155.             CJNE     A,#S51,INIT_WRITE_T2
  156.             AJMP     INIT_WRITE_S51
  157. INIT_WRITE_T2:
  158.             AJMP     _INIT_WRITE_20PINS
  159. _INIT_WRITE_20PINS:
  160.             ACALL    REPORT_INVALID
  161.             AJMP     WAIT_COMM
  162. WRITE_ROM:  MOV     A,RX1
  163. WRITE_ROM_T0:
  164.             CJNE    A,#C51,WRITE_ROM_T1
  165.             AJMP    WRITE_C51
  166. WRITE_ROM_T1:
  167.             CJNE    A,#S51,WRITE_ROM_T2
  168.             AJMP    WRITE_S51
  169. WRITE_ROM_T2:
  170.             AJMP    _WRITE_20PINS
  171. _WRITE_20PINS:
  172.             ACALL   REPORT_INVALID
  173.             AJMP    WAIT_COMM
  174. INIT_READ:  SETB     P3.0
  175.             MOV      A,RX1
  176.             MOV      TX0,RX0
  177.             MOV      TX1,RX1
  178.             MOV      ADDRESS_L,#00H
  179.             MOV      ADDRESS_H,#00H
  180. INIT_READ_C51:
  181.             CJNE     A,#C51,INIT_READ_S51
  182.             SJMP     INIT_READ_OVER
  183. INIT_READ_S51:
  184.             CJNE     A,#S51,INIT_READ_OVER
  185.             ACALL    READY_PROG
  186. INIT_READ_OVER:
  187.             ACALL    TX_PC
  188.             CLR      RI
  189.             JNB      RI,$;   检查接收的一个字节,查询是否结束
  190.             MOV      A,SBUF
  191.             CJNE     A,#01H,READ_ROM;01表示结束
  192.             AJMP     WAIT_COMM
  193. READ_ROM:   MOV     A,RX1
  194.             MOV     TX0,#06H
  195.             MOV     TX1,RX1
  196. READ_ROM_T0:
  197.             CJNE    A,#C51,READ_ROM_T1
  198.             AJMP    READ_C51
  199. READ_ROM_T1:
  200.             CJNE    A,#S51,READ_ROM_T2
  201.             AJMP    READ_S51
  202. READ_ROM_T2:
  203.             AJMP    _READ_20PINS
  204. _READ_20PINS:
  205.             ACALL   REPORT_INVALID
  206.             AJMP    WAIT_COMM
  207. LOCK_BIT:   MOV     TX1,RX1
  208.             MOV     TX0,RX0
  209.             MOV     A,RX1
  210. LOCK_BIT_T0:
  211.             CJNE    A,#C51,LOCK_BIT_T1
  212.             AJMP    LOCK_BIT_C51
  213. LOCK_BIT_T1:
  214.             CJNE    A,#S51,LOCK_BIT_T2
  215.             AJMP    LOCK_BIT_S51
  216. LOCK_BIT_T2:
  217.             AJMP    _LOCK_BIT_20PINS
  218. _LOCK_BIT_20PINS:
  219.             ACALL   REPORT_INVALID
  220.             AJMP    WAIT_COMM
  221. READ_SIGN:  MOV     TX0,RX0
  222.             MOV     TX1,RX1
  223.             MOV     A,RX1
  224. READ_SIGN_T0:
  225.             CJNE    A,#C51,READ_SIGN_T1
  226.             AJMP     READ_SIGN_C51
  227. READ_SIGN_T1:
  228.             CJNE    A,#S51,READ_SIGN_T2
  229.             AJMP    READ_SIGN_S51
  230. READ_SIGN_T2:
  231. READ_SIGN_20PINS:
  232.             ACALL   REPORT_INVALID
  233.             AJMP    WAIT_COMM
  234. ;---------------------------------------------------------------
  235. ;           FOR C51
  236. ;---------------------------------------------------------------
  237. WRITE_C51:
  238.             MOV     _R0,#RX2
  239.             MOV     _R1,#TX2
  240. WRITE_16BYTES_C51:
  241.             MOV     R0,_R0
  242.             MOV     PARAM0,@R0
  243.             ACALL   _WRITE_C51
  244.             MOV     R1,_R1
  245.             MOV     @R1,RET0
  246.             MOV     A,RET0
  247.             CJNE    A,PARAM0,WRITE_RES_ERROR
  248.             INC     _R0
  249.             INC     _R1
  250.             ACALL   INC_ADDRESS
  251.             MOV     R0,_R0
  252.             CJNE    R0,#RX17+1,WRITE_16BYTES_C51
  253.             AJMP    WRITE_RES
  254. WRITE_RES:  MOV      SBUF,#00H
  255.             CLR      TI
  256.             JNB      TI,$
  257.             CLR      TI
  258.             AJMP     WAIT_COMM
  259. WRITE_RES_ERROR:
  260.             MOV      SBUF,#0FFH
  261.             CLR      TI
  262.             JNB      TI,$
  263.             CLR      TI
  264.             AJMP     WAIT_COMM
  265. INIT_WRITE_C51:
  266.             ACALL    MODE_C51
  267.             MOV      ADDRESS_L,#00H
  268.             MOV      ADDRESS_H,#00H
  269.             ACALL    TX_PC
  270.             AJMP     WAIT_COMM
  271. READ_C51:
  272.             MOV     _R1,#TX2
  273. READ_16BYTES_C51:
  274.             ACALL   _READ_C51
  275.             MOV     R1,_R1
  276.             MOV     @R1,RET0
  277.             INC     _R1
  278.             ACALL   INC_ADDRESS
  279.             MOV     R1,_R1
  280.             CJNE    R1,#TX17+1,READ_16BYTES_C51
  281.             ACALL   TX_PC
  282. READ_NEXT_C51:
  283.             CLR     RI
  284.             JNB     RI,$;   检查接收的一个字节,查询是否结束
  285.             MOV     A,SBUF
  286.             CJNE    A,#01H,READ_C51;01表示结束
  287.             AJMP    WAIT_COMM
  288. _READ_C51:
  289.             SETB    RST
  290.             ACALL   SET_VPP5       ;设置成读状态 P3.6=H P3.7=H
  291.             SETB    PROG           ;              P2.7=L P2.6=L
  292.             SETB    P3.6
  293.             SETB    P3.7
  294.             CLR     P2.6
  295.             CLR     P2.7
  296.             MOV     R0,#0FH
  297.             DJNZ    R0,$
  298.             MOV     P1,ADDRESS_L
  299.             MOV     A,#00111111B
  300.             ANL     A,ADDRESS_H
  301.             MOV     P2,A            ;高地址
  302.             MOV     P0,#0FFH        ;读先置1
  303.             MOV     R0,#05H
  304.             DJNZ    R0,$
  305.             MOV     A,P0
  306.             MOV     RET0,A
  307.             RET
  308. _WRITE_C51:
  309.             SETB    PROG
  310.             SETB    BUSY
  311.             SETB    P2.7
  312.             CLR     P2.6
  313.             SETB    P3.7
  314.             SETB    P3.6
  315.             MOV     R0,#05H
  316.             DJNZ    R0,$
  317.             MOV     A,#10000000B
  318.             ORL     A,ADDRESS_H
  319.             MOV     P2,A
  320.             MOV     A,ADDRESS_L
  321.             MOV     P1,A
  322.             MOV     A,PARAM0
  323.             MOV     P0,A
  324.             MOV     R0,#05H
  325.             DJNZ    R0,$
  326.             ACALL   SET_VPP12
  327.             MOV     R0,#05H
  328.             DJNZ    R0,$
  329.             CLR     PROG
  330.             MOV     R0,#05H
  331.             DJNZ    R0,$
  332.             SETB    PROG
  333.             MOV     R0,#05H
  334.             DJNZ    R0,$
  335.             MOV     P0,#0FFH
  336.             MOV     R3,#0FFH
  337.             MOV     A,#00H
  338. DET_BUSY:   DJNZ    R3,DET_B
  339.             AJMP    DET_DATA;超时跳出到数据检测
  340. DET_B:      INC     A
  341.             MOV     RET2,A
  342.             MOV     R0,#05H
  343.             DJNZ    R0,$
  344.             JNB     BUSY,DET_BUSY
  345. DET_DATA:   MOV     R0,#0FFH
  346.             MOV     P0,#0FFH
  347.             ACALL   SET_VPP5
  348.             CLR     P2.7
  349. DET_D:      DJNZ    R0,DET_D2
  350.             AJMP    WRITE_ERROR
  351. DET_D2:     MOV     A,P0
  352.             CJNE    A,PARAM0,DET_D
  353. WRITE_SUC:  MOV     A,P0
  354.             MOV     RET0,A
  355.             MOV     RET1,#00H
  356.             RET
  357. WRITE_ERROR:MOV     A,P0
  358.             MOV     RET0,A
  359.             ACALL   MODE_C51
  360.             MOV     RET1,#0FFH
  361.             RET
  362. LOCK_BIT_C51:
  363.             ACALL   MODE_C51
  364.             ACALL   SET_VPP5
  365. LOCK_BIT1_C51:
  366.             MOV     A,RX2
  367.             CJNE    A,#0FFH,LOCK_BIT2_C51
  368.             SETB    PROG
  369.             SETB    BUSY
  370.             SETB    P2.7
  371.             SETB    P2.6
  372.             SETB    P3.7
  373.             SETB    P3.6
  374.             MOV     R0,#0FH
  375.             DJNZ    R0,$
  376.             ACALL   SET_VPP12
  377.             MOV     R0,#0FH
  378.             DJNZ    R0,$
  379.             CLR     PROG
  380.             MOV     R0,#0FH
  381.             DJNZ    R0,$
  382.             SETB    PROG
  383.             MOV     R0,#0FH
  384.             DJNZ    R0,$
  385.             ACALL   SET_VPP5
  386. LOCK_BIT2_C51:
  387.             MOV     A,RX3
  388.             CJNE    A,#0FFH,LOCK_BIT3_C51
  389.             SETB    PROG
  390.             SETB    BUSY
  391.             SETB    P2.7
  392.             SETB    P2.6
  393.             CLR     P3.7
  394.             CLR     P3.6
  395.             MOV     R0,#0FH
  396.             DJNZ    R0,$
  397.             ACALL   SET_VPP12
  398.             MOV     R0,#0FH
  399.             DJNZ    R0,$
  400.             CLR     PROG
  401.             MOV     R0,#0FH
  402.             DJNZ    R0,$
  403.             SETB    PROG
  404.             MOV     R0,#0FH
  405.             DJNZ    R0,$
  406.             ACALL   SET_VPP5
  407. LOCK_BIT3_C51:
  408.             MOV     A,RX4
  409.             CJNE    A,#0FFH,LOCK_BIT_C51_RET
  410.             SETB    PROG
  411.             SETB    BUSY
  412.             CLR     P2.7
  413.             SETB    P2.6
  414.             CLR     P3.7
  415.             SETB    P3.6
  416.             MOV     R0,#0FH
  417.             DJNZ    R0,$
  418.             ACALL   SET_VPP12
  419.             MOV     R0,#0FH
  420.             DJNZ    R0,$
  421.             CLR     PROG
  422.             MOV     R0,#0FH
  423.             DJNZ    R0,$
  424.             SETB    PROG
  425.             MOV     R0,#0FH
  426.             DJNZ    R0,$
  427.             ACALL   SET_VPP5
  428. LOCK_BIT_C51_RET:
  429.             ACALL   MODE_C51
  430.             MOV     TX0,RX0
  431.             MOV     TX1,RX1
  432.             MOV     TX2,RX2
  433.             MOV     TX3,RX3
  434.             MOV     TX4,RX4
  435.             ACALL   TX_PC
  436.             AJMP    WAIT_COMM
  437. READ_SIGN_C51:
  438.             MOV      ADDRESS_H,#00H
  439.             MOV      ADDRESS_L,#30H
  440.             ACALL    _READ_SIGN_C51
  441.             MOV      TX2,RET0
  442.             MOV      ADDRESS_L,#31H
  443.             ACALL    _READ_SIGN_C51
  444.             MOV      TX3,RET0
  445.             MOV      ADDRESS_L,#32H
  446.             ACALL    _READ_SIGN_C51
  447.             MOV      TX4,RET0
  448. READ_SIGN_C51_RET:
  449.             ACALL    MODE_C51
  450.             ACALL    TX_PC
  451.             AJMP     WAIT_COMM
  452. _READ_SIGN_C51:
  453.             SETB    RST
  454.             ACALL   SET_VPP5       ;设置成读SIGN状态 P3.6=L P3.7=L
  455.             SETB    PROG           ;                 P2.7=L P2.6=L
  456.             CLR     P3.6
  457.             CLR     P3.7
  458.             CLR     P2.6
  459.             CLR     P2.7
  460.             MOV     R0,#0FH
  461.             DJNZ    R0,$
  462.             MOV     P1,ADDRESS_L
  463.             MOV     A,#00111111B
  464.             ANL     A,ADDRESS_H
  465.             MOV     P2,A            ;高地址
  466.             MOV     P0,#0FFH        ;读先置1
  467.             MOV     R0,#0FH
  468.             DJNZ    R0,$
  469.             MOV     A,P0
  470.             MOV     RET0,A
  471.             RET
  472. ERASE_C51:
  473.             SETB    PROG
  474.             SETB    P2.6
  475.             CLR     P2.7
  476.             CLR     P3.7
  477.             CLR     P3.6
  478.             ACALL   SET_VPP12
  479.             MOV     R0,#02H
  480.             ACALL   DELAY
  481.             CLR     PROG
  482.             MOV     R0,#10H
  483.             ACALL   DELAY
  484.             SETB    PROG
  485.             ACALL   MODE_C51
  486.             ACALL   TX_PC
  487.             AJMP    WAIT_COMM
  488. VPP_5V:     ACALL   SET_VPP5
  489.             ACALL   TX_PC
  490.             AJMP    WAIT_COMM
  491. VPP_12V:    ACALL   SET_VPP12
  492.             ACALL   TX_PC
  493.             AJMP    WAIT_COMM
  494. SET_VPP12:  SETB    VPP_12
  495.             JNB     F_VPP,WAIT_VPP12
  496.             RET
  497. WAIT_VPP12: MOV     R0,WAIT_VOL
  498.             DJNZ    R0,$
  499.             SETB    F_VPP
  500.             RET
  501. SET_VPP5:   CLR     VPP_12
  502.             JB      F_VPP,WAIT_VPP5
  503.             RET
  504. WAIT_VPP5:  MOV     R0,WAIT_VOL
  505.             DJNZ    R0,$
  506.             CLR     F_VPP
  507.             RET
  508. MODE_C51:   ACALL   SET_VPP5
  509.             SETB    RST
  510.             SETB    PROG
  511.             MOV     P0,#0FFH
  512.             SETB    P3.6
  513.             SETB    P3.7
  514.             CLR     P2.7
  515.             CLR     P2.6
  516.             MOV     P2,#00000000B
  517.             MOV     P1,#0FFH
  518.             RET
  519. INC_ADDRESS:MOV     R0,ADDRESS_L
  520.             MOV     R1,ADDRESS_H
  521.             CJNE    R0,#0FFH,INC_LADDR
  522. INC_HADDR:  MOV     R0,#00H
  523.             INC     R1
  524.             SJMP    RET_ADDR
  525. INC_LADDR:  INC     R0
  526. RET_ADDR:   MOV     ADDRESS_L,R0
  527.             MOV     ADDRESS_H,R1
  528.             RET
  529. ;------------------------------------------------------------
  530. ;           FOR     AT89S51
  531. ;------------------------------------------------------------
  532. ERASE_S51:  ACALL  READY_PROG
  533.             MOV    SOUT1,#10101100B
  534.             MOV    SOUT2,#10000000B
  535.             ACALL  SCK_INSTRUC
  536.             MOV    R0,#255
  537.             ACALL  DELAY
  538.             MOV    R0,#255
  539.             ACALL  DELAY
  540.             ACALL  MODE_S51
  541.             ACALL  TX_PC
  542.             AJMP   WAIT_COMM
  543. INIT_WRITE_S51:
  544.             MOV      ADDRESS_L,#00H
  545.             MOV      ADDRESS_H,#00H
  546.             ACALL    READY_PROG
  547.             ACALL    TX_PC
  548.             AJMP     WAIT_COMM
  549. WRITE_S51:  MOV     _R0,#RX2
  550.             MOV     _R1,#TX2
  551. WRITE_16BYTES_S51:
  552.             MOV     R0,_R0
  553.             MOV     PARAM0,@R0
  554.             ACALL   _WRITE_S51
  555.             MOV     R1,_R1
  556.             MOV     @R1,RET0
  557.             MOV     A,RET0
  558.             CJNE    A,PARAM0,WRITE_S51_RES_ERROR
  559.             INC     _R0
  560.             INC     _R1
  561.             ACALL   INC_ADDRESS
  562.             MOV     R0,_R0
  563.             CJNE    R0,#RX17+1,WRITE_16BYTES_S51
  564. WRITE_S51_RES:
  565.             MOV      SBUF,#00H
  566.             CLR      TI
  567.             JNB      TI,$
  568.             CLR      TI
  569.             AJMP     WAIT_COMM
  570. WRITE_S51_RES_ERROR:
  571.             MOV      SBUF,#0FFH
  572.             CLR      TI
  573.             JNB      TI,$
  574.             CLR      TI
  575.             ACALL    MODE_S51
  576.             AJMP     WAIT_COMM
  577. _WRITE_S51:
  578.             MOV      SOUT1,#01000000B
  579.             MOV      SOUT2,ADDRESS_H
  580.             MOV      SOUT3,ADDRESS_L
  581.             MOV      SOUT4,PARAM0
  582.             ACALL    SCK_INSTRUC
  583.             MOV      RET0,PARAM0
  584.             MOV      R0,#1
  585.             ACALL    DELAY
  586.             RET
  587. READ_S51:   MOV     _R1,#TX2
  588. READ_16BYTES_S51:
  589.             ACALL   _READ_S51
  590.             MOV     R1,_R1
  591.             MOV     @R1,RET0
  592.             INC     _R1
  593.             ACALL   INC_ADDRESS
  594.             MOV     R1,_R1
  595.             CJNE    R1,#TX17+1,READ_16BYTES_S51
  596.             ACALL   TX_PC
  597. READ_NEXT_S51:
  598.             CLR     RI
  599.             JNB     RI,$;   检查接收的一个字节,查询是否结束
  600.             MOV     A,SBUF
  601.             CJNE    A,#01H,READ_S51;01表示结束
  602.             ACALL   MODE_S51
  603.             AJMP    WAIT_COMM
  604. _READ_S51:  MOV     SOUT1,#00100000B
  605.             MOV     SOUT2,ADDRESS_H
  606.             MOV     SOUT3,ADDRESS_L
  607.             MOV     SOUT4,#00
  608.             ACALL   SCK_INSTRUC
  609.             MOV     RET0,SIN4
  610.             RET
  611. LOCK_BIT_S51:
  612.             ACALL  READY_PROG
  613.             MOV    SOUT1,#10101100B
  614.             MOV    SOUT2,#11100000B
  615.             MOV    SOUT3,#00000000B
  616.             MOV    SOUT4,#00000000B
  617. LOCK_BIT1_S51:
  618.             MOV    A,RX2
  619.             CJNE   A,#0FFH,LOCK_BIT2_S51
  620.             MOV    SOUT2,#11100001B
  621.             ACALL  SCK_INSTRUC
  622.             MOV    R0,#1
  623.             ACALL  DELAY
  624. LOCK_BIT2_S51:
  625.             MOV    A,RX3
  626.             CJNE   A,#0FFH,LOCK_BIT3_S51
  627.             MOV    SOUT2,#11100010B
  628.             ACALL  SCK_INSTRUC
  629.             MOV    R0,#1
  630.             ACALL  DELAY
  631. LOCK_BIT3_S51:
  632.             MOV    A,RX4
  633.             CJNE   A,#0FFH,_LOCK_BIT_S51
  634.             MOV    SOUT2,#11100011B
  635.             ACALL  SCK_INSTRUC
  636.             MOV    R0,#1
  637.             ACALL  DELAY
  638. _LOCK_BIT_S51:
  639.             ACALL  MODE_S51
  640.             ACALL  TX_PC
  641.             AJMP   WAIT_COMM
  642. READ_SIGN_S51:
  643.             ACALL  READY_PROG
  644.             MOV    SOUT1,#00101000B
  645.             MOV    SOUT2,#00000000B
  646.             MOV    SOUT3,#00000000B
  647.             ACALL  SCK_INSTRUC
  648.             MOV    TX2,SIN4
  649.             MOV    SOUT1,#00101000B
  650.             MOV    SOUT2,#00000001B
  651.             MOV    SOUT3,#00000000B
  652.             ACALL  SCK_INSTRUC
  653.             MOV    TX3,SIN4
  654.             MOV    SOUT1,#00101000B
  655.             MOV    SOUT2,#00000010B
  656.             MOV    SOUT3,#00000000B
  657.             ACALL  SCK_INSTRUC
  658.             MOV    TX4,SIN4
  659.             ACALL  MODE_S51
  660.             ACALL  TX_PC
  661.             AJMP   WAIT_COMM
  662. MODE_S51:   ACALL  INIT_PIN
  663.             CLR    SCK
  664.             SETB   MISO
  665.             CLR    MOSI
  666.             RET
  667. READY_PROG: ACALL  MODE_S51
  668.             SETB   RST
  669.             MOV    R0,#10
  670.             ACALL  DELAY
  671.             MOV    SOUT1,#10101100B
  672.             MOV    SOUT2,#01010011B
  673.             MOV    SOUT3,#00
  674.             MOV    SOUT4,#00
  675.             ACALL  SCK_INSTRUC
  676.             RET
  677. SCK_INSTRUC:CLR    MOSI
  678.             SETB   MISO
  679.             MOV    SOUT,SOUT1
  680.             ACALL  SCK_BYTE
  681.             MOV    SIN1,SIN
  682.             MOV    SOUT,SOUT2
  683.             ACALL  SCK_BYTE
  684.             MOV    SIN2,SIN
  685.             MOV    SOUT,SOUT3
  686.             ACALL  SCK_BYTE
  687.             MOV    SIN3,SIN
  688.             MOV    SOUT,SOUT4
  689.             ACALL  SCK_BYTE
  690.             MOV    SIN4,SIN
  691.             RET
  692. SCK_BYTE:   CLR    SCK
  693.             MOV    C,SOUT.7
  694.             MOV    MOSI,C
  695.             NOP
  696.             SETB   SCK
  697.             NOP
  698.             MOV    C,MISO
  699.             MOV    SIN.7,C
  700.             CLR    SCK
  701.             CLR    SCK
  702.             MOV    C,SOUT.6
  703.             MOV    MOSI,C
  704.             NOP
  705.             SETB   SCK
  706.             NOP
  707.             MOV    C,MISO
  708.             MOV    SIN.6,C
  709.             CLR    SCK
  710.             CLR    SCK
  711.             MOV    C,SOUT.5
  712.             MOV    MOSI,C
  713.             NOP
  714.             SETB   SCK
  715.             NOP
  716.             MOV    C,MISO
  717.             MOV    SIN.5,C
  718.             CLR    SCK
  719.             CLR    SCK
  720.             MOV    C,SOUT.4
  721.             MOV    MOSI,C
  722.             NOP
  723.             SETB   SCK
  724.             NOP
  725.             MOV    C,MISO
  726.             MOV    SIN.4,C
  727.             CLR    SCK
  728.             CLR    SCK
  729.             MOV    C,SOUT.3
  730.             MOV    MOSI,C
  731.             NOP
  732.             SETB   SCK
  733.             NOP
  734.             MOV    C,MISO
  735.             MOV    SIN.3,C
  736.             CLR    SCK
  737.             CLR    SCK
  738.             MOV    C,SOUT.2
  739.             MOV    MOSI,C
  740.             NOP
  741.             SETB   SCK
  742.             NOP
  743.             MOV    C,MISO
  744.             MOV    SIN.2,C
  745.             CLR    SCK
  746.             CLR    SCK
  747.             MOV    C,SOUT.1
  748.             MOV    MOSI,C
  749.             NOP
  750.             SETB   SCK
  751.             NOP
  752.             MOV    C,MISO
  753.             MOV    SIN.1,C
  754.             CLR    SCK
  755.             CLR    SCK
  756.             MOV    C,SOUT.0
  757.             MOV    MOSI,C
  758.             NOP
  759.             SETB   SCK
  760.             NOP
  761.             MOV    C,MISO
  762.             MOV    SIN.0,C
  763.             CLR    SCK
  764.             RET
  765. ;------------------------------------------------------------
  766. ;           GOBAL SUB PROCESSES
  767. ;------------------------------------------------------------
  768. SET_WAIT:   MOV     A,RX1    ;设置电压转换所用的时间WAIT_VOL*2 US
  769.             MOV     WAIT_VOL,A
  770.             MOV     TX1,A
  771.             MOV     TX2,A
  772.             ACALL   TX_PC
  773.             AJMP    WAIT_COMM
  774. TX_PC:      MOV     R0,#TX0
  775. TX_BYTE:    CLR     TI
  776.             MOV     A,@R0
  777.             MOV     SBUF,A
  778.             INC     R0
  779.             JNB     TI,$
  780.             CJNE    R0,#TX17+1,TX_BYTE
  781.             CLR     TI
  782.             RET
  783. RX_PC:      SETB    P3.0
  784.             MOV     R0,#RX0
  785. RX_BYTE:    CLR     RI
  786.             JNB     RI,$
  787.             MOV     A,SBUF
  788.             MOV     @R0,A
  789.             INC     R0
  790.             CJNE    R0,#RX17+1,RX_BYTE
  791.             CLR     RI
  792.             RET
  793. DELAY:      MOV     R1,#0FBH        ;延时R0*MS
  794.             MOV     R2,#0FBH
  795.             DJNZ    R1,$
  796.             DJNZ    R2,$
  797.             DJNZ    R0,DELAY
  798.             RET
  799. INIT_PIN:   CLR     VPP
  800.             CLR     RST
  801.             SETB    BUSY
  802.             SETB    PROG
  803.             MOV     P0,#0FFH
  804.             MOV     P1,#0FFH
  805.             MOV     P2,#0FFH
  806.             SETB    P3.7
  807.             SETB    P3.6
  808.             RET
  809. REPORT_ERROR:
  810.             MOV     TX0,#0FFH
  811.             ACALL   TX_PC
  812.             RET
  813. REPORT_INVALID:
  814.             MOV     TX0,#0F0H
  815.             ACALL   TX_PC
  816.             RET