单片机间进行串口通信

说明:

   1、所用仿真软件:Proteus 8 Professional

   2、实现功能:上位机进行了按键操作后,上位机数码管显示按键数值,下位机通过串口获取按键数值并显示

   3、上位机3.1端口(TXD)可直接与下位机3.0(RXD)端口相连,两个单片机需要共地

   4、仿真文件下载


上位机(图中左侧MCU):

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x7f};
void Delayms(uint);
void KeyScan();
void SendData(uint num);
void Init();
uchar num=4;
void main(){
   Init();
   while(1){
     keyScan();
     P1=table[num];
 }
}
void Init(){	//初始化定时器与串口
	TMOD=0x20;	   //设置定时器1 工作方式2
	TH1=0xfd;
	TL1=0xfd;
	TR1=1;		   //启动定时器1 (8位自动重装初始值)
	SM0=0;
	SM1=1;		  //使用串口的 方式1 工作
	REN=1;	   //  允许串口接收数据
	EA=1;	   //开全局中断
	ES=1;  //开串口中断
}
void SendData(uchar num){
	SBUF=num;
	while(!TI);   //串口发送停止位的开始时,内部硬件使TI置1,CPU发出中断申请
	TI=0;
}
void Delayms(uint xms){
 uint i,j;
 for(i=xms;i>0;i--)
   for(j=110;j>0;j--);

}
void KeyScan(){
 if(key1==0)
 {
  Delayms(10);
  if(key1==0)
     num=0;
	 SendData(num);
 }
 if(key2==0)
 {
  Delayms(10);
  if(key2==0)
     num=1;
	 SendData(num);
 }
 if(key3==0)
 {
  Delayms(10);
  if(key3==0)
     num=2;
	 SendData(num);
 }
  if(key4==0)
 {
  Delayms(10);
  if(key4==0)
     num=3;
	 SendData(num);
 }
}
下位机(图中右侧MCU):

#include<reg52.h>
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x7f};
void Init();
uchar num=4;
void main(){
   Init();
   while(1){
     P1=table[num];
 }
}
void Init(){	//初始化定时器与串口
	TMOD=0x20;	   //设置定时器1 工作方式2
	TH1=0xfd;
	TL1=0xfd;
	TR1=1;		   //启动定时器1 (8位自动重装初始值)
	SM0=0;
	SM1=1;		  //使用串口的 方式1 工作
	REN=1;	   //  允许串口接收数据
	EA=1;	   //开全局中断
	ES=1;  //开串口中断
}
void receive() interrupt 4
{
  RI=0;
  num=SBUF;
}

 
仿真结果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值