173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

单片机与pcmax485通信程序

htxw 2023-03-14 资讯中心 20 ℃

PC机与单片机用RS485通信时,单片机如何用中断接收一帧数据?一帧数据包括7个字符。

有些人,不懂就不要瞎说,误导人啊

PC机与单片机直接是不能进行通信的,

我们知道pc与单片机多采用232串口通信,你使用的是485方式,也是可以的,不过PC机直接不支持485 啊,于是乎,你要用一个RS232-485的转换器,单片机端直接用MAX485芯片就行了,这是硬件。

数据通信与232通信是一样的,不过485是半双工的,单片机端需要做收发控制。

单片机采用中断方式或扫描方式都行,给你一段中断程序,你参考一下:

com_interrupt(void) interrupt 4 using 3

{

unsigned char RECEIVR_buffer;

if(RI) //处理接收中断

{

RI=0; //清除中断标志位

dat[n++]=SBUF;

if(n7)flg=1;

}

}

flg是一个判断标志,如果你接收到7个数据后,标志置1,

在程序中处理为:

如果flg==1,你可以对你的dat数据处理,同时放n=0,等待下一次数据接收

OK

PC机与单片机之间的串口通信的程序

Keil软件仿真的串口调试技巧

在单片机系统中,串口(UART,通用异步收发接口)是一个非常重要的组成部分。通常使用单片机串口通过RS232/RS485电平转换芯片与上位机连接,以进行上位机与下位机的数据交换、参数设置、组成网络以及各种外部设备的连接等。RS232/RS485串行接口总线具有成本低、简单可靠、容易使用等特点,加上其历史悠久,所以目前应用仍然非常广泛;特别对于数据量不是很大的场合,串口通信仍然是很好的选择,有着广阔的使用前景。 在单片机编程中,串口占了很重要的地位。传统方式串口程序的调试,往往是利用专用的单片机硬件仿真器。在编写好程序后,利用仿真器来设置断点,观察变量和程序的流程,逐步对程序进行调试,修正错误。使用硬件仿真器的确是很有效的方法,但是也有一些缺点:

很多仿真器不能做到完全硬件仿真,因而会造成仿真时正常,而实际运行时出现错误的情况;也有仿真不能通过,但是实际运行正常的情况。

对于一些较新的芯片或者是表面贴装的芯片,要么没有合适的仿真器或仿真头;要么就是硬件仿真器非常昂贵,且不容易买到。

有时由于设备内部结构空间的限制,仿真头不方便接入。

有的仿真器属

于简单的在线仿真型,仿真时有很多限制。例如速度不高,实时性或稳定性不好,对断点有限制等,造成仿真起来不太方便。

1 调试前的准备工作

下面介绍一种利用Keil的软件仿真功能来实现51单片机串口调试用户程序的方法。使用这种方法,无需任何硬件仿真器,甚至都不需要用户电路板。所需的只是:

① 硬件。1台普通计算机(需要带有2个标准串口)和1根串口线(两头都是母头,连线关系如图1所示)。

② 串口软件可以是自己编写的专用调试或上下位机通信软件,也可以是通用的串口软件(如串口助手、串口调试等),主要用来收发数据。如果没有合适的串口调试软件,则可使用笔者编写的一个免费的串口小工具TurboCom。除了与其他软件一样的数据收发功能外,它还有定时轮流发送自定义数据帧和自动应答(接收到指定数据帧后,自动返回相应的数据帧)这两个很有用的功能,特别适合于老化测试。

如果没有串口线,用虚拟串口可以把物理通道连同,在网上下个这样的软件就OK了。

2 基本调试命令介绍

这个串口调试方法主要是利用了Keil强大的软件仿真功能。在新版本(高于6.0)的Keil软件中,增强了软件的仿真能力,可以利用软件仿真更多的单片机功能。在这些功能中,其中有一个很重要的功能就是利用计算机的串口来模拟单片机的串口(这不同于很多软件在仿真时使用的激励文件方式,可以直接与其他串口进行通信,更加方便、灵活)。首先要介绍仿真时需要使用的两个命令:ASSIGN和MODE。

2.1 ASSIGN命令

将单片机的串口绑定到计算机的串口。基本使用方式为:

ASSIGN channeloutreg

其中: channel代表计算机的串口,可以是COM1、COM2、COM3或COM4;而inreg和outreg代表单片机的串口。对于只有一个串口的普通单片机,即SIN和SOUT;对于有两个或者多个串口的单片机,即SnIN和SnOUT(n=0,1,…即单片机的串口号)。

