⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.asm

📁 本人写的51开发板的串口通信程序
💻 ASM
字号:
/*
**********************************************************************************************
* Project:	TK7821
* File:		uart.asm
* Contents: The serial communication 
* 程序描述:把收到的数据发送回去
* 硬    件:福华公司提供的51系列开发板
* 目    的:Motorola 08 系列	子程序移植到51系列MCU
* $Date: 09/13/2006   
* Writen by xudong               EMail:xudongjhdd@sohu.com
***********************************************************************************************
*/


;#include "SCIInit.ASM"
/*********************************************************************************************
*轮询方式
*主程序
***********************************************************************************************
*/
SerialBuff  EQU 32H   ;内存中接收或发送数据的地址
SerialCount EQU 01H   ;传送的字节数

ORG 0000H

LJMP START

START: 

    
    ACALL SCIInit         ;调用串行口初始化子程序

MAIN:
  /*MOV A,#SerialCount
    MOV R1,#SerialBuff

    ACALL SCIReN

    RET_ReN:

    JC MAIN
    MOV A,#SerialCount
    MOV R1,#SerialBuff
    ACALL SCISendN
    */
   ACALL SCIRe1
   JC MAIN
   ACALL SCISend1

   ;mov p3,#0xa4
    AJMP MAIN
/*
********************************************************
*SCIInit:串行口初始化子程序----------------------------*
*功 能:对串行口进行初始化,允许SCI,正常码输出,10位数据, *
*      无校验等,允许发送器允许接收器。查询方式收发,    *
*      波特率为4800                                    *
*入 口:无                                              *
*出 口:无                                              *
********************************************************
*/
SCIInit:
    ANL TMOD,#0FH
    ORL TMOD,#20H    ;定时器1 定时方式2
    
    MOV TH1,#0F8H
    MOV TL1,#0F8H    ;4800 15MHz fosc
   
    MOV SCON,#50H    ;串行方式1 允许接收
    MOV PCON,#00H    
    SETB TR1         ;启动定时器1

RET

/*
********************************************************
;SCISend1:串行发送A中的1个字节-------------------------*
;功能描述:串行口发送A中的1个字节数据                   *
;入    口:A=待发送的数据                               *
;出    口:无                                           *
;                                                      *
********************************************************
*/
SCISend1:   MOV SBUF,A      ;待发送的数据放到发送缓冲中
            JNB TI, $       ;判断TI位是否为1,是1就清0
            CLR TI          ;TI清0
            RET
/*
********************************************************
*SCISendN:串行发送N个字节------------------------------*
*功能描述:串行发送以R1为首地址的N个字节数据            *
*入    口:A=字节个数 R1=首地址                         *
*出    口:无                                           *
                                                       *
********************************************************
*/
SCISendN:
   
     JZ   SCISendN_EXIT     ;A中数据为0转
     
SCISendN_1:
         
     PUSH ACC
     MOV A,@R1              ;从存储器中取出待发送的数据
     ACALL  SCISend1
     INC  R1                ;R1加1(待发送下一单元的数据)
 
     POP ACC
     DEC A                  ;字节个数减1
     JNZ SCISendN_1         ;A中数据不等于0转
SCISendN_EXIT:
     
     RET                    ;子程序返回



/*
********************************************************
*SCIRe1:串行接收一个字节->A----------------------------*
*功能描述:(1) 串行接收1个字节的数据放在A中             *
*         (2) 约655350时钟周期内收不到数返回           *
*                                                      *
*入    口:无                                           *
*出    口:A=接收的数据 C=是否收到数据标志 0收到 1未收到*
*                                                      *
********************************************************
*/ 
SCIRe1:

     ;等待接收一个字节数据
    
     MOV R2,#0FFH              ;R2,R3拼成一个16位的寄存器使用(用双重循环实现)
     MOV R3,#0FFH              ;R2,R3放入循环次数(R3相当于高8位,R2相当于低8位)
SCIRe1_1:
     
      JNB RI,LOOP2             ;RI为0转(代表没有可接收数据)
      ;JNB RI,$                                            
      MOV A,SBUF               ;收到的数据放入A中
      CLR RI                   ;RI清0
                                                    
      CLR C                    ;C 清0代表收到数据
                                         
      AJMP SCIRe1_3            ;收到数据,退出 



LOOP1:                         ;相当于C语言中第二层循环
      CJNE R3,#00H,R2_R3_OPER  ;R3不为0转
      SETB C                   ;C置1
      ;MOV A,#0FFH              ;等待时间到,未收到数据,令c=1,A=FF,返回
      AJMP SCIRe1_3            ;未收到数据,C置1并退出 

R2_R3_OPER:  
      MOV R2,#0FFH             ;R2置0FFH进入下一轮循环
      DEC R3                   ;R3减1
      AJMP SCIRe1_1            ;跳转继续执行判断RI是否为1(是否有可接收数据) 
 
LOOP2:                         ;相当于C语言中第一层循环                                        
      DEC R2                   ;R2减1
      CJNE R2,#00H,SCIRe1_1    ;R2不为0转SCIRe1_1处
      AJMP LOOP1               ;R2为0转LOOP1处
                                                
SCIRe1_3:    

   RET
/*
********************************************************
*SCIReN:串行接收N个字节--------------------------------*
*功能描述:串行接收N个字节放在以R1为首地址的内存中      *
*入    口:A=待接收数据的字节数N,R1=接收数据存放的首地址*
*出    口:C=是否收到数据标志 0收到 1未收到             *
*内部调用:SCIRe1                                       *
********************************************************
*/
SCIReN:
     
     JZ SCIReN_EXIT        ;A中数据为0转

SCIReN_1:
     PUSH ACC
     ACALL  SCIRe1         ;调用接收1个字节的子程序
                             
     JB CY,SCIReN_EXIT     ;C=1未收到数据,退出                        

     MOV @R1,A             ;收到数据,放入内存 
                                 
     INC R1                 ;R1+1->R1

     POP ACC
     DEC A                 ;A中数据减1
     JNZ SCIReN_1          ;A中数据不为0转

SCIReN_EXIT:   
;           AJMP RET_ReN


    RET   



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;未调用SCIRe1子程序的SCIReN
SCIReNN:
     JZ SCIReNN_EXIT
  
     
SCIReN_11:
      MOV R0,#0FFH
      NOP
      ;JNB RI,$
      JNB RI,SCIReN_22
     
      MOV @R1,SBUF
      CLR RI 
      NOP
     
      CLR CY                   
      INC R1
      DEC A
      NOP
      JNZ SCIReN_11
      AJMP SCIReNN_EXIT

SCIReN_22:
     
     NOP
     DEC R0
     
     CJNE R0,#00H,SCIReN_11
     
     SETB CY  
      
   
SCIReNN_EXIT:   

RET





END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -