完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、51单片机的串口通信
关于51单片机串口通信的讲解的博客有很多,这里就不再详细讲解。下面给出程序 1.uart.h #ifndef __UART__#define __UART__typedef unsigned char u8;void UART_Init();void UART_Send_Data(u8 byte);u8 UART_Receive_Data();#endif 2.uart.c #include “reg52.h”#include “uart.h”//串口初始化,设置波特率为9600,使用定时器1,晶振频率11.0592Mhzvoid UART_Init(){ //设置波特率9600 TMOD|=0x20; //定时器1工作于自动重装载模式 TH1=0xfd; TH0=0xfd; TR1=1; //启动定时器1 ET1=0; //禁止定时器1中断 PCON&=0x7f; //设置SMOD=0,波特率不加倍 SCON=0x50; //工作于方式1 8位无校验异步通信的收发模式,并清空收发中断标志位 EA=1; //总中断允许 ES=0;//禁止串口收发中断(本程序中不使用串口中断)}void UART_Send_Data(u8 byte){ SBUF=byte; while(!TI);//等待串口数据发送完毕 TI=0;//将发送中断标志位清0,为下次发送数据做准备}u8 UART_Receive_Data(){ u8 temp; while(!RI);//等待串口接收到数据(RI被置1) temp=SBUF; RI=0;//清空接收中断标志位,为下次接收做准备 return temp;} 串口数据收发既可以用中断的方式实现,也可以通过测试SCON寄存器的TI和RI位来实现。在完成一个字节的数据发送时,TI位被硬件置1,且必须由软件清0后才能继续发送下一个字节。而在接收到一个字节的数据后,RI被硬件置1,必须由软件清0后才能继续接收数据。在UART_Receive_Data()中,我们通过一个循环来等待RI位被置1,也就是等待外部设备将数据发送给单片机,一旦接收到了数据,我们就可以把接收到的数据返回。而 UART_Send_Data()也是类似的。 二、串口通信的Proteus仿真 首先编写一个主函数,完成将接收到的数据原样送回的功能,作为我们的测试程序。 main.c #include “reg52.h”#include “uart.h”void main(){ u8 i; UART_Init(); while(1) { UART_Send_Data(UART_Receive_Data()); }} ①将编译生成的.HEX文件载入Proteus的单片机中,方法是:双击单片机,在出现的对话框中找到 这一栏 选择生成的.hex文件。 ②在刚才的单片机设置的对话框中找到 这一栏 将单片机时钟频率设置为11.0592MHz。这一步非常关键,因为上面的程序中使用的是9600的波特率,如果设置成了其他频率(比如常用的12MHz),会使实际的波特率与9600相差较大,超出允许的误差范围,使串口接收到错误的数据,如果你在后续中发现串口收到一堆乱码,很有可能是这一步没有设置。 完成以上两步后,这里介绍两种方式进行串口通信的仿真。 方式1 proteus中提供了Virtual Terminal,它实际上就是一个串口监视器,可以利用它直接向单片机的串口发送数据,也可以接受来自单片机串口的数据。 在左侧模式选择栏选择虚拟仪器模式 选择虚拟终端 与单片机的串口连接。(单片机的TX接虚拟终端的RX,单片机的RX接虚拟仪器的TX) 双击虚拟终端,进行如图设置(与单片机程序中的通信速率、格式一致) 运行仿真,会弹出一个黑色对话框。(如果没有的话,在菜单栏的DEBUG-Virtual Terminal下可以打开) 输入一个数字1,发现屏幕上出现了一个1。说明确实完成了前面main函数中接收数据并原样返回给的功能。这里你可能要问,屏幕上显示的1不是我输入的1吗?为什么说这里显示的1是单片机的串口在接收到‘1’之后返回的数据呢?因为Virtual Terminal默认是不会将你输入的字符显示在屏幕上的,如果把main函数中while(1)下的内容注释掉再编译后,你会发现无论你键盘上输入什么,Virtual Terminal上都不会显示出来。这就验证了Virtual Terminal默认情况下不会回显你输入的内容。 可以在虚拟终端的黑色方框内右击鼠标,勾选Echo Typed characters 此时在虚拟终端中输入一个1,你会发现屏幕上多了两个1。其中一个1是回显你输入的字符,另一个1则是由单片机串口发来的数据。 方式2 对于简单的验证单片机串口通信程序,上面的仿真方法已经足够。如果要模拟单片机与计算机的串口通信,可以用到COMPIM元件。进行如图连接(注意TX接TX,RX接RX) COMPIM其实就是一个RS232串口的DB9连接器,用它可以模拟与计算机串口的连接。这个元件自动将单片机的TTL电平转换成了RS232电平,因此不必再用MAX232进行电平转换。(如果串口收到一堆乱码,需要注意是不是用了MAX232芯片,如果用了,去掉MAX232芯片,按上图连接即可解决乱码问题。)双击COMPIM设置其属性如下 这样就模拟了把单片机通过DB9连接器连接到计算机的COM3的过程。计算机上可能并没有这么多的COM口供我们使用,因此需要用软件虚拟出一对串口,这里用到了Virtual Serial Port软件。 点击右侧的Add Pair就可以生成一对虚拟的串口,这两个串口是连接在一起的。如果我们使用串口调试助手,打开COM3发送1个字符,再用串口调试助手打开COM4,就会接收到一个同样的字符。这也就证明了通过Virtual Serial Port生成的一对虚拟串口是连接在一起的。(串口调试助手的软件有很多,主要用于查看串口接收到的数据,以及通过串口发送数据。) 这里,我虚拟了COM3口和COM4口。其中COM3口已经与上面的COMPIM连接了。此时打开串口调试助手软件,选择COM4口,如下设置 在发送窗口输入1,并发送 此时数据通过与COM4连接的COM3口,传送给了单片机,单片机又将1回送给COM4口,因此串口调试助手的接收窗口也收到一个1,说明成功仿真了上面编写的程序。 |
|
|
|
只有小组成员才能发言,加入小组>>
2553 浏览 0 评论
1152浏览 2评论
750浏览 1评论
504浏览 0评论
269浏览 0评论
433浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 19:56 , Processed in 1.324413 second(s), Total 80, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号