- 打卡等级:常住居民III
- 打卡总天数:112
- 最近打卡:2025-06-29 00:35:48
管理员
- 积分
- 17153
|
//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//若无特别说明,工作频率一般为11.0592MHz
#define NONE_PARITY 0 //无校验
#define ODD_PARITY 1 //奇校验
#define EVEN_PARITY 2 //偶校验
#define MARK_PARITY 3 //标记校验
#define SPACE_PARITY 4 //空白校验
#define PARITYBIT NONE_PARITY //定义校验位
//-----------------------------------------
AUXR EQU 08EH //辅助寄存器
P_SW1 EQU 0A2H //外设功能切换寄存器1
S1_S0 EQU 40H //P_SW1.6
S1_S1 EQU 80H //P_SW1.7
BUSY BIT 20H.0 //忙标志位
P0M1 DATA 0x93 ; P0M1.n,P0M0.n =00--->Standard, 01--->push-pull
P0M0 DATA 0x94 ; =10--->pure input, 11--->open drain
P1M1 DATA 0x91 ; P1M1.n,P1M0.n =00--->Standard, 01--->push-pull
P1M0 DATA 0x92 ; =10--->pure input, 11--->open drain
P2M1 DATA 0x95 ; P2M1.n,P2M0.n =00--->Standard, 01--->push-pull
P2M0 DATA 0x96 ; =10--->pure input, 11--->open drain
P3M1 DATA 0xB1 ; P3M1.n,P3M0.n =00--->Standard, 01--->push-pull
P3M0 DATA 0xB2 ; =10--->pure input, 11--->open drain
P4M1 DATA 0xB3 ; P4M1.n,P4M0.n =00--->Standard, 01--->push-pull
P4M0 DATA 0xB4 ; =10--->pure input, 11--->open drain
P5M1 DATA 0xC9 ; P5M1.n,P5M0.n =00--->Standard, 01--->push-pull
P5M0 DATA 0xCA ; =10--->pure input, 11--->open drain
P6M1 DATA 0xCB ; P6M1.n,P6M0.n =00--->Standard, 01--->push-pull
P6M0 DATA 0xCC ; =10--->pure input, 11--->open drain
P7M1 DATA 0xE1 ;
P7M0 DATA 0xE2 ;
//-----------------------------------------
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP UART_ISR
//-----------------------------------------
ORG 0100H
MAIN:
CLR A
MOV P0M1, A ;设置为准双向口
MOV P0M0, A
MOV P1M1, A ;设置为准双向口
MOV P1M0, A
MOV P2M1, A ;设置为准双向口
MOV P2M0, A
MOV P3M1, A ;设置为准双向口
MOV P3M0, A
MOV P4M1, A ;设置为准双向口
MOV P4M0, A
MOV P5M1, A ;设置为准双向口
MOV P5M0, A
MOV P6M1, A ;设置为准双向口
MOV P6M0, A
MOV P7M1, A ;设置为准双向口
MOV P7M0, A
CLR BUSY
CLR EA
MOV SP,#3FH
MOV A,P_SW1
ANL A,#03FH //S1_S0=0 S1_S1=0
MOV P_SW1,A //(P3.0/RxD, P3.1/TxD)
// MOV A,P_SW1
// ANL A,#03FH //S1_S0=1 S1_S1=0
// ORL A,#S1_S0 //(P3.6/RxD_2, P3.7/TxD_2)
// MOV P_SW1,A
//
// MOV A,P_SW1
// ANL A,#03FH //S1_S0=0 S1_S1=1
// ORL A,#S1_S1 //(P1.6/RxD_3, P1.7/TxD_3)
// MOV P_SW1,A
#if (PARITYBIT == NONE_PARITY)
MOV SCON,#50H //8位可变波特率
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
MOV SCON,#0DAH //9位可变波特率,校验位初始为1
#elif (PARITYBIT == SPACE_PARITY)
MOV SCON,#0D2H //9位可变波特率,校验位初始为0
#endif
//-------------------------------
MOV AUXR,#40H //定时器1为1T模式
MOV TMOD,#00H //定时器1为模式0(16位自动重载)
MOV TL1,#0E8H //设置波特率重装值(65536-11059200/4/115200)
MOV TH1,#0FFH
SETB TR1 //定时器1开始运行
SETB ES //使能串口中断
SETB EA
MOV DPTR,#TESTSTR //发送测试字符串
LCALL SENDSTRING
SJMP $
;-----------------------------------------
TESTSTR:
DB "STC15F2K60S2 Uart1 Test !",0DH,0AH,0
;/*----------------------------
;UART 中断服务程序
;----------------------------*/
UART_ISR:
PUSH ACC
PUSH PSW
JNB RI,CHECKTI //检测RI位
CLR RI //清除RI位
MOV P0,SBUF //P0显示串口数据
MOV C,RB8
MOV P2.2,C //P2.2显示校验位
CHECKTI:
JNB TI,ISR_EXIT //检测TI位
CLR TI //清除TI位
CLR BUSY //清忙标志
ISR_EXIT:
POP PSW
POP ACC
RETI
;/*----------------------------
;发送串口数据
;----------------------------*/
SENDDATA:
JB BUSY,$ //等待前面的数据发送完成
MOV ACC,A //获取校验位P (PSW.0)
JNB P,EVEN1INACC //根据P来设置校验位
ODD1INACC:
#if (PARITYBIT == ODD_PARITY)
CLR TB8 //设置校验位为0
#elif (PARITYBIT == EVEN_PARITY)
SETB TB8 //设置校验位为1
#endif
SJMP PARITYBITOK
EVEN1INACC:
#if (PARITYBIT == ODD_PARITY)
SETB TB8 //设置校验位为1
#elif (PARITYBIT == EVEN_PARITY)
CLR TB8 //设置校验位为0
#endif
PARITYBITOK: //校验位设置完成
SETB BUSY
MOV SBUF,A //写数据到UART数据寄存器
RET
;/*----------------------------
;发送字符串
//----------------------------*/
SENDSTRING:
CLR A
MOVC A,@A+DPTR //读取字符
JZ STRINGEND //检测字符串结束标志
INC DPTR //字符串地址+1
LCALL SENDDATA //发送当前字符
SJMP SENDSTRING
STRINGEND:
RET
//-----------------------------------------
END
|
|