<微机原理>[汇编语言]-[实验六]串行口实验

实验六 串行口实验

一、实验目的

  1. 学习MCS-51串行口的工作原理及使用方法
  2. 学习MCS-51串行口的初始化程序、应用程序的编写和调试

二、实验仪器

  1. 普中A2开发板(STC89C52)
  2. keil5
  3. stc-isp

三、实验内容

  1. 矩阵按键作输入口,每当有按键按下时

    1)将开关编号(0-F)存入内部数据存储器

    2)通过本机的TXD和RXD进行串行通信,发送开关编号,接收的数据存入另一内部数据存储器, 要求采用方式1,波特率为4800b/s,fosc=11.0592MHz;

    3)将接收到的数据显示在LED数码管。

四、流程框图

在这里插入图片描述

五、实验程序

ORG     0000H
    LJMP    START
    ORG     0023H   
    LJMP    UARTSVE
    ORG     1000H
START:
    KEY_VALUE   EQU     R0      ;R0 存储键值
    RX_SBUF     EQU     R1      ;
    ACALL   UARTINIT            ;串口初始化
MAIN:
    ACALL   KEYSCAN             ;矩阵按键扫描
    ACALL   DTSEG               ;数码管显示
    AJMP    MAIN                ;主程序循环
UARTINIT:
    ANL     PCON,   #7FH        ;波特率不倍速
    MOV     SCON,   #50H        ;8位数据,可变波特率
    ANL     TMOD,   #0FH        ;清除定时器1模式位
    ORL     TMOD,   #20H        ;设定定时器1为8位重装方式
    MOV     TL1 ,   #0FAH       ;设定定时器初值 波特率4800
    MOV     TH1 ,   #0FAH       ;设定定时器重装值
    CLR     ET1                 ;禁止定时器1中断
    SETB    TR1                 ;启动定时器1
    SETB    EA                  ;打开中断
    SETB    ES                  ;允许串行口中断
    
    RET
    
DTSEG:
    MOV     DPTR,   #TAB1       ;指向字形码表首地址
    MOV     A   ,   RX_SBUF     ;
    MOVC    A   ,   @A+DPTR     ;
    MOV     P0  ,   A           ;
    RET
KEYSCAN:                        ;矩阵按键扫描
    MOV     P1  ,   #0FH        ;进行列检测
    MOV     A   ,   P1          ;读取P1的值
    CJNE    A   ,   #0FH    ,XD     ;判断按键是否按下
    RET
XD: ACALL   DELAY10MS           ;延时10ms进行消抖
    MOV     A   ,   P1          ;再次读取按键的值
    CJNE    A   ,   #0FH    ,CSLIE ;再次检测键盘是否按下
    RET
CSLIE:                          ;测试列
    MOV     P1  ,   #0FH        ;
    MOV     A   ,   P1          ;
LIE1:                           ;第一列
    MOV     C   ,   P1.3        ;
    JC      LIE2                ;
    MOV     KEY_VALUE   ,   #0  ;
    LJMP    CEHANG              ;跳转到测试行
LIE2:
    MOV     C   ,   P1.2        ;
    JC      LIE3                ;
    MOV     KEY_VALUE   ,   #1  ;
    LJMP    CEHANG              ;
LIE3:
    MOV     C   ,   P1.1        ;
    JC      LIE4                ;
    MOV     KEY_VALUE   ,   #2  ;
    LJMP    CEHANG              ;
LIE4:
    MOV     C   ,   P1.0        ;
    JC      CEHANG              ;
    MOV     KEY_VALUE   ,   #3  ;
    LJMP    CEHANG              ;
CEHANG:                         ;测试行
    MOV     P1  ,   #0F0H       ;
    MOV     A   ,   P1          ;
HANG1:
    MOV     C   ,   P1.7        ;第一行
    JC      HANG2      
    MOV     A   ,   #0          ;
    ADD     A   ,   KEY_VALUE   ;
    MOV     KEY_VALUE   ,   A   ;
LOOP1:
    MOV     C   ,   P1.7        ;
    JNC     LOOP1               ;
    LJMP    PKEY  
HANG2:
    MOV     C   ,   P1.6        ;
    JC      HANG3               ;
    MOV     A   ,   #4
    ADD     A   ,   KEY_VALUE   ;
    MOV     KEY_VALUE   ,   A   ;
LOOP2:
    MOV     C   ,   P1.6        ;
    JNC     LOOP2               ;
    LJMP    PKEY
HANG3:
    MOV     C   ,   P1.5        ;
    JC      HANG4
    MOV     A   ,   #8 
    ADD     A   ,   KEY_VALUE   ;
    MOV     KEY_VALUE   ,   A   ;
LOOP3:
    MOV     C   ,   P1.5        ;
    JNC     LOOP3               ;
    LJMP    PKEY
HANG4:
    MOV     C   ,   P1.4        ;
    JC      RETURN
    MOV     A   ,   #12         ;
    ADD     A   ,   KEY_VALUE   ;
    MOV     KEY_VALUE   ,   A   ;
LOOP4:
    MOV     C   ,   P1.4        ;
    JNC     LOOP4               ;
    LJMP    PKEY  
PKEY:
    ACALL   KEY_P               ;执行按键处理函数
RETURN:
    RET

