您的位置:控制工程论坛网论坛 » 教程与手册 » 单片机串口读写程序(汇编)

xilinxue

xilinxue   |   当前状态:在线

总积分:16186  2025年可用积分:0

注册时间: 2008-06-26

最后登录时间: 2020-03-22

空间 发短消息加为好友

单片机串口读写程序(汇编)

xilinxue  发表于 2008/11/6 18:49:30      1653 查看 1 回复  [上一主题]  [下一主题]

手机阅读

 #include "p16f84.inc"
 LIST P=16f84A
 __CONFIG _WDT_OFF & _XT_OSC & _CP_OFF  & _PWRTE_ON
;9600波特率

;STATUS EQU 3
RA EQU 5   ;RB5为输出,RB6为输入
RB EQU 6
BUFFER EQU 8
COUNT EQU 9
BYTE EQU 10
PIC55 EQU 1FFH
SUB EQU 0
BITNUM EQU 8 ;每字节8位数据
C EQU  0
RxData EQU  0EH

;------------------------
 ORG 0 ;PIC55
 GOTO MAIN
 ;------------------
 ORG 000a  ;SUB
;-----------------------
DELAY
   MOVLW   0x22   ;接收时延时常数
   MOVWF BUFFER ;在4MHZ下,9600波特率延时常数为23
LOOP    DECFSZ BUFFER
   GOTO LOOP
   RETLW 0

DELAYRx
   MOVLW   0x21   ;接收时延时常数
   MOVWF BUFFER ;在4MHZ下,9600波特率延时常数为23
LOOPRx    DECFSZ BUFFER
   GOTO LOOPRx
   RETLW 0

 

DELAY52
   MOVLW   0x11   ;接收时延时常数
   MOVWF BUFFER ;在4MHZ下,9600波特率延时常数为23
LOOP52    DECFSZ BUFFER
   GOTO LOOP52
   RETLW 0


DELAY1 MOVLW 0x30 ;发送时的延时常数30
   MOVWF BUFFER
LOOP1 DECFSZ BUFFER
   GOTO LOOP1

   RETLW 0


DY MOVLW 0x80
   MOVWF BUFFER
LP1 DECFSZ BUFFER
   GOTO LP1

   RETLW 0


;----------------
MAIN MOVLW 40H
 TRIS RB  ;置RB5输出,RB6输入
;---------------
  MOVLW 0
  TRIS RA
  CLRF PORTA
  MOVLW B'11111111'
  MOVWF PORTA
  call DELAY1
  call DELAY1
  call DELAY1
  call DELAY1
  MOVLW B'11111111'
  MOVWF PORTA

  MOVLW 0x05
  MOVWF BYTE
  MOVLW BITNUM
   MOVWF COUNT
BEGIN0 BCF RB,5
   ;CALL  DELAY1
  MOVLW 0x11 ;发送时的延时常数30
   MOVWF BUFFER
LOOPy1x DECFSZ BUFFER
   GOTO LOOPy1x

L20 RRF BYTE
   BTFSC STATUS,C
   BSF RB,5
   BTFSS STATUS,C
   BCF RB,5
   CALL DELAY
   DECFSZ COUNT
   GOTO L20
   BSF RB,5
   CALL DELAY

   CALL DELAY
  MOVLW 0x06
  MOVWF BYTE
  MOVLW BITNUM
   MOVWF COUNT
  BCF RB,5
  MOVLW 0x11 ;发送时的延时常数30
   MOVWF BUFFER
LOOPx1 DECFSZ BUFFER
   GOTO LOOPx1

L252 RRF BYTE
   BTFSC STATUS,C
   BSF RB,5
   BTFSS STATUS,C
   BCF RB,5
   CALL DELAY52
   CALL DELAY52
   DECFSZ COUNT
   GOTO L252
   BSF RB,5
   CALL DELAY52
   CALL DELAY52
 call DELAY

;===========================
  MOVLW 0x07
  MOVWF BYTE
  MOVLW BITNUM
   MOVWF COUNT
  BCF RB,5
   ;CALL  DELAY1
  MOVLW 0x11 ;发送时的延时常数30
   MOVWF BUFFER
LOOPy1 DECFSZ BUFFER
   GOTO LOOPy1

L201 RRF BYTE
   BTFSC STATUS,C
   BSF RB,5
   BTFSS STATUS,C
   BCF RB,5
   CALL DELAY
   DECFSZ COUNT
   GOTO L201
   BSF RB,5
   CALL DELAY

;===========================

;===========================
  MOVLW 0x08
  MOVWF BYTE
  MOVLW BITNUM
   MOVWF COUNT
  BCF RB,5
   ;CALL  DELAY1
  MOVLW 0x11 ;发送时的延时常数30
   MOVWF BUFFER
LOOPy2 DECFSZ BUFFER
   GOTO LOOPy2

L202 RRF BYTE
   BTFSC STATUS,C
   BSF RB,5
   BTFSS STATUS,C
   BCF RB,5
   CALL DELAY
   DECFSZ COUNT
   GOTO L202
   BSF RB,5
   CALL DELAY

;===========================
;===========================
  MOVLW 0xAA
  MOVWF BYTE
  MOVLW BITNUM
   MOVWF COUNT
  BCF RB,5
   ;CALL  DELAY1
  MOVLW 0x11 ;发送时的延时常数30
   MOVWF BUFFER
LOOPy3 DECFSZ BUFFER
   GOTO LOOPy3

L203 RRF BYTE
   BTFSC STATUS,C
   BSF RB,5
   BTFSS STATUS,C
   BCF RB,5
   CALL DELAY
   DECFSZ COUNT
   GOTO L203
   BSF RB,5
   CALL DELAY
 call DY
 call DY
