1 研究背景
这个实验基于 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 系统测试
双机通信
资料源码及相关资料大家可关注公众号获取