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

作者&投稿:调裘 (若有异议请与网页底部的电邮联系)
pc单片机之间串口通信的程序~

//这是PC发给单片机数据,单片机再回给PC
#include // 引用头文件,里面包含了一些对51单片机内部寄存器的定义

#define uchar unsigned char //定义unsigned int为uint
#define uint unsigned int //定义unsigned uchar为uchar

uchar rec_data; //定义一个字符型变量用于存放接收到的数据
bit rec_flag; //定义一个位变量(接收到数据记标志)
sbit rec_led = P0^0; //接收指示灯为P0^0
sbit send_led = P0^1; //发送指示灯为P0^1


//========= 串口中断服务函数 ============
void serial_int() interrupt 4
{
if(RI) //判断是否为接收中断
{
RI = 0; //接收中断标志清0
rec_data = SBUF; //保存数据
rec_led = 0; //点亮接收指示灯
rec_flag = 1; //接收标志置1
}
}

//========= 主函数 ============
void main()
{
SCON = 0x50; //设置串口工作于方式1,允许接收
TMOD = 0x20; //
TH1 = 0xfD; //设置波特率为9600
TL1 = 0xfD;
TR1 = 1; //启动定时器1
ES = 1; //允许串口中断
EA = 1; //关闭所有中断
rec_flag = 0;
while(1) //主循环
{
rec_led = 1; //接收指示灯熄灭
send_led = 1; //发送指示灯熄灭
if(rec_flag==1) //判断是否接收到数据
{
rec_flag = 0; //接收标志清0
send_led = 0; //点亮发送指示灯
SBUF = rec_data; //把接收到的数据发送出去
while(!TI); //等待发送完毕一个字节
TI = 0; //发送中断标志清0
}
}
}

有两种方法与PC通信:

1,加接一个USB转串口的硬件设备(网上很容易买到),这样既解决了数据线的连接又解决了单片机供电问题,但PC端可能需要安装USB驱动,而且要碰运气,往往因USB驱动问题无法一次成功;
2,通过RS232接口与PC通信,当然也少不了硬件支持,自己做或到网上买一RS232模块,步骤1:将模块9针D型接口连接至电脑COM1或COM2,按模块的标注将RXD和TXD及公共地连接至单片机相关电路,步骤2:通过PC端USB接口取电并连接至单片机相关电路,USB接口的PIN1通常为VCC(正电源端)PIN4通常为GND(负电源端)。这样做可能麻烦一些,但一次成功的概率会高很多。
如果你的电脑硬件配置中没有RS232接口的COM1或COM2,那你只能采用第1种方法了。

http://hi.baidu.com/bluebasket/blog/item/835033097c7117ab2fddd46f.html
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语言开发单片机程序时,汇编语言是没有可移植性的)。至于如何能够减小程序移植的工作量,使得程序具有更好的通用性,以最小的代价就可以平滑地移植到其他单片机平台上,也是一个非常值得探讨的问题。

#include<reg52.h>
#define uchar unsigned char

void main()
{
uchar send=234;

TMOD=0X20;
SCON=0X40;
TL1=0XF3;
TH1=0XF3;
PCON=0X80;
TR1=1;
EA=1;
ES=1;

SBUF=send;
while(!TI)
TI=0;

while(1);

}

#include<reg52.h>
#define uchar unsigned char
sbit sda=P2^1;
sbit clock=P2^0;
uchar recive;
void disp();
void delay10(del);

void main()
{
TMOD=0X20;
clock=1;
TL1=0XF3;
TH1=0XF3;
PCON=0X80;
TR1=1;
EA=1;
ES=1;
SCON=0X50;
while (1)
{
while(1)
}

}

/************中断接收*******************/
void send_rev() interrupt 4 using 2
{
while (!RI);
RI=0;
recive=SBUF;

}
最简单的串口发送接收程序,接收你也可以用查询方式。

你可以参考一下这个...
http://hi.baidu.com/37772166/blog/item/8757c1580bb6ad85800a1887.html
希望对你有所帮助..

我博客上那个程序完全满足你的要求,你可以去参考一下.