图1 串口连线示意图

例如:

ASSIGN COM1SOUT

将计算机的串口1绑定到单片机的串口(针对只有一个串口的单片机)。

ASSIGN COM2S0OUT

将计算机的串口2绑定到单片机的串口0(针对有多个串口的单片机,注意串口号的位置)。

需要注意的是,参数的括号是不能省略的,而outreg则是没有括号的。

2.2 MODE命令

设置被绑定计算机串口的参数。基本使用方式为:

MODE COMx baudrate, parity, databits, stopbits

其中: COMx(x = 1,2,…)代表计算机的串口号;baudrate代表串口的波特率;parity代表校验方式;databits代表数据位长度;stopbits代表停止位长度。

例如:

MODE COM1 9600, n, 8, 1

设置串口1。波特率为9 600,无校验位,8位数据,1位停止位。

MODE COM2 19200, 1, 8, 1

设置串口2。波特率为19 200,奇校验,8位数据,1位停止位。

使用以上两个命令,就能够将计算机的串口模拟成单片机的串口了。在进行软件仿真时,所有发送到被绑定的计算机串口上的数据都会转发到Keil模拟的单片机串口上,用户程序可以通过中断处理程序或查询方式接收到这些数据;同样,单片机程序中发送到单片机串口上的数据也会通过被绑定的计算机串口发送出来,可以被其他软件所接收。利用这个特点,就可以方便地仿真、调试单片机的串口部分程序。要注意的是,这两个命令需要一起使用。

2.3 仿真步骤

首先,用串口线将计算机的两个串口连接起来(或者是两台计算机上的两个串口)。这两个串口一个用来模拟单片机串口,另一个给调试程序使用。这个由用户自己分配,没有特殊要求。

其次,编写好用户程序,并编译通过。

然后,设置工程文件(Project)的相关参数,如图2和图3所示。主要是选择软件仿真模式(Use Simulator)以及晶振参数。

图2 仿真参数设置

为了不必每次进入仿真状态后,都需要输入串口参数设置命令,可以建立一个初始化文件。初始化文件是一个普通的文本文件,内容就是仿真时需要的命令,按照顺序一行输入一条。如图2所示,建立了一个debug.ini的初始化文件。这样,当每次进入仿真调试状态时,Keil就会自动载入 debug.ini的内容进行初始化。

图3 晶振参数设置

为了正确

仿真串口,在软件仿真调试时,在用户的Keil工程文件的属性中,还需要设置实际使用的晶振频率。这个参数非常重要,直接影响通信的波特率,可以按照实际使用的参数进行设置。要注意,这个参数的单位是MHz。

设置好参数后,就可以进行仿真了。单击工具栏的图标按此在新窗口浏览图片进入Debug(仿真调试)状态,在Output window窗口中的command文本框(一般是在左下角)中输入上面介绍的命令。例如,将PC机的串口1设置为单片机的串口:

mode com1 9600,0,8,1

assign com1 Sout

然后设置断点,一般是在关键地方或与串口相关联的地方设置。再单击图标运行(Run)用户程序,使用户程序运转起来(不然是接收不到串口数据的)。这时再使用串口调试软件或用户调试软件,发送通信命令或者数据包,看用户程序是否进入断点,以及相关的变量是否正确。还可以有意发送带有错误数据的数据包,以观察用户程序的异常处理部分是否正常。一旦发现程序中的错误,可以马上停止仿真调试,立即修改代码,然后再次重复上面的步骤进行仿真。因为不需要与用户目标板联机,也不用下载代码到用户板上,所以速度非常高。以上这些步骤和使用硬件仿真器的基本一样,只不过现在使用的是软件仿真。

需要注意的是:仿真时单片机串口实际的波特率由MODE命令来指定,单片机程序中的TMOD、SCON等参数是不影响串口仿真状态的(也就是说这些参数不影响仿真的波特率,即使它们是错误的)。但是中断的使能位(如ES、EA等)还是起作用的,如果ES或EA被禁止,那么就不会进入串口中断。

因为这种方法是利用计算机的串口来仿真单片机的串口,而仿真是通过Keil软件来转换串口上的数据,不是直接转发数据的,所以在实际仿真时,处理速度会比实际单片机运行时稍微低一点。比方说仿真状态时1 s只能发送/接收10个数据帧,但在单片机硬件上运行时可能1 s就可以接收/发送50个数据帧。这与使用的计算机的速度有关,但对仿真来说,是没有任何影响的。

