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

上传人:PIYPING 文档编号:14131692 上传时间:2022-02-02 格式:DOCX 页数:35 大小:27.43KB
返回 下载 相关 举报
单片机串行通信实验报告(实验要求、原理、仿真图和例程).docx_第1页
第1页 / 共35页
单片机串行通信实验报告(实验要求、原理、仿真图和例程).docx_第2页
第2页 / 共35页
单片机串行通信实验报告(实验要求、原理、仿真图和例程).docx_第3页
第3页 / 共35页
单片机串行通信实验报告(实验要求、原理、仿真图和例程).docx_第4页
第4页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《单片机串行通信实验报告(实验要求、原理、仿真图和例程).docx》由会员分享,可在线阅读,更多相关《单片机串行通信实验报告(实验要求、原理、仿真图和例程).docx(35页珍藏版)》请在三一文库上搜索。

1、单片机串行通信实验报告(实验要求、原理、仿真图和例程) 嵌入式系统原理与实验 实验 指导 实验三 调度器设计基础 一、 实验目得与要求 1. 熟练使用 Kei C5 DE 集成开发环境,熟练使用roteus 软件。 2. 掌握 Kil 与 Prteus 得联调技巧。 3. 掌握串行通信在单片机系统中得使用。 4. 掌握调度器设计得基础知识:函数指针。 二、 实验设备 1. PC 机 一套 2. K C1 开发系统 一套 3. Protes 仿真系统 套一三、 实验内容 1. 甲机通过串口控制乙机 ED 闪烁 (1) 要求 a. 甲单片机得1 按键可通过串口分别控制乙单片机得 LED1 闪烁,L

2、E2 闪烁,LED1 与D2同时闪烁,关闭所有得 LED。 b. 两片051 得串口都工作在模式 1,甲机对乙机完成以下 4 项控制。 i. 甲机发送A,控制乙机 LD1 闪烁。 ii. 甲机发送,控制乙机 LED2 闪烁。 iii. 甲机发送,控制乙机 LD1,LED2 闪烁。 iv. 甲机发送C,控制乙机 LD1,LE2 停止闪烁。 c. 甲机负责发送与停止控制命令,乙机负责接收控制命令并完成控制E得动作。两机得程序要分别编写。 d. 两个单片机都工作在串口模式 1 下,程序要先进行初始化,具体步骤如下: i. 设置串口模式(SO) ii. 设置定时器 1 得工作模式(TM) iii. 计

3、算定时器得初值 iv. 启动定时器 v. 如果串口工作在中断方式,还必须设置E 与 ES,并编写中断服务程序。 (2) 电路原理图 Figur 1 甲机通过串口控制乙机 LED 闪烁 得原理图 (3) 程序设计提示 a. 模式 1 下波特率由定时器控制,波特率计算公式参考: b. 可以不用使用中断方式,使用查询方式实现发送与接收,通过查询I 与 RI 标志位完成。 2. 单片机与 PC 串口通讯及函数指针得使用 (1) 要求: a. 编写用单片机求取整数平方得函数. b. 单片机把计算结果向 PC 机发送字符串。 c. C 机接收计算结果并显示出来。 d. 可以调用 C1 stio、h 中得r

4、inf 来实现字符串得发送. e. 单片机得数码港显示发送得次数,每次清零。 (2) 参考电路原理图 Figure 2 单片机与 P P 串口通讯及函数指针得使用 原理图 (3) 程序设计要求 a. 编写求平方函数时,采用函数指针来编写。 b. 参考头文件模式,完善设计项目文件结构. 四、 思考题 1. 如果实验 1 如何使用实验 2 得成果来改写? 2. 请结合实例说明什么就是函数指针及如何使用函数指针。 五、 实验报告要求 1. 简述编写 C 程序,并联合调试程序得过程。 2. 解释编写得实验程序得代码,描述实验结果。 3. 解答思考题。 4. 简述实验得心得。 嵌入式系统原理及实验实验报

5、告 La 3 3 调度器设计基础 一、 甲机通过串口控制乙机 ED 闪烁 (一) 实现原理 1. 总体思路 发要得化始初上机甲在将,FUB器存寄冲缓收接及以,UB器存寄冲缓送发过通送得数据,B,C,存入一个数组,通过超级循环内设定得一个按键控制函数,依次发送给乙机,由乙机接收并让相应得 LED 灯闪烁。 2. 硬件设计 上图所示得就是单击lay 以后开始仿真,此时没有按键按下,甲机乙机均处于等待状态之下. * 上图所示按键第一次按下,甲机发送字符A,灯闪烁,乙机接收字符A,并显示相应与甲机 D灯位置对应得2 灯闪烁。 * 以上两幅图就是在一起得,也许就是ED 灯启动以及延迟还有甲、乙机发送接收

