5.ASM5_USART: 串口发送0-9及换行,接收任意数据并显示
/**
******************************************************************************
* @file USART.asm
* @author Alex——小白
* @version V1.0
* @date 2019.9.1
* @brief 自动发送数据0-9和换行,接收的数据会打印该数据
* @store 有家Proteus仿真店子
* @Link https://shop484534014.taobao.com/
* @Email 844545015@qq.com
******************************************************************************
* @attention All Rights Reserved
**/
ORG 0000H ;程序执行的起始地址
LJMP Main ;跳转到main函数
ORG 0023H ;串口中断地址
LJMP UARTInterrupt ;声明UART是中断4函数名称
ORG 0100H ;程序跳转到0100H开始执行
Main:
MOV SP,#60H
LCALL InitUART ;初始化串口参数
MOV DPTR,#Num_Tab ;DPTR指向数组
MOV R0,#00H ;变量清零
While:
MOV A,R0 ;变量赋值
MOVC A,@A+DPTR ;读取数组数据
LCALL SendOneByte ;串口打印数据
LCALL Delay ;延时1s
INC R0 ;变量自加
CJNE R0,#0CH,Next ;判断是否为12,是清零,否则跳转
MOV R0,#00H
Next:
SJMP While
InitUART:
MOV TMOD,#20H ;2400bps
MOV SCON,#50H ;设置波特率重装值(256-12000000/12/32/2400)=243=F3
MOV TH1,#0F3H ;赋初值
MOV TL1,TH1
MOV PCON,#00H
SETB EA ;总中断开启
SETB ES ;串口中断开启
SETB TR1 ;定时器1中断开启
RET
UARTInterrupt:
PUSH ACC ;ACC值押栈,避免主循环使用冲突
JB RI,Is_Receive ;判断是否在接收数据
CLR TI ;否则清除发送标志位
RETI
Is_Receive:
CLR RI ;清除接收标志位
MOV A,SBUF ;将获取的数据储存到A
LCALL SendOneByte ;接收数据,再发送出去
POP ACC ;AC值释放
RETI
SendOneByte:
CLR ES ;关闭串口中断
CLR TI ;清除发送标志位
MOV SBUF,A ;将数据A发送出去
SendFinish:
JNB TI,SendFinish ;判断是否发送完毕
CLR TI ;是,则清除标志位
SETB ES ;开启串口中断
RET
Delay: ;t=t1*8=1s,修改R5的值即可更改时间(不精准)
MOV R5, #08H ;单周期,8次
D1: ;t1=t2*250=500*250=125000
MOV R6, #0FAH
D2:
MOV R7, #0FAH ;t2=250*2=500
D3:
DJNZ R7, D3 ;R7=250自减,直到为0跳出循环,双周期
DJNZ R6, D2 ;R6=250自减,直到为0跳出循环,双周期
DJNZ R5, D1 ;R5=100自减,直到为0跳出循环,双周期
RET
Num_Tab: ;0-9,0A0D换行
DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,0AH,0DH
END
/*
MOV TMOD,#020H ;9600bps
MOV TL1,#0FDH ;设置波特率重装值(256-11059200/12/32/9600)=253=FD
MOV TH1,#0FDH
*/
1、学习目的
学习51单片机与PC的串口通信技术。
2、学习内容
本实验单片机作发送方同时接收方,PC机作接收方同时发送方,单片机发送从0-9的数字,并在PC机上显示,并等待PC串口助手发数据。PC机上需要运行串口调试助手或直接使用Proteus虚拟串口。
串口波特率:根据晶振而变化,代码中给出了常见12M和11.0592M时钟的波特率2400、9600计算方法。
5.ASM5_USART: 串口发送0-9及换行,接收任意数据并显示
/**
******************************************************************************
* @file USART.asm
* @author Alex——小白
* @version V1.0
* @date 2019.9.1
* @brief 自动发送数据0-9和换行,接收的数据会打印该数据
* @store 有家Proteus仿真店子
* @Link https://shop484534014.taobao.com/
* @Email 844545015@qq.com
******************************************************************************
* @attention All Rights Reserved
**/
ORG 0000H ;程序执行的起始地址
LJMP Main ;跳转到main函数
ORG 0023H ;串口中断地址
LJMP UARTInterrupt ;声明UART是中断4函数名称
ORG 0100H ;程序跳转到0100H开始执行
Main:
MOV SP,#60H
LCALL InitUART ;初始化串口参数
MOV DPTR,#Num_Tab ;DPTR指向数组
MOV R0,#00H ;变量清零
While:
MOV A,R0 ;变量赋值
MOVC A,@A+DPTR ;读取数组数据
LCALL SendOneByte ;串口打印数据
LCALL Delay ;延时1s
INC R0 ;变量自加
CJNE R0,#0CH,Next ;判断是否为12,是清零,否则跳转
MOV R0,#00H
Next:
SJMP While
InitUART:
MOV TMOD,#20H ;2400bps
MOV SCON,#50H ;设置波特率重装值(256-12000000/12/32/2400)=243=F3
MOV TH1,#0F3H ;赋初值
MOV TL1,TH1
MOV PCON,#00H
SETB EA ;总中断开启
SETB ES ;串口中断开启
SETB TR1 ;定时器1中断开启
RET
UARTInterrupt:
PUSH ACC ;ACC值押栈,避免主循环使用冲突
JB RI,Is_Receive ;判断是否在接收数据
CLR TI ;否则清除发送标志位
RETI
Is_Receive:
CLR RI ;清除接收标志位
MOV A,SBUF ;将获取的数据储存到A
LCALL SendOneByte ;接收数据,再发送出去
POP ACC ;AC值释放
RETI
SendOneByte:
CLR ES ;关闭串口中断
CLR TI ;清除发送标志位
MOV SBUF,A ;将数据A发送出去
SendFinish:
JNB TI,SendFinish ;判断是否发送完毕
CLR TI ;是,则清除标志位
SETB ES ;开启串口中断
RET
Delay: ;t=t1*8=1s,修改R5的值即可更改时间(不精准)
MOV R5, #08H ;单周期,8次
D1: ;t1=t2*250=500*250=125000
MOV R6, #0FAH
D2:
MOV R7, #0FAH ;t2=250*2=500
D3:
DJNZ R7, D3 ;R7=250自减,直到为0跳出循环,双周期
DJNZ R6, D2 ;R6=250自减,直到为0跳出循环,双周期
DJNZ R5, D1 ;R5=100自减,直到为0跳出循环,双周期
RET
Num_Tab: ;0-9,0A0D换行
DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,0AH,0DH
END
/*
MOV TMOD,#020H ;9600bps
MOV TL1,#0FDH ;设置波特率重装值(256-11059200/12/32/9600)=253=FD
MOV TH1,#0FDH
*/
1、学习目的
学习51单片机与PC的串口通信技术。
2、学习内容
本实验单片机作发送方同时接收方,PC机作接收方同时发送方,单片机发送从0-9的数字,并在PC机上显示,并等待PC串口助手发数据。PC机上需要运行串口调试助手或直接使用Proteus虚拟串口。
串口波特率:根据晶振而变化,代码中给出了常见12M和11.0592M时钟的波特率2400、9600计算方法。
举报