基于C51的双机通信的设计与实现[附源码和仿真图]

研究背景

这个实验基于 C51 单片机的串行通信是嵌入式系统和微控制器课程中常见的实验之一。背景涉及以下几个方面:

1. 嵌入式系统:

嵌入式系统是一种特殊的计算机系统,通常用于控制、监视或执行特定功能。在嵌入式系统中,微控制器扮演着重要角色,负责控制设备的功能和行为。

2. 串行通信:

串行通信是一种数据传输方式,通过一个引脚逐位传输数据,相对于并行通信,它需要较少的引脚并能在长距离传输时降低干扰。在嵌入式系统中,串行通信常用于不同设备之间的数据传输。

3. C51 单片机:

C51 是一款基于 8051 微控制器的变体,常用于嵌入式系统开发。它具有较强的功能和灵活性,可用于各种应用领域。

4. 实验目的:

这个实验的目的通常是让我熟悉单片机的串口通信设置和使用,理解串行通信的原理和基本概念。通过实验,能够掌握如何配置单片机的串行通信模块、发送和接收数据,并将其应用于实际的嵌入式系统中。

这种实验背景下,能够通过编写代码、连接硬件以及进行测试,深入了解嵌入式系统中串行通信的重要性和应用。同时,通过这个实验,能够培养解决问题和调试的能力,为日后在嵌入式系统开发领域打下坚实的基础。

2 需求分析 

        2.1 功能需求分析

这是基于 C51 单片机的串行通信实验时,需求分析主要包括以下几个方面:

        1. 功能性需求:

           - 串口通信功能:实现两个 C51 单片机之间的串行通信,包括数据的发送和接收。

           - 按键检测:通过检测特定引脚的状态,实现按键的检测和触发发送操作。

           - 数码管显示:能够根据接收到的数据,在数码管上显示相应的数字。

        2. 性能需求:

           - 稳定性和可靠性:通信过程应稳定可靠,能够正确地发送和接收数据,避免丢失或错误的数据传输。

           - 实时性:能够及时响应按键操作和接收到的数据,保证通信过程的实时性。

        3. 可扩展性需求:

           - 灵活性:具备一定的灵活性和可调整性,能够方便地应用于不同的场景或进行功能扩展。

           - 适应性:能够适应不同的串口设置和数据传输速率,以适应不同的需求。

        4. 学习性需求:

           - 教育目标:满足教学目标,帮助学生理解串行通信的基本原理和单片机编程的应用。

           - 实践能力培养:通过实验培养学生的动手能力和问题解决能力,让他们在实际操作中学到更多。

        这些需求分析的核心在于实现串行通信的功能,并通过实验达到教学目标,通过实践掌握串行通信的原理和应用。同时,实验要求在稳定性和可靠性上有较好的表现,确保通信过程的准确性和实时性。

3 系统总体设计

两个单片机进行进行串口通信,单片机1 按下单片机2数码管显示,单片机2按下单片机1数码管显示

4 系统详细设计

(一)、单片机一的代码设计与测试:

        1. delay 函数:

           - 功能:提供延时功能,用于暂停程序一段时间。

           - 实现:通过循环实现延时,根据输入的参数 k,进行 k 次循环延时。

void delay(int k)				
{
    int i;
    for(i=0;i<k;i++);
}

2. display 函数:

   - 功能:根据传入的数字,在数码管上显示相应的数字。

   - 实现:使用 switch-case 结构,根据传入的数字 m,设置 P2 端口的值,以在数码管上显示相应数字的片段。

void display(uchar m)
{
  switch(m)
	    { 
	     case 0:   P2=0x3F;break;
	     case 1:   P2=0x06;break;
	     case 2:   P2=0x5B;break;
	     case 3:   P2=0x4F;break;
	     case 4:   P2=0x66;break;
	     case 5:   P2=0x6D;break;
	     case 6:   P2=0x7D;break;
	     case 7:   P2=0x07;break;
	     case 8:   P2=0x7F;break;
	     case 9:   P2=0x6F;break;
	     case 10:  P2=0x77;break;
	     case 11:  P2=0x7C;break;
	     case 12:  P2=0x39;break;
	     case 13:  P2=0x5E;break;
	     case 14:  P2=0x79;break;
	     default:  P2=0x71;break;
	   }


}

3. 中断服务函数 int_s:

   - 功能:处理串口中断事件,接收和发送数据,并在数码管上显示接收到的数据。

   - 实现:

       - 禁用串口中断(ES=0)。

       - 如果接收到数据(RI 标志位为 1),将接收到的数据存储在 `buffer` 中,并调用 `display(buffer)` 在数码管上显示接收到的数字。

       - 如果发送完成(TI 标志位为 1),则清除发送完成标志位(TI=0)。

       - 最后重新使能串口中断(ES=1)。

void Init4()
{
    EA=1;
    ES=1;
    SCON=0X50;	
    TMOD=0X20; 
    TH1=0XE6; //1200bps, 12Mhz
    TR1=1;

}
   
void int_s() interrupt 4
{
  
  ES=0;
  if(RI==1)
  {  
    buffer=SBUF;
	
	RI=0;

	display(buffer);
   }
   if(TI==1)
  { TI=0;	 }
  	ES=1;
	return;
}

4. 主函数 main:

   - 功能:包含整个程序的主要逻辑。

   - 实现:

       - 初始化数码管显示(`display(buffer)`)。

       - 全局中断使能(EA=1)。

       - 配置串口工作模式和波特率等设置。

       - 进入一个无限循环:

           - 持续检测按键状态,当按键未按下时,一直处于这个检测状态。

           - 当检测到按键按下时,延时一段时间后再次检测按键状态。

           - 如果按键依然按下,将计数器 `xx` 自增,并将其值发送给另一个设备。

           - 如果计数器达到 16,将其重置为 0。

           - 等待按键释放,进入下一轮循环。

void main()
{  
    display(buffer);
   Init4();
    while(1)
     { while(key==1)			
        {;}
       if(key==0)				
       delay(10);
	   if(key==0) 
	 
	 { 
	   xx=xx+1;					
	   if(xx==16)
	    {
		  xx=0;
		}
		SBUF=xx; 
	  }
	  while(key==0)				
	   {
     }
      
	 }
}

由于是两块单片机,两块单片机的功能都是一样的都有接受发的功能,所以两个单片机的代码都是一样的。

5 系统测试

双机通信


资料源码及相关资料大家可关注公众号获取

  • 24
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dannysky_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值