KEY_P:
    MOV     DPTR,   #JPTAB          ;指向转移指令表
    MOV     A   ,   KEY_VALUE       ;修正变址值
    ADD     A   ,   KEY_VALUE       ;因为AJMP指令有两个字节
    JNC     NADD                    ;判断是否有进位
    INC     DPH                     ;
NADD:
    JMP     @A+DPTR                 ;转向形成的散转地址
JPTAB:
    AJMP    PKEY0       
    AJMP    PKEY1
    AJMP    PKEY2
    AJMP    PKEY3
    AJMP    PKEY4
    AJMP    PKEY5
    AJMP    PKEY6
    AJMP    PKEY7
    AJMP    PKEY8
    AJMP    PKEY9
    AJMP    PKEYA
    AJMP    PKEYB
    AJMP    PKEYC
    AJMP    PKEYD
    AJMP    PKEYE
    AJMP    PKEYF

PKEY0:
    MOV     SBUF,   #00H;
    RET
PKEY1:
    MOV     SBUF,   #01H;
    RET
PKEY2:
    MOV     SBUF,   #02H;
    RET
PKEY3:
    MOV     SBUF,   #03H;
    RET
PKEY4:
    MOV     SBUF,   #04H;
    RET
PKEY5:
    MOV     SBUF,   #05H;
    RET
PKEY6:
    MOV     SBUF,   #06H;
    RET
PKEY7:
    MOV     SBUF,   #07H;
    RET
PKEY8:
    MOV     SBUF,   #08H;
    RET
PKEY9:
    MOV     SBUF,   #09H;
    RET
PKEYA:
    MOV     SBUF,   #0AH;
    RET
PKEYB:
    MOV     SBUF,   #0BH;
    RET
PKEYC:
    MOV     SBUF,   #0CH;
    RET
PKEYD:
    MOV     SBUF,   #0DH;
    RET
PKEYE:
    MOV     SBUF,   #0EH;
    RET
PKEYF:
    MOV     SBUF,   #0FH;
    RET

UARTSVE:  
    JB      RI  ,   RXSVE
    JB      TI  ,   TXSVE
    RETI
RXSVE:
    MOV     RX_SBUF ,   SBUF
    CLR     RI
    RETI
TXSVE:
    CLR     TI
    RETI
    
DELAY10MS:			;@11.0592MHz
	PUSH 30H
	PUSH 31H
	MOV 30H,#18
	MOV 31H,#230
NEXT:
	DJNZ 31H,NEXT
	DJNZ 30H,NEXT
	POP 31H
	POP 30H
	RET
    
DELAY50MS:			;@11.0592MHz
	PUSH 30H
	PUSH 31H
	MOV 30H,#90
	MOV 31H,#158
NEXT1:
	DJNZ 31H,NEXT1
	DJNZ 30H,NEXT1
	POP 31H
	POP 30H
	RET
DELAY1000MS:			;@11.0592MHz
	PUSH 30H
	PUSH 31H
	PUSH 32H
	MOV 30H,#8
	MOV 31H,#1
	MOV 32H,#236
NEXT2:
	DJNZ 32H,NEXT2
	DJNZ 31H,NEXT2
	DJNZ 30H,NEXT2
	POP 32H
	POP 31H
	POP 30H
	RET
TAB1:;0 - F共阴极字形码
    DB      03FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0-9
    DB      77H,7CH,39H,5EH,79H,71H
    DB      40H
    END

六、程序分析

很简单,不想分析了😏😏😏

七、测试报告

在这里插入图片描述

在这里插入图片描述

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
PLC和单片机之间的串口通信可以通过以下步骤实现: 1. 确定通信协议:PLC和单片机之间的通信需要使用一种协议来确保数据的正确传输。常见的协议包括Modbus、Profibus、CAN等。在选择协议时需要考虑通信速率、数据格式、数据传输方式等因素。 2. 配置串口参数:PLC和单片机之间的通信需要使用串口进行数据传输。在进行串口通信前,需要配置串口参数,包括波特率、数据位、停止位、校验位等。这些参数需要在PLC和单片机之间保持一致。 3. 编写通信程序:PLC和单片机之间的通信需要编写相应的程序来实现数据的传输。在PLC中,可以使用Ladder Diagram或者Structured Text等编程语言来编写通信程序。在单片机中,可以使用C语言或者汇编语言等编程语言来编写通信程序。 4. 进行数据传输:在完成通信程序的编写后,可以进行数据传输测试。可以通过发送数据、接收数据等方式来测试通信是否正常。 下面是一个使用Modbus协议进行PLC和单片机串口通信的示例代码: ```c #include <ModbusMaster.h> // 定义ModbusMaster对象 ModbusMaster node; void setup() { // 初始化串口 Serial.begin(9600); // 初始化ModbusMaster对象 node.begin(1, Serial); } void loop() { uint8_t result; uint16_t data[6]; // 读取PLC中的数据 result = node.readHoldingRegisters(0, 6); // 如果读取成功,则输出数据 if (result == node.ku8MBSuccess) { Serial.print("Data: "); for (int i = 0; i < 6; i++) { data[i] = node.getResponseBuffer(i); Serial.print(data[i]); Serial.print(" "); } Serial.println(); } // 延时1秒 delay(1000); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值