6、数据时间差等各方面得差异,甲机得 D3 灯与乙机得 D4 灯亮不到一块去,它们交替着闪烁,此闪彼灭。 总 之,以上两幅图所呈现得,就是当按键第二次按下,甲机发送字符B,并闪烁 D3 灯,乙机接收字符B,并闪烁相应得4 灯。 * 上图所示按键第三次按下,控制甲机发送字符C,并同时闪烁 D1 与3 灯,与此同时,乙机接收甲机发来得字符C,并同时闪烁 D2、4 灯.图中所示得就是 LE灯一闪一灭时得亮状态,灭状态得截图此处省去. * 上图所示按键第四次按下,甲机向乙机发送字符D,同时使得 D1、D3 灯灭掉,乙机接收完字符D之后,也使得其控制得 D、D4 灯停止闪烁。 3. 软件设计 流程图: 始开

7、 就是否有按键按下? 否 就是 第几次按下按键? 1 3 2 甲机发送字符:A B C D 灭全DEL1DE 1L DEL 1DEL 闪烁 闪烁 E3 烁闪都 乙机接收相应字符 A B C D LED2 LD4 LE2 LED2ED4 全灭 烁闪 烁闪 LED4 都闪烁 关键代码段+解释: 甲机代码段 /* /按键控制函数 void buton(vid)/按键控制函数 数函抖消用调/;)(gnicnuoed i(n=1) 据数个第送发/;idns=FUS while(TI0);/查询等待发送就是否完成 0 清件软由 IT,成完送发/;=IT ;0=n )i(hctiw case : while

8、(boin()=0)D1D1;elay_ms(15);reak;/甲机D3 灯灭状态,D灯不断闪烁,直到有新得按键按下为止 se : D=1;hle()3=D3;dela_s(0);if(deouncig()break;bek;/甲机1 灯灭状态,3 灯不断闪烁,直到有新得按键按下为止 case : D3=1;e(1)1D1;D3;eayms(150);if(duncing())brk;reak;/甲机 D1、D灯一起不断闪烁,直到有新得按键按下为止 cas 3: =;D3=1;brak;甲机1、D3 灯均处于灭状态 ; :tuad +; i(i=4)/使控制功能能循环反复地执行 i=0;/使

9、控制功能能循环反复地执行 * /* /甲机相关初始化 TO0x;/定时器 T工作于方式 2 T1=0x4;/波特率为 2400ps TH=xf4; T1=; CON=0x40;/定义串行口工作于方式 1 * 乙机代码段 /* /乙机接收显示函数 void disp(void)/乙机接收显示函数 RN;/允许接收 whie(I0);/查询等待接收标志为,表示接收到数据 buffei=;/接收数据 0 清件软由R/;IR swith(i) 状灭灯 4机乙;kerb;)01(myld;D=2)R!(ew :0 esac态,D2 灯不断闪烁,直到乙机接收到新传来得数据为止 ase 1: D21;hil

10、e(1)D4;delay_s(50);i(RI)break;brea;/乙机 D灯灭状态,D灯不断闪烁,直到乙机接收到新传来得数据为止 )(i;)01(sm_yad;D4;D2D)(elihw;4D :2 esacreak;rak;/甲机 D、D4 灯一起不断闪烁,直到乙机接收到新传来得数据为止 态状灭于处均灯D、2D 机乙/;kaeb;=4;1=2D : es default: ; i+; if(i=4)/使控制功能能循环反复地执行 行执地复反环循能能功制控使/;0i * */ 化始初关相机乙 MD=020;/定时器 T1 工作于方式 2 T1=0x;/波特率为 240bs T=0xf; T

11、=1; ON=040;/定义串行口工作于方式 */ (二) 调试 1. 调试得方式 软件仿真 调试现象: 单击 Play 以后开始仿真,此时没有按键按下,甲机乙机均处于等待状态之下。 P1、0 口按键第一次按下以后,甲机 D1 灯闪烁,同时乙机 D2 灯也闪烁。 当按键第二次按下,甲机闪烁 D灯,乙机闪烁 D4 灯。 按键第三次按下时,甲机同时闪烁 D1 与 D灯,与此同时,乙机同时闪烁 D、D灯。 按键第四次按下,甲机得 D1、灯同时灭掉,乙机控制得 D2、4 灯也都停止闪烁。 若接下来还有按键按下,那将回到,如此循环执行下去。 (三) 实验再思考 1. 进一步改进得设想 。现实来序程务服断

