串口通信系统设计--C51单片机

本文详细描述了一个单片机实验项目,目标是通过C语言编程实现两片单片机之间的串口通信,通过按下K1键控制另一片单片机的LED灯状态。实验涉及硬件电路图、发送和接收程序的编写,展示了串行通信的基本原理和技术应用。
摘要由CSDN通过智能技术生成

实验项目:串口通信系统设计
实验目的:本系统设计的目的是使学生掌握单片机的串行通信技术。深刻理解单片机串行通信系统的功能和运行原理,掌握单片机软硬件系统开发的技巧。
具体要求两片单片机都工作于串口模式1,甲单片机的K1按键每按一下可通过串口分别依次控制乙单片机的LED1闪烁,LED2闪烁,LED1和LED2同时闪烁,关闭所有LED。

实验器材:protues,keil uvisio5

  • 实验仿真器材

  • 实验原理(硬件电路图)
    在这里插入图片描述

实验代码
c语言:
send程序

#include<reg51.h>
#define uchar unsigned char
sbit K1=P1^0;              
sbit LED1=P0^0;
sbit LED2=P0^3;
void delay()            
{
              uchar i,j;
              for(i=200;i>0;i--)
              for(j=500;j>0;j--);
}
            
void conveysymbol(uchar c)   
{
              SBUF=c;                    
              while(TI==0);              
              TI=0;                  
}

void main()
{
    uchar model=0;         
    SCON=0x40;                             
    TMOD=0x20;                                     
    PCON=0x00;                                    
    TH1=0xfd;                                 
    TL1=0xfd;
    TI=0;                                 
    TR1=1;                                
 while(1)
              {
                  if(K1==0)       
                          {
                                 while(K1==0);               
                                 model=(model+1)%4;
                          }
                            switch(model)
                            {
                                          case 0: LED1=LED2=0; break;                  
                                          case 1: conveysymbol('A');LED1=~LED1;LED2=0; break;    
                                          case 2: conveysymbol('B');LED2=~LED2;LED1=0; break;    
                                          case 3: conveysymbol('C');LED1=~LED1;LED2=LED1;break;    
                            }
                            delay();          
              }

}

recieve程序

#include<reg51.h>
#define uchar unsigned char
sbit LED1=P0^0;              
sbit LED2=P0^3;              
void delay();                  
void main()
{
              SCON=0x50;            
              TMOD=0x20;            
              PCON=0x00;           
              TH1=0xfd;            
              TL1=0xfd;
              RI=0;                   
              TR1=1;               
              LED1=LED2=1;         
              while(1)
              {
                            if(RI)               
                            {
                                          RI=0;         
                                          switch(SBUF)
                                          {
                                                        case 'A': LED1=~LED1;LED2=1;break; 
                                                        case 'B': LED2=~LED2;LED1=1;break; 
                                                        case 'C': LED1=~LED1;LED2=~LED2; 
                                          }
                            }
                            else LED1=LED2=1;
                            delay();
              }

}
void delay()
{
              uchar i,j;
              for(i=200;i>0;i--)
              for(j=500;j>0;j--);
}

汇编语言代码
send程序

ORG  0000H
START:
MOV SCON,#50H
MOV PCON,#00H
MOV TMOD,#20H
MOV TH1,#0FDH
MOV TL1,#0FDH
CLR RI
SETB TR1
MOV P0,#0FFH               
LOOP1:
JNB RI,LOOP2                     
CLR RI
M1:
MOV A,SBUF
CJNE A,#'A',M2
MOV A,P0
  ORL A,#08H                             
  XRL A,#0F7H               
  MOV P0,A         
  H1:
  JNB RI,H1
  CLR RI
  ACALL DELAY
 LJMP LOOP1
M2:
MOV A,SBUF
CJNE A,#'B',M3
MOV A,P0
ORL A,#01H                    
  XRL A,#0FEH           
  MOV P0,A        
LJMP H1
M3:
MOV A,P0
  XRL A,#0FFH         
  MOV P0,A
LJMP H1
LOOP2:
MOV P0,#0FFH 
ACALL DELAY
LJMP LOOP1
DELAY:			;@11.0592MHz
	PUSH 30H
	MOV 30H,#218
NEXT:
	DJNZ 30H,NEXT
	POP 30H

RET
 END

recieve程序

ORG  0000H
START:
MOV SCON,#40H
MOV PCON,#00H
MOV TMOD,#20H
MOV TH1,#0FDH
MOV TL1,#0FDH
CLR TI
SETB TR1
MOV R2,#00H
MOV R3,#04H
MOV P1,#0FFH
MOV P0,#0FFH               //1111 1111
LOOP1:                
 ACALL DELAY
 MOV A,P1
  CJNE A,#0FEH,M1
D1:
   MOV A,P1
   CJNE A,#0FFH,D1
   INC R2
   MOV A,R2
   MOV B,R3
   DIV AB
   MOV A,B
   MOV R2,A
M1: 
  CJNE R2,#00H,M2
  MOV P0,#0FFH
  ACALL DELAY
LJMP LOOP1
M2:
  CJNE R2,#01H,M3
  MOV A,P0
  ORL A,#08H                    
  XRL A,#0F7H              
  MOV P0,A                 
MOV SBUF,#'A'
H1:
JNB TI,H1
CLR TI
ACALL DELAY
LJMP LOOP1
M3:
  CJNE R2,#02H,M4
  MOV A,P0
ORL A,#01H                    
  XRL A,#0FEH         
  MOV P0,A        
MOV SBUF,#'B'
LJMP H1
M4:
MOV A,P0
  XRL A,#0FFH         
  MOV P0,A
MOV SBUF,#'C'
LJMP H1  
  DELAY:			;@11.0592MHz
	PUSH 30H
	MOV 30H,#218
NEXT:
	DJNZ 30H,NEXT
	POP 30H
	RET
END

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值