好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

单片机串行通信实验报告(实验要求、原理、仿真图及例程).doc

30页
  • 卖家[上传人]:鲁**
  • 文档编号:518655837
  • 上传时间:2022-12-11
  • 文档格式:DOC
  • 文档大小:1.66MB
  • / 30 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 真诚为您提供优质参考资料,若有不当之处,请指正《嵌入式系统原理与实验》实验指导实验三 调度器设计基础一、 实验目的和要求1. 熟练使用Keil C51 IDE集成开发环境,熟练使用Proteus软件2. 掌握Keil与Proteus的联调技巧3. 掌握串行通信在单片机系统中的使用4. 掌握调度器设计的基础知识:函数指针二、 实验设备1. PC机 一套2. Keil C51开发系统 一套3. Proteus 仿真系统 一套三、 实验内容1. 甲机通过串口控制乙机LED闪烁(1) 要求a. 甲单片机的K1按键可通过串口分别控制乙单片机的LED1闪烁,LED2闪烁,LED1和LED2同时闪烁,关闭所有的LEDb. 两片8051的串口都工作在模式1,甲机对乙机完成以下4项控制i. 甲机发送“A”,控制乙机LED1闪烁ii. 甲机发送“B”,控制乙机LED2闪烁iii. 甲机发送“C”,控制乙机LED1,LED2闪烁iv. 甲机发送“C”,控制乙机LED1,LED2停止闪烁c. 甲机负责发送和停止控制命令,乙机负责接收控制命令并完成控制LED的动作两机的程序要分别编写d. 两个单片机都工作在串口模式1下,程序要先进行初始化,具体步骤如下:i. 设置串口模式(SCON)ii. 设置定时器1的工作模式(TMOD)iii. 计算定时器1的初值iv. 启动定时器v. 如果串口工作在中断方式,还必须设置IE和ES,并编写中断服务程序。

      2) 电路原理图Figure 1 甲机通过串口控制乙机LED闪烁的原理图(3) 程序设计提示a. 模式1下波特率由定时器控制,波特率计算公式参考:b. 可以不用使用中断方式,使用查询方式实现发送与接收,通过查询TI和RI标志位完成2. 单片机与PC串口通讯及函数指针的使用(1) 要求:a. 编写用单片机求取整数平方的函数b. 单片机把计算结果向PC机发送字符串c. PC机接收计算结果并显示出来d. 可以调用Keil C51 stdio.h 中的printf来实现字符串的发送e. 单片机的数码港显示发送的次数,每9次清零2) 参考电路原理图Figure 2 单片机与PC串口通讯及函数指针的使用原理图(3) 程序设计要求a. 编写求平方函数时,采用函数指针来编写 b. 参考头文件模式,完善设计项目文件结构四、 思考题1. 如果实验1如何使用实验2的成果来改写?2. 请结合实例说明什么是函数指针及如何使用函数指针五、 实验报告要求1. 简述编写C程序,并联合调试程序的过程2. 解释编写的实验程序的代码,描述实验结果3. 解答思考题4. 简述实验的心得《嵌入式系统原理及实验》实验报告Lab 3调度器设计基础一、 甲机通过串口控制乙机LED闪烁(一) 实现原理1. 总体思路通过发送缓冲寄存器SBUF,以及接收缓冲寄存器SBUF,将在甲机上初始化的要发送的数据'A','B','C','D'存入一个数组,通过超级循环内设定的一个按键控制函数,依次发送给乙机,由乙机接收并让相应的LED灯闪烁。

      2. 硬件设计上图所示的是单击Play以后开始仿真,此时没有按键按下,甲机乙机均处于等待状态之下上图所示按键第一次按下,甲机发送字符'A',D1灯闪烁,乙机接收字符'A',并显示相应与甲机D1灯位置对应的D2灯闪烁以上两幅图是在一起的,也许是LED灯启动以及延迟还有甲、乙机发送接收数据时间差等各方面的差异,甲机的D3灯和乙机的D4灯亮不到一块去,它们交替着闪烁,此闪彼灭总之,以上两幅图所呈现的,是当按键第二次按下,甲机发送字符'B',并闪烁D3灯,乙机接收字符'B',并闪烁相应的D4灯上图所示按键第三次按下,控制甲机发送字符'C',并同时闪烁D1和D3灯,与此同时,乙机接收甲机发来的字符'C',并同时闪烁D2、D4灯图中所示的是LED灯一闪一灭时的亮状态,灭状态的截图此处省去上图所示按键第四次按下,甲机向乙机发送字符'D',同时使得D1、D3灯灭掉,乙机接收完字符'D'之后,也使得其控制的D2、D4灯停止闪烁3. 软件设计流程图: 开始 ↓←←←←←←↑ 是否有按键按下? 否→↑ 是↓ 第几次按下按键? ↓ 1 2 3 4 ↓ ↓ ↓ ↓↓甲机发送字符:'A' 'B' 'C' 'D' ↓ ↓ ↓ ↓ LED1 LED3 LED1 LED1&LED3全灭 闪烁 闪烁 &LED3 都闪烁 ↓ 乙机接收相应字符 ↓'A' 'B' 'C' 'D' ↓ ↓ ↓ ↓ LED2 LED4 LED2 LED2&LED4全灭 闪烁 闪烁 &LED4 都闪烁关键代码段+解释:甲机代码段·································································/*******************************//按键控制函数void button(void)//按键控制函数{ debouncing();//调用消抖函数 if(n==1) { SBUF=send[i];//发送第i个数据 while(TI==0);//查询等待发送是否完成 TI=0;//发送完成,TI由软件清0 n=0; switch(i) { case 0: while(debouncing()==0){D1=~D1;delay_ms(150);}break;//甲机D3灯灭状态,D1灯不断闪烁,直到有新的按键按下为止 case 1: D1=1;while(1){D3=~D3;delay_ms(150);if(debouncing()){break;}}break;//甲机D1灯灭状态,D3灯不断闪烁,直到有新的按键按下为止 case 2: D3=1;while(1){D1=~D1;D3=~D3;delay_ms(150);if(debouncing()){break;}}break;//甲机D1、D3灯一起不断闪烁,直到有新的按键按下为止 case 3: D1=1;D3=1;break;//甲机D1、D3灯均处于灭状态 default: ; } i++; if(i==4)//使控制功能能循环反复地执行 { i=0;//使控制功能能循环反复地执行 } }}*******************************//*******************************//甲机相关初始化TMOD=0x20;//定时器T1工作于方式2TL1=0xf4;//波特率为2400bpsTH1=0xf4;TR1=1;SCON=0x40;//定义串行口工作于方式1*******************************/乙机代码段·································································/*******************************//乙机接收显示函数void disp(void)//乙机接收显示函数{ REN=1;//允许接收 while(RI==0);//查询等待接收标志为1,表示接收到数据 buffer[i]=SBUF;//接收数据 RI=0;//RI由软件清0 switch(i) { case 0: while(!RI){D2=~D2;delay_ms(150);}break;//乙机D4灯灭状态,D2灯不断闪烁,直到乙机接收到新传来的数据为止 case 1: D2=1;while(1){D4=~D4;delay_ms(150);if(RI){break;}}break;//乙机D2灯灭状态,D4灯不断闪烁,直到乙机接收到新传来的数据为止 case 2: D4=1;while(1){D2=~D2;D4=~D4;delay_ms(150);if(RI){break;}}break;//甲机D2、D4灯一起不断闪烁,直到乙机接收到新传来的数据为止 case 3: D2=1;D4=1;break;//乙机D2、D4灯均处于灭状态 default: ; }i++;if(i==4)//使控制功能能循环反复地执行 { i=0;//使控制功能能循环反复地执行 }}*******************************//*******************************//乙机相关初始化TMOD=0x20;//定时器T1工作于方式2TL1=0xf4;//波特率为2400bpsTH1=0xf4;TR1=1;SCON=0x40;//定义串行口工作于方式1*******************************/(二) 调试1. 调试的方式软件仿真调试现象:① 单击Play以后开始仿真,此时没有按键按下,甲机乙机均处于等待状态之下。

      ② P1.0口按键第一次按下以后,甲机D1灯闪烁,同时乙机D2灯也闪烁③ 当按键第二次按下,甲机闪烁D3灯,乙机闪烁D4灯④ 按键第三次按下时,甲机同时闪烁D1和D3灯,与此同时,乙机同时闪烁D2、D4灯⑤ 按键第四次按下,甲机的D1、D3灯同时灭掉,乙机控制的D2、D4灯也都停止闪烁⑥ 若接下来还有按键按下,那将回到②,如此循环执行下去三) 实验再思考1. 进一步改进的设想可以用串行口中断服务程序来实现2. 实验的收获学会了双机串行口通信3. 实验中尚不能解决的疑问的确有个疑问:若是我把程序中的任何一个switch语句改成如下形式:switch(SBUF){ case 'A': ……; break; case 'B': ……; break; case 'C': ……; break; c。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.