;===========================;----------
;===========================
  MOVLW 0xAB
  MOVWF BYTE
  MOVLW BITNUM
   MOVWF COUNT
  BCF RB,5
   ;CALL  DELAY1
  MOVLW 0x11 ;发送时的延时常数30
   MOVWF BUFFER
LOOPy4 DECFSZ BUFFER
   GOTO LOOPy4

L204 RRF BYTE
   BTFSC STATUS,C
   BSF RB,5
   BTFSS STATUS,C
   BCF RB,5
   CALL DELAY
   DECFSZ COUNT
   GOTO L204
   BSF RB,5
   CALL DELAY
 call DY
 call DY

;===========================
;===========================
  MOVLW 0xAC
  MOVWF BYTE
  MOVLW BITNUM
   MOVWF COUNT
  BCF RB,5
   ;CALL  DELAY1
  MOVLW 0x11 ;发送时的延时常数30
   MOVWF BUFFER
LOOPy5 DECFSZ BUFFER
   GOTO LOOPy5

L205 RRF BYTE
   BTFSC STATUS,C
   BSF RB,5
   BTFSS STATUS,C
   BCF RB,5
   CALL DELAY
   DECFSZ COUNT
   GOTO L205
   BSF RB,5
   CALL DELAY
 call DY
 call DY

;===========================
;===========================
  MOVLW 0xAD
  MOVWF BYTE
  MOVLW BITNUM
   MOVWF COUNT
  BCF RB,5
   ;CALL  DELAY1
  MOVLW 0x11 ;发送时的延时常数30
   MOVWF BUFFER
LOOPy6 DECFSZ BUFFER
   GOTO LOOPy6

L206 RRF BYTE
   BTFSC STATUS,C
   BSF RB,5
   BTFSS STATUS,C
   BCF RB,5
   CALL DELAY
   DECFSZ COUNT
   GOTO L206
   BSF RB,5
   CALL DELAY
 call DY
;===========================
;===========================
  MOVLW 0xAE
  MOVWF BYTE
  MOVLW BITNUM
   MOVWF COUNT
  BCF RB,5
   ;CALL  DELAY1
  MOVLW 0x11 ;发送时的延时常数30
   MOVWF BUFFER
LOOPy7 DECFSZ BUFFER
   GOTO LOOPy7

L207 RRF BYTE
   BTFSC STATUS,C
   BSF RB,5
   BTFSS STATUS,C
   BCF RB,5
   CALL DELAY
   DECFSZ COUNT
   GOTO L207
   BSF RB,5
   CALL DELAY
 call DY
 call DY

;===========================
  CLRF BYTE
  MOVLW BITNUM
  MOVWF COUNT
TEST BTFSC RB,6  ;起始位为一低电平
  GOTO TEST
  CALL DELAY
  CALL DELAY52

 ; call DELAY52
;=========================接收数据

START BTFSC RB,6
  BSF BYTE,7  ;收到高电平
  BTFSS RB,6
  BCF BYTE,7  ;收到低电平
  DECFSZ COUNT
 
  GOTO L1  ;一个字节未收完,收下一位
  CALL DELAYRx
 ; call DELAY52
  bcf STATUS,C  ;;参考网站PIC16的程序 ===========
 
  MOVLW  BYTE
  MOVWF RxData
 
 GOTO TRANSMIT ; 准备发送

L1  RRF BYTE
    ;CALL DELAYRx ; DELAY 应延时1B=104US

   MOVLW   0x20   ;接收时延时常数
   MOVWF BUFFER ;在4MHZ下,9600波特率延时常数为23
LPPRx    DECFSZ BUFFER
   GOTO LPPRx
    GOTO START


;=========================发送数据

TRANSMIT
   MOVLW BITNUM
   MOVWF COUNT
BEGIN BCF RB,5
   ;CALL  DELAY1
   call DELAY52
L2 RRF BYTE
   BTFSC STATUS,C
   BSF RB,5
   BTFSS STATUS,C
   BCF RB,5
   CALL DELAY
   DECFSZ COUNT
   GOTO L2
   BSF RB,5
   CALL DELAY
 ;  CALL  EEPROM_Write
   GOTO MAIN ;TEST

 

EEPROM_Write

 BCF STATUS,RP0
 MOVLW 00H
 ; movfw wd
  MOVWF EEADR
 ;incf wd,w
 ; movwf wd
 ; movfw 0H
 ; movwf RxBuf
 ; MOVF RxBuf,W
  MOVF  RxData,W
  MOVWF EEDATA
  BSF STATUS,RP0
  BSF EECON1,WREN
  NOP
  BCF INTCON,GIE
  MOVLW 0x55
  MOVWF EECON2
  MOVLW 0xAA
  MOVWF EECON2
  BSF EECON1,WR
  BSF INTCON,GIE
;  incf FSR
;  decfsz  R8

;  MOVFW BYTE
;  MOVWF PORTA
   RETLW 0
;-------
   END
;-------

 

1楼 0 0 回复
  • xilinxue

    xilinxue   |   当前状态:在线

    总积分:16186  2025年可用积分:0

    注册时间: 2008-06-26

    最后登录时间: 2020-03-22

    空间 发短消息加为好友

    xilinxue   发表于 2008/11/6 18:49:30

       他们之间有的区别和相同的地方,用C写程序可读性好,但是产生代码效率不高,他们之间相同的地方就是中断服务程序都是非常简洁的,因为这个是中断程序所要求的
    2楼 回复本楼

    引用 xilinxue 2008/11/6 18:49:30 发表于2楼的内容

总共 , 当前 /