单片机、微机、C语言分别有什么不同,各自应用在什么场合?
单片机:主要运用汇编语言,用在简单的电子CPU中,可以烧录执行代码,例如以前电视机中的CPU芯片,完成简单的设置及换台等指令 微机:微型计算机,实际上单片机可以看做是简单的微机,执行代码较少 C语言:程序开发语言,早期的JAVA,现在的安卓底层都是用C语言写的。望采纳,谢谢 ...

单片机控制与PLC控制的区别?
一、功能特性不同 单片机控制器基于单片机的芯片及其他电子元器件与控制外部电路的集成PCB板组合在一起的控制器叫单片机控制板,通常它是应用于一些简单的工业控制当中。应用C语言或者其他的控制语言来编写控制动作流程以达到工业控制的最终目的,相比而言较为经济实惠。PLC控制系统是在传统的顺序控制器的基础...

求51的C程序,单片机与电脑互通信,要求通过电脑发送数据,后单片机接收...
建议楼主找找《51单片机C语言创新教程》温子祺等著,北京航空航天大学出版社的。源码转自:《51单片机C语言创新教程》温子祺等著。\/*实验名称:串口收发数据实验 描 述:在使用单片机的串口接收数据实验当中,使用串口调试助手发送什么数据,单片机采用查询法将接收到的数据返发到PC 作 者:温子祺 ...

plc语言与单片机语言和c语言有什么共同点-区别?
编译之后在单片机上烧录的机械语言 是由操作码和操作数,全是0和1表示的,把用类似单词的助记符一一对应操作码,就是汇编。C语言是高级语言,需要有软件包降译成机器语言再烧入单片机。PLC的核心是单片机,可以用梯形图、指令表、功能框图来编程,指令表像汇编,梯形图、功能框图是经过了一层很“厚”...

单片机的原理
可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭褒、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备,五花八门,无所不在。 4.在计算机网络和通信领域中的应用 现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,...

学习单片机要有哪些基础知识?
8051 CPU碢C指定的地址,从ROM相应单元中取出指令字节放在指令寄存器中寄存,然后,指令寄存器中的指令代码被译码器译成各种形式的控制信号,这些信号与单片机时钟振荡器产生的时钟脉冲在定时与控制电路中相结合,形成按一定时间节拍变化的电平和时钟,即所谓控制信息,在CPU内部协调寄存器之间的数据传输、运算等操作。三、存储...

C语言怎么应用到单片机
这个就是你首先要有一块自己的单片机最小系统板,然后在电脑上使用你的单片机软件编写好C程序,然后把最小系统板连接到电脑上,然后给最小系统板上电,在电脑上下载程序,OK

C语言的问题,《微型计算机与单片机技术》这本书的问题,求代码注解...
typedef unsigned int uint16; \/\/ 同上 define BUZZER() P3 ^= 0x01 \/\/ 定义BUZZER()为P3口最低位取反 code uint8 LED_CODE[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; \/\/ 定义rom里的一组常数 void delay(uint1...

单片机的实质,就是利用c语言来对 寄存器的操作?
c语言也好,汇编语言也好,也只不过是一种编程语言罢了,真正的应用是通过用户编写的程序来控制单片机完成各种工作,也就是各种操作,来实现单片机对各种设备的控制工作。因此,你说的“对寄存器的操作”只是一些基本的操作而已,或者是一些基本的控制方式而已,而真正的控制对象是外部配置的设备,比如简单的...

求51单片机串口程序,单片机与PC互通讯,C语言
include <AT89X51.H>#include <string.h>#include "com_0.h"sbit led1=P1^0;sbit led2=P1^6;sbit led3=P2^5;sbit led4=P2^0;sbit sw1=P3^6;sbit sw2=P3^7; \/\/接到XTAL1不对void SetupTimer0(){TMOD &=0XF0; \/\/仅保留T1信息TMOD |=0X02; \/\/设置T0:定时功能,方式2,自动...

泰和县17371055239: 求一个PC与单片机串口通信的程序 -
梁风氢化: #include <REG52.H> bit Flag; unsigned int ReData,SenData; void main (void) { SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1TMOD|= 0x20; //定时器工作方式2PCON= 0x00;TH1 = 0xFD; //baud reload value 9600、数据位8、停...

泰和县17371055239: PC与单片机串口通信程序设计 -
梁风氢化: 1、上位机采用VC++,当然其所采用的语言是C/C++,利用WINDOWS API或微软自带的一个串行通讯控件,都很容易实现串行通讯2、下位机采用Arduino单片机,双方统一好同一波特率及诸如奇偶校验等的协议或约定3、上位机可以采用事件机制以处理数据的收发,而下位机采用串行中断方式,处理数据的收发4、更多参考,可参考我空间有关文章.

泰和县17371055239: 这是个单片机C语言的一个程序,是单片机与PC机串口通讯的,能帮我每条解释下有什么作用,是干什么的? -
梁风氢化:#include void Send(unsigned char dat) //串口发送 { SBUF=dat; while(TI==0) ; TI=0; } unsigned char Receive(void) //串口接收 { unsigned char dat; while(RI==0); RI=0; dat=SBUF; Send(dat); //把接收的数据发送回去 return dat; //返回接收...

泰和县17371055239: 我想用C语言写一个串口程序,单片机和PC机通讯, -
梁风氢化: 分为三个部分进行设计1. 上位机:使用一种语言(最好用可视化的,最简单的如VB)设计界面及程序,要点是读写串口.2. 设计通信协议:字符采用ASCII码表示,协议可以包括起始+数据+检验.3. 单片机部分设计:串口设置(选择中断方式或查询方式)、接收串口数据(读取SBUF)、数据处理(根据协议解读、译码)、判断哪种、编码(转换ASCII码)、回复(写SBUF).

泰和县17371055239: 求单片机与PC机基于汇编语言的串口通信程序!!! -
梁风氢化: 简单啊 首先设置串口波特率 mov tmod, #22h//设置定时器1工作方式 mov scon,#50h //设置串口方式 anl pcon,#7fh mov th1, #0d9h//这个要具体算 根据波特率和晶振算 mov tl1,#0d9h setb tr1 setb et1 setb ea mov sbuf,a//a是你采集的温度 jbc ti, $//发送完毕 清零TI clr ti 自己写的不完全对 仅供参考

泰和县17371055239: pc单片机之间串口通信的程序 -
梁风氢化: //这是PC发给单片机数据,单片机再回给PC#include <reg51.h> // 引用头文件,里面包含了一些对51单片机内部寄存器的定义#define uchar unsigned char //定义unsigned int为uint#define uint unsigned int //定义unsigned uchar为uchar uchar rec_...

泰和县17371055239: 求大神给一单片机与PC通过串口助手进行串口通信的汇编程序 -
梁风氢化: 主要是串口初始化的设置,设置好了就可以通信了,但是还需要编程读取BUFF的数据告诉单片机收到计算机发来的不同字符时候做相应处理,可以在串口中断内处理数据

泰和县17371055239: 求51单片机与PC串行通讯C51简单小程序?(PC向单片机发送并返回接收状态控制小灯点亮,简易.是为了做实验 -
梁风氢化: #include <REG52.H> sbit LED = P2^0; bit Flag; unsigned int ReData,SenData; void main (void) { SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1TMOD|= 0x20; //定时器工作方式2PCON= 0x00;TH1 = 0xFD; //baud reload value ...

泰和县17371055239: 求一个C51单片机与PC机串口通信的程序 -
梁风氢化: #include<reg52.h> unsigned char flag,a; void main() { TMOD=0x20;//设置定时器1为工作方式2TH1=0xfd;TL1=0xfd;TR1=1;REN=1;SM0=0;SM1=1;EA=1;ES=1;while(1){/* if(RI==1){RI=0;P1=SBUF;}*/if(flag==1){ES=0;flag=0;...

泰和县17371055239: pc机与单片机串口通信 -
梁风氢化: 进中断服务程序后,应先关闭串口中断ES=0,单片机往PC数据发送完之后再打开串口中断,跳出中断服务子程序. 另外发送时最好用while语句,如:SBUF=Temp;while(TI!=1);TI=0; //等待发送完成 ES=1; //打开串口中断

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网