12、中口行串用以可2. 实验得收获 信通口行串机双了会学3. 实验中尚不能解决得疑问 得确有个疑问: 若就是我把程序中得任何一个 switch 语句改成如下形式: switc ( ( ) BUF) sac cas : ; brea ; ca B: ; ; break; ac ca e C : ; bre ; ; case D: ; brea ; def u u t: ; ; 得样这 这样得 w c c 语句无论出现在甲机还就是乙机得程序里面, , 都无法实现相应得任何控制功能了F .SBUF 存储数据得情况具体就是怎样得呢 ?switch 语句不能够引用U U 吗? 二、 单片机与C C 串口通讯

13、及函数指针得使用 (一) 实现原理 1. 总体思路 按键接得就是 P3、复用口,于就是就想到用外部中断 0 控制。所以,将数码管显示程序以及串口通讯程序都一起放入外部中断 INT0 服务程序当中,就可以实现实验要求。 序程 15C 在,外另编写当中还应当特别注意以下几点: ;3f=1HT /格严常非 置设率特波,值初器时定,spb0042 为率特波口行串置设/;3f0=1LT 就要是设置错了,在发送与接收得时候,就会出现莫名其妙得符号,比如说:xxxx 诸如此类、O_O 能使断中口串闭关该应前之tnrp 用调 E=0;/禁止串行口中断 TI=1;/必须置高 TI,RI I=; printf(%

14、dd=,n,n,c); ;)n(rahcup ;)I!(lh/等待 printf 语句执行完毕 毕完行执句语 ftirp 待等;)!(elihw2. 硬件设计 上图所示有关串口 PI得相关参数设置应该注意得地方 * 上图所示虚拟终端相关参数设置应该注意得地方,虚拟终端相关参数设置应该与串口得相关参数设置一致,也应该与1 编程中串口初始化时设定得波特率得数值一致,即都应该就是 240ps。 注意,虚拟终端得D 应当与串口第 3 脚D(即发送端)连接,否则仿真时无法虚拟终端调试窗口无法显示rintf 语句内容。 * 上图所示得就是单击 Pla以后开始仿真,此时没有按键按下,数码管静止在显示得状态当

15、中,此时没有任何得数据发送与接收. * 上图所示当第一次按下按键时,触发外部中断,单片机调用函数指针指向得求取整数平方得函数,并将计算结果发送给机,此时虚拟终端显示:12=1; 即=; (似乎虚拟终端显示框要显示得文字在这个截图里面有点小,瞧不太清楚),数码管此时显示发送次数为 1. * 上图所示当第 5 次按键按下,数码管显示发送次数为 5,此时也可以清楚地观察到虚拟终端调试窗口得显示: 1=1* 2*2= 52=5*5 61=4 9=33 * 数码管显示每次清零,求整数平方数也就是 09 循环, 上图所示虚拟终端显示结果有异常情况。到目前为止, , 我改写过多种 rint 语句形式, ,

16、可就是还就是解决不了上图所示得异常显示问题。 为什么会显示成: 6 ; 36;1 1 9 9 ; 82=64; Q 2= ; ( ( o o ) ) 呢? ? 好奇怪! ! ? * 改我算就,示所图上如了 printf 语句形式,也还就是会有同样得问题出现。 * 行执再后然,零清次 9 每管码数是就示所图上到 3 得情况,从虚拟终端调试窗口可见求平方已经循环执行到了第二轮得 3。 3. 软件设计 流程图: 开始 初始化定时器 1、串口、外部中断 0 断中待等 就是否有外部中断?否 就是 转入外部中断 0 中断服务程序 按键消抖 函数指针调用求整数平方函数 在数码管上显示发送次数 发送求取结果

17、查询等待发送就是否完成 发送完成,TI 由软件清 在虚拟终端上显示求平方结果 中断返回 关键代码段解释: */ 化始初口串 ;fx0=1HT TL1=0xf3;/设置串行口波特率为 2400ps,定时器初值,波特率设置非常严格 /要就是设置错了,在发送与接收得时候,就会出现莫名其妙得符号,比如说:xxx 诸如此类、_O 1 式方口行串:0000,101/;05x0=NCS N=允许接收,8 位异步通信方式,8-bit ART,T 0; R=0 =DOMS/;00x=NOCP E=1;/开总中断允许位 断中口行串开/;1SE*/ * /求取整数平方函数 uit ow2(uint x)/求取整数平

18、方函数 ; tniu q=x*; 果结数方平回返 nruter/; nruter */ /*/ 示显端终拟虚void virt(ui n,nt c)/虚拟终端显示 断中口行串止禁/;0=SE 能使不断中,节字充填送发 1=,IR,T 高置须必;1=IT ;1 pif(%d*%d=d,n,c);/、* 使断中口串闭关该应前之tnip 用调能 ;)n(rctup 毕完行执句语tnirp 待等/;)IT!(iw 毕完行执句语 ftnirp 待等/;)R!(ei E=1; TI=; ;0I */ * /外部中断 IN0 中断服务程序 o ntsv(oid) nterrupt /外部中断 INT0 de

19、bonig();/调用消抖函数 数函方平数整取求用调式形针指数函用/;)n()p*(c dp();/在数码管上显示发送次数 果结取求送发/;c=FUS whil(=);/查询等待发送就是否完成 TI=0;/发送完成,I 由软件清 0 r_ter(,c);/在虚拟终端上显示求平方结果 */ (二) 调试 1. 调试得方式 软件仿真 调试现象: 单击 Pla以后开始仿真,此时没有按键按下,数码管静止在显示 0 得状态当中,此时没有任何得数据发送与接收。 P3、2 口按键第一次按下以后,触发外部中断,单片机调用函数指针指向得求取整数平方得函数,并将计算结果发送给C 机,此时虚拟终端显示:12; 即=

20、1; 不端按下按键触发外部中断,当外部中断一到来,单片机就执行调用函数指针指向得求取整数平方数得函数,并将求取结果发送给串口.单片机 09 不断循环求取整数平方数,并也循环显示在虚拟终端调试窗口上,数码管显示求取整数平方数结果发送次数,每 9 次清零。 2. 遇到问题得处理 窗试调端终拟虚法无时真仿则否,接连)端送发即(DT 脚 3 第口串与当应 DXR 得端终拟虚口无法显示rint语句内容。 化始初口串中程编5C 与该应也,致一置设数参关相得口串与该应置设数参关相端终拟虚时设定得波特率得数值一致,在此次实验报告中即都应该就是40bp。 在编写 C1 程序时,TH=x3;TL=0xf;/设置串

21、行口波特率为 240bps。波特率得设置非常严格,要就是设置错了,在发送与接收得时候,就会出现莫名其妙得符号,比如说:xxxxxxx 诸如此类、O_O (三) 实验再思考 1. 进一步改进得设想 目前还没有设计得出外部中断服务程序与串行口中断服务程序同时一起用得 C51 程序,遇到很多问题。希望老师今后能指导我们关于双重中断程序得编写,我自己捣鼓了好久还没捣鼓出来。 2. 实验得收获 收获当然很多,诸如:虚拟终端得X应当与串口第脚 TXD(即发送端)连接等等都就是我对单片机新得认识,新得收获。 ;)0=T(elhw 果结取求送发/;US :有还/查询等待发送就是否完成 清件软由T,成完送发/;

22、0=TES=0;/禁止串行口中断 TI1;必须置高 T,RI,I=1 发送填充字节,中断不使能 RI=1; 使断中口串闭关该应前之 fnip 用调/;)c,n,n,d%=%*d%(tnp能 ;)(rahcupwhile(!I);/等待 pi语句执行完毕 行执句语tnip 待等/;)IR!(ei完毕 以上语句应该熟记,就是使能虚拟终端得常用语句。 3. 实验中尚不能解决得疑问 上图所示便就是最大得疑问! ! ! ( ( 四) ) 附录 (粘贴完整代码) 机乙制控口串过通机甲 甲机通过串口控制乙机 L L 闪烁 甲机完整代码 rt 1 -Source G F、c F、h +mai、c /、h/ i

23、ndereg5、h define uca unsiged chr dfie in unigned in sbit 1 = P00; bit D = P03; sbi P1_0 P10; uit dbouncin(void); void buton(vo); void dlyms(uin xm); /F、c/ iclueF、h uin n=0; uch i=0; ten uchar end4;/声明全局变量 oid dela_ms(unt xm)/级延时函数 uin x,; fr(xms;x0;) r(y130;y;y-); uit deboncng(oid)/debncing:消除抖动得意思,

24、按键消抖函数:若确实有按键按下,函数返回值为 1;否则返回值为 0 f(P_0=)/有键按下吗? dela_ms(10); /延时消抖 i(P10=0)/确实就是有键按下 ;1= 开松键按待等/;)0=01P(eliw 1 为值回返数函,下按键按有若/; nre 0 为值回返数函,下按键按无若/; nrter esle ese rern 0;/若无按键按下,函数返回值为 vd buton(id)/按键控制函数 debunng();/调用消抖函数 )1=(fi 据数个 i 第送发/;idesUS wile(TI=0);/查询等待发送就是否完成 I=0;/发送完成,I 由软件清 0 n=0; sw

25、tc() case : whie(ebounci()=0)1=1;elay_m(10);brea;/甲机 D3 灯灭状态,D灯不断闪烁,直到有新得按键按下为止 )(gicnube(;)05(sm_yae;3=3D)1(elih;1=D :1 esacbreak;brea;/甲机 D1 灯灭状态,D3 灯不断闪烁,直到有新得按键按下为止 cas 2: D3=1;il(1)D11;D3=D3;day_m(150);if(debouncing()reak;rek;/甲机 D1、D3 灯一起不断闪烁,直到有新得按键按下为止 ce 3: D11;D3=1;break;/甲机 D1、D灯均处于灭状态 ef

26、ult: ; i; if(i=4)/使控制功能能循环反复地执行 i=0;/使控制功能能循环反复地执行 main 、 / / / / / / / / / / / / / / / / / / / / / incueF、h oid main() uchr send=,B,C,;/定义要发送得数据 TMOD0x2;/定时器1 工作于方式 2 sb042 为率特波;4fx=1T T1=0f; TR1=1; SN040;/定义串行口工作于方式 1 灭熄为态状灯 1化始初/;1=D 灭熄为态状灯D 化始初/;1=D while(1) tton();/调用按键控制函数 乙机完整代码 Target 1 -rce

27、 Grou M、h +M、 mai、 /M、h/ #ncludeg1、h #fne cha unigne car die uit unigned nt sbi D2 = 00; t D4 = 0; vod initLD(vod); oid flashLED(void); void disp(vd); vi dlayms(uit ms); /M、c/ #includeM、 ucha i=0; uhar bfe0x00,0x0,0x0,x0;/定义接收数据缓冲区 void disp(vi)/乙机接收显示函数 REN1;/允许接收 while(R=);/查询等待接收标志为 1,表示接收到数据 buf

28、friSUF;/接收数据 R=0;/I 由软件清 0 swth(i) cae : while(!RI)D2=D2;ey_s(150);brek;乙机 D灯灭状态,D2 灯不断闪烁,直到乙机接收到新传来得数据为止 cae 1: D2=1;while(1)D4D4;lay_m(15);if(RI)brk;rek;/乙机2 灯灭状态,D4 灯不断闪烁,直到乙机接收到新传来得数据为止 e : D41;while(1)D2=D2;4=D4;ela_ms(10);if(RI)ea;brak;/甲机 D2、D4 灯一起不断闪烁,直到乙机接收到新传来得数据为止 ase : D2=1;4=1;brek;/乙机

29、D2、D4 灯均处于灭状态 defult: ; +; if(i=4)/使控制功能能循环反复地执行 i=;/使控制功能能循环反复地执行 vid da_ms(uint xms)/级延时函数 uit x,y; )-;;smx=x(rof for(=30;y0;-); /main 、 / / / / / / / / / / / / / / / / / / / / / / / / inludeM、 oi mai() TMOD=0x0;定时器工作于方式 2 TL1=;/波特率为 200bps ;4f0H R1=; 1 式方于作工口行串义定/;04x0NOCS 灭熄为态状灯 2D 化始初/;1=2D D4;/初始化 D4 灯状态为熄灭 whl(1) isp();/调用 LED 灯显示函数 单片机与 P P 串口通讯及函数指针得使用 -Trget 1 ce Gru +n、 +PC、c PC、 /PC、/ #inlude reg1、h #incle stdi、 #die ucha usigned char ene int unsgned it #defne N 9 bi P3_2=P2; un pow2(uint x); vid dis(un i); vd vir_ter(u i,ut c); void deboucig(void); vod dlay_m(ui xms); / PC、c/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1