对于多串口的单片机,从理论上来说,可以一次绑定多个串口,只要计算机有足够多的串口。基本上,使用这种方法需要占用计算机的串口数量是单片机绑定串口的2倍。一个串口被Keil占用,用来模拟单片机的串口;另外一个串口被计算机占用,用来给单片机的串口收发数据。

3 小结

这里介绍的方法对C51和汇编语言都是适合的。它最大的好处就是简单、方便,容易使用,不需要使用任何电路,也没有特殊的要求;甚至可以在硬件电路制作好之前就将串口部分的程序编写、调试完毕。笔者使用这种方法已经很长时间了,事实证明这种方法确实非常有效。其实对于51单片机,Keil的仿真功能实在是太强大了,只要充分掌握其特点,能够熟练利用它,就可以解决工作中的大部分问题。很多工作都可以使用软件仿真来完成,根本无需任何硬件仿真器;只有一些新的外部器件的时序、接口的调试才有可能需要用到硬件仿真器。目前介绍Keil软件仿真这方面的参考书籍很少,有些讲的还是老版本的用法,不过没有关系,Keil的帮助文件写得很详细、很清楚,只要认真看明白就会使用了。使用熟练后,就会发现Keil的功能相当强。

对于串口编程,51单片机有Keil这个功能强大的开发软件,给我们带来了极大的便利;而在其他单片机软件的开发中,目前还没有这么强大的开发工具和方便的调试手段。这里有个变通的办法,就是可以先在Keil中编写并调试好串口程序,然后将程序移植到其他单片机平台中(笔者在PIC18单片机开发中就使用了这种方法,收到了很好的效果。当然这是指在使用C语言开发单片机程序时,汇编语言是没有可移植性的)。至于如何能够减小程序移植的工作量,使得程序具有更好的通用性,以最小的代价就可以平滑地移植到其他单片机平台上,也是一个非常值得探讨的问题。

MAX485与51单片机的发送、接收程序

相信你的 RE 与 DE 是连接在一起的,如果不是,你的电路就成了另类.

与 RE/DE 连接在一起的那条单片机I/O, 我命名为 CTRL_PIN ,至于是哪条,你才知道.

其实发送与接收与普通的 232 有 99.9% 的相似, 只是多了两行,看下面

发送程序时:

CTRL_PIN = 1; // 输出高电平,允许MAX485输出差分信号.

UART232_SENDCHAR(); // 普通232发送函数

CTRL_PIN = 0; // 输出低电平,禁止发送,允许接收.

接收程序时: 只要保证 CTRL_PIN = 0 就可以了,无论你是采用中断,还是沦询的方式接收字符,与普通串口用法一样

51单片机与PC串口通信程序,求指导 ! 具体要求如下:

要求用什么语言?

------------------------------

网友“星心晨梦”的回答,是可以满足题目要求的。

我实验了,是成功的,没有任何错误。

楼主应该检查自己的电路、串口设置等等。

------------------------------

网友“星心晨梦”的回答,篇幅稍稍长了一些。

缩减一半就可以正常工作了,可读性更好一些。

建议看看下面的。

------------------------------

#include AT89X51.h

#include intrins.h

#define uchar unsigned char

#define uint unsigned int

//---------------------------------------------------

uchar idata trdata1[] = {

'W','E','L','C','O','M','E',' ','T','O',' ','C','H','I','N','A','!',0x0d,0x0a,0x00};

uchar idata trdata2[] = {

'M','Y',' ','N','A','M','E',' ','I','S',' ','L','I','M','I','N','G',0x0d,0x0a,0x00};

uchar idata trdata3[] = {

'Y','I','N','G','Y','O','N','G','K','E','X','U','E','X','U','E','Y','U','A','N',0x0d,0x0a,0x00};

uchar RxBuf[5], Rx_p, Rx_i, TX_p, Tx_i;

//---------------------------------------------------

void UART_Init(void) //串口初始化

{

PCON = 0x00;

SCON = 0x50; //串口工作方式为1,允许接收.

TMOD = 0x20; // T1 定时方式2

TH1 = 0xfd; //波特率 9600bps @ fosc = 11.0592MHz

TL1 = 0xfd;

TR1 = 1; //启动T1

ES = 1; //开串口中断.

EA = 1; //开总中断.

}

//---------------------------------------------------

void main()

{

UART_Init();

Rx_p = 0;

Rx_p = 2;

while(1) {

if (Rx_p != 0) {

TX_p = Rx_p;//字符串1 2 3

Tx_i = 0; //字符指针.

Rx_p = 0; //清零.

Rx_i = 0;

TI = 1; //启动发送中断.

} }

}

//---------------------------------------------------

void Uart_INT(void) interrupt 4 //串口中断函数

{

uchar Tcv = 0;

if(RI) { //接收?.

RI = 0; //标志位清零.

RxBuf[Rx_i] = SBUF;

if((RxBuf[Rx_i - 1] == 'g') (RxBuf[Rx_i] == 'o')) Rx_p = 1;

if((RxBuf[Rx_i - 2] == 'w') (RxBuf[Rx_i - 1] == 'h') (RxBuf[Rx_i] == 'o')) Rx_p = 2;

if((RxBuf[Rx_i - 3] == 'h') (RxBuf[Rx_i - 2] == 'o') (RxBuf[Rx_i - 1] == 'm') (RxBuf[Rx_i] == 'e')) Rx_p = 3;

P1 = Rx_p; //在P1显示收到的信息.

Rx_i++;

Rx_i %= 5;

}

else {

TI = 0;

if (TX_p == 1) Tcv = trdata1[Tx_i]; //取来待发字符.

if (TX_p == 2) Tcv = trdata2[Tx_i];

if (TX_p == 3) Tcv = trdata3[Tx_i];

if (Tcv != 0) {SBUF = Tcv; Tx_i++;} //不是0就发送.

}

}

//---------------------------------------------------

用485总线实现单片机多机通讯,软件上怎么编程,可不可以给我个例子

485与你的主从单通信有一个最大的区别就是有一个485地址码,如果您知道了RS232通信,那么485通信就应该不在话下了:

比如,一根485线上可以悬挂32个节点,那么,每个节点应该有一个唯一的可识别地址,在通信时,可以可以设置通信格式如下:

0XA5,0X5A,0XUU,0X......(其中将0XA5与0X5A作为握手信号,那么,0XUU(其中UU表示数据),作为485地址识别码,后面的可以表示长度与发送的数据以及校验等),那么你的编程就简单了啊,你发送字符串:0XA5,0X5A,0X01,0X10。。。,那么,这个发送的命令是发送给地址为0X01的485设备,发送的数据就是后面的定义数据了。

跪求:基于RS485的PC机与多单片机通信,要求PC机使用串口调试助手发送*1#指令给单片机时,单片机的led点亮。

这个很简单,我来教你玩:

首先我们说下硬件接法,USB转485信号电路块(只要20元,贵了的都是坑你的),MAX485芯片,11.0592M晶振(这个频率的晶振产生的波特率误差低)

思路:利用串口中断方式对P0口的LED进行控制(我只是举例,程序你自己写)

程序如下:

#include reg51.h //选用晶振11.0592MHz

#define AddressID 0x31 //本机地址1

sbit RS485E=P3^7; //定义485的使能脚// RS5485E=0为接收状态 RS5485E=1为发送状态

sbit MAX485_DIR=P3^7;

main()

{

//****************通讯设置

SCON = 0xF0; //REN=1允许串行接受状态,串口工作模式3,SM2=1

TMOD|= 0x20; //定时器工作方式2

PCON|= 0x80; //波特率提高一倍

IP=0x10; //串口优先级高

TH1 = 0xf4; //fa // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (11.0592M)

TL1 = 0xf4;

TR1 = 1; //开启定时器1

EA = 1; // 开总中断

ES = 1; //开串口中断

RS485E=0; // RS5485E=0为接收状态 RS5485E=1为发送状态

while(1);

}

void counter4(void) interrupt 4 using 2 //串口中断

{

while(RI==0);

RI=0;

if(SBUF==0x2a) //2a的ASCII码是*

{

while(RI==0);

RI=0;

if(SBUF==AddressID) //发送本地地址31的ASCII码是1

{

while(RI==0);

RI=0;

if(SBUF==0x23) //23的ASCII码是#

{

P0=254; //P0=1111 1110,这里写你要对LED控制的程序

}

}

}

}

就是这么简单,已经调试通过,注释也有

PS:回答问题五天后的补充:解决了问题不追问,不给分,这个楼主不厚道,鉴定完毕 !

单片机与pcmax485通信程序的介绍到此就结束了,感谢您耐心阅读,谢谢。

本文标签:单片机与pcmax485通信程序

<