两个at89c52单片机与pc机串口通信通过串口通信

单片机、电路板
连接器、接插件
其他元器件
AT89C52单片机与VB串行通信的实现
AT89C52单片机与VB串行通信的实现
& & 1. 引言:
& & 随着计算机系统的应用和微机网络的发展,各种控制设备之间的通信功能越来越显得重要。在设计的减振控制系统中,控制器(下位机)采用两片AT89C52单片机,分别用于对左右减振器实施控制,同时将测量的温度、电流、速度等信号按一定采样时间保存在E2PROM ATC256中。为了能测试控制器的工作情况,包括初始安装时的状况测试和读取历史记录
& & 1. 引言:
& & 随着计算机系统的应用和微机网络的发展,各种控制设备之间的通信功能越来越显得重要。在设计的减振控制系统中,控制器(下位机)采用两片AT89C52单片机,分别用于对左右减振器实施控制,同时将测量的温度、电流、速度等信号按一定采样时间保存在E2PROM ATC256中。为了能测试控制器的工作情况,包括初始安装时的状况测试和读取历史记录并做测试诊断以及能根据参数变化情况进行故障诊断,为此,同时开发了通信系统,上位机采用便携式PC机,上、下位机之间通过MAX485芯片实现串行数据通信。
& & 2. 通信系统硬件电路设计
& & 通信系统硬件电路设计的突出特点是,控制器的外围一改传统的并行扩展,而采用新型串行芯片进行串行总线扩展。与传统的并行扩展相比,具有体积小、性能价格比高、工作可靠性高的优点。存储器ATC256、通信芯片MAX485均是I2C总线器件。单片机AT89C52的串行数据发送端TXD和串行数据接受端 RXD分别与MAX485驱动器输入端DI和驱动器输出端D0,接受器输出使能端RE接地,驱动器输出使能端DE接单片机的T1端(P3.5脚)。存储器 ATC256的串行数据线SDA和串行时钟线SCL分别AT89C52的P3.7和P3.6相连,具体硬件电路框图如图1所示:
& & 3.数据的存储&ATC256①
& & 测得的温度、电流和速度等信号需实时保存,以便根据参数变化情况进行故障诊断和对加速度变化情况进行分析等。系统设计存储器采用美国ATMEL公司推出的串行E2PROM&&24C256。24C256遵从I2C总线协议,通过数据线SDA和时钟线SLA两根线直接与单片机相连,不需要其它器件和外围电路。它具有256Kbit的位存储容量,按8位一个字节的方式可提供32K字节的存储空间。对ATC256的读写操作完全符合I2C总线的数据传送,传送的每一帧数据为一个字节,要求每传送一个字节后,对方回应一个应答位。发送时先放送数据最高位,每次传送开始有起始信号,结束时有停止信号。在系统的设计中,对ATC256的写操作采用字节写,读操作采用顺序读的方式。根据系统要求,每到一分钟就向ATC256中写入1条记录(包括三个温度、电流、速度等 5个数据),上位机需要读取数据时,可根据上位机的读取指令读取任意条记录。
& & 对ATC256的读/写程序流程如图2所示:
图2 字节写(左),连续读(右)程序流程& & & & & & &
4.串行数据通信程序设计
& & 4.1通信协议
& & 本系统串行通信采用异步通信方式。协议如下:
& & 1. 一帧数据由1位起始位、8位数据位、无奇偶校验位、1位停止位共10位组成。
& & 2. 波特率设为2400bps。单片机串行口按方式1工作,波特率由定时器T1控制,
& & PC机串口波特率通过VB通讯控件的Settings属性设置,为保证数据传送的准确性,两者的波特率必须一致。
& & & & 4.2下位机(单片机)串行通信及程序设计
& & 单片机可以采用中断方式或查询RI(接受中断标志位)或TI(发送中断标志位)方式进行数据通信②。设计采用查询方式,在定时器T2中断子程序中查询 RI,一旦检测到RI=1则转入接受数据子程序,在子程序中单片机读取从上位机发送的通信指令、读取记录个数等数据,经校验正确后,即从ATC256存储器中将历史记录数据上传给PC机,单片机发送数据子程序流程图如图3:
图3单片机发送数据子程序流程图
& & 4.3上位机(PC机)串行通信及程序设计
& & 1.编程方法
& & 上位机利用Visual BasIC 6.0编程。用VB6.0开发串行通信程序有两种法,一种是利用Windows的API函数;另一种是采用VB6.0的通信控件MSComm。利用API 函数编写串行通信程序较为复杂,需要掌握大量的通信知识,其优点是可实现的功能更丰富、应用面更广泛,适合于编写较为复杂的低层次通信程序。而VB6.0 的MSComm通信控件提供了标准的事件处理函数、事件、方法,并通过控件属性对串口参数进行设置,比较容易地解决了串口通信问题。
& & 2.VB6.0的通信控件及通信方式③
& & MSComm是VB6.0提供的ActiveX控件,使用前需将该控件添加到VB工具栏。MSComm控件具有功能完善的串口数据发送和接受功能,有两种处理通信的方式,即事件驱动方式和查询方式,事件驱动方式是利用MSComm控件的OnComm事件捕获并处理通信错误事件,是处理串行端口交互作用的一种非常有效的方法;查询方式是通过检查CommEvent属性的值来判断事件和错误。
& & 本系统采用事件驱动方式进行串口通信设计,图4为上位机通信界面,设计4个命令按纽,分别为发送命令、退出、保存、浏览数据;两个文本框,Text2用于输入需从下位机读取的记录个数,Text3用于显示下位机发送来的数据;进行数据通信的单片机和串行通信口的选择通过两组单选按纽完成。在发送命令按纽的 Click事件中,将通信指令通过串行口发送给上位机,当选择左侧单片机时(变量LR(1)=1),通信指令为&ET&,选择右侧单片机时(变量LR(1)=2),通信指令为 &DT&,数据传送以回车符(十进制ASCII码为13)作为结束标记。
& & 下面是MSComm控件的初始化程序、部分数据发送和接受程序: MSComm控件的初始化(属性设置)程序: MScomm1.ComPort=1&
;设置串行端口(com1) MScomm1.Settings=2400,n,8,1 ;设置波特率及数据帧格式 MScomm1.InputMOde=1 ;数据接受按字节(binary)方式 MScomm1.InbufferSize=4000 ;数据接受缓冲区大小为4000字节 MScomm1.InputLen=0 ;INPUT读取缓冲区的所有内容
& & 数据发送程序: Private Sub Command1_ClICk() Dim outbuf(1 To 6) As Byte Dim lstr1 As String Dim hstr2 As String Dim len1 As Integer Command1.EnabLED = False len1 = Len(Hex(Val(Text2.Text))) &&& If LR(1) = 1 Then outbuf(1) = 69& & &
;对应字符&E& Else outbuf(1) = 68& & &
;对应字符&D& End If outbuf(2) = 84& & & & &
;对应字符&T& outbuf(3) = LR(1) outbuf(4) = stoby(hstr2)&
outbuf(5) = stoby(lstr1) outbuf(6) = 13 MScomm1.RThreshold = 5 * Val(Text2.Text) MScomm1.Output = outbuf End Sub
& & 数据接受程序: Private Sub MScomm1_OnComm()&
Select Case MScomm1.CommEvent Case comEvReceive Dim inbuf() As Byte, i%, buf$ & & & buf = "" & & & inbuf = MScomm1.Input & & & Rev_num = UBound(inbuf) & & & ReDim lnum(0 To Rev_num) As Integer &
For i = 0 To Rev_num & & & & lnum(i) = inbuf(i) & & & & buf = buf + Str(inbuf(i)) + "& & " & Next i Case comEvSend End Select End Sub
& & 由于MSComm控件数据接受设计为按字节方式,可接发的数值范围为0~255。当上位机读取数据个数超过255(1字节)时,为了能让下位机正确接受,解决方法是通过编制的函数stoby将文本框Text2输入的记录个数(字符型)转化成字节型,并分成两个字节送给下位机。另外,系统中有关数据保存、数据图表处理、打印等功能的实现在此不再赘述。
& & 5.结论
& & 2C总线器件的采用简化了硬件电路设计,提高了可靠性。本系统已投入使用,经过实际应用表明,通信系统工作稳定、可靠。满足系统要求,每到一分钟就向 ATC256中写入1条记录(5个数据),ATC256可保存12小时的记录,下位机需要读取数据时,可根据下位机的读取指令读取任意条记录。
& & [参考文献] [1]ATMEL 2-wires Serial EEPROMs& AT24C128/256[DK]. [2]何立民,单片机高级教程[M],北京:北京航空航天大学出版社,1999年. [3]范逸之 陈立元,Visual Basic 与RS-232串行通信控制[M],北京:中国青年出版社,2002年. &
型号/产品名
深圳优耐检测技术有限公司
深圳优耐检测技术有限公司
深圳优耐检测技术有限公司
深圳优耐检测技术有限公司
深圳优耐检测技术有限公司没有女朋友
基于AT89C52和串口通信助手的串口通信
我们要实现的功能是在程序运行的时候通过单片机的串口向串口调试助手发送一个字符串诸如“hello world”,串口通信助手接收到字符串之后显示并由用户反馈回去一个长度为4的字符串并显示到数码管上
来看一下效果
首先是串口通信电路的配置和借助VSPD、串口通信助手对相关串口的设置
通过VSPD创建两个可以相互通信的虚拟串口,如COM1和COM2。点击添加端口按钮后,可以看到左边栏中的虚拟端口处看到你新创建的两个虚拟端口。
打开串口调试助手V2.2,对其进行配置,将串口改为COM2端口,波特率设为9600,校验位选择NONE,数据位为8位,停止位为1位
电路图中的配置:首先将晶振改为11.0592MHZ,再将AT89C52芯片中的晶振也改为11.0592MHZ。再配置串口,将物理端口设置为COM1,物理波特率设置为9600,物理数据位数设为8位,物理奇偶校验位设置为NONE,下面的虚拟波特率、虚拟数据位数和虚拟奇偶校验位与上面相同。
接下来上电路图
用VSPD创建两个虚拟端口
可以通过设备管理器来查看串口是否创建成功
AT89C52的相关配置
对COMPIM的相关配置
一些端口的设置
硬件配置的差不多了,接下来我们看看如何在Keil里编写代码实现,这里仅摘录一些比较重要的代码片段,感兴趣的可以[下载代码](http://download.csdn.net/detail/lrwwll/9720330)
void ser_inout(uchar datas)
for(i = 0 ; i & 8 ; i++)
if( (datas & 0x80) == 0)
datas &&= 1;
void Display()
uint i = 0;
while( i!=900 )
ser_inout(table[show[0]]);
delay_ms(1);
ser_inout(table[show[1]]);
delay_ms(1);
ser_inout(table[show[2]]);
delay_ms(1);
ser_inout(table[show[3]]);
delay_ms(1);
void printf(uchar dat[])
uint i = 0;
for(i = 4;i & 0;i--)
show[4-i]=dat[4-i];
Display();
void init()
TMOD=0X20;
SCON=0X50;
PCON&=0XEF;
void send(uchar txd)
while(!TI);
void send_buf(uchar dat[])
while(dat[i]!='\0')
send(dat[i]);
SCON=0x50:
SCON是串行口控制寄存器,0x50为16进制,转换成二进制是,对应下附表各位,即将串行口控制寄存器设置为串行口工作方式1并允许中断接收数据.
附:scon寄存器结构表
SCON SM0 SM1 SM2 REN TB8 RB8 TI RI
位地址 9FH 9EH 8DH 9CH 9BH 9AH 99H 98H
TMOD=0x20:
TMOD是定时/计数器方式控制寄存器,所以TMOD=0x20是将定时/计数器1设置为工作方式2.
TH1=0xE8,TL1=0xE8:
给定时/计数器1装初值,即确定定时时长,具体时间与晶振有关.
TI=1,TR=1:
由上附表可得,TI和RI是SCON寄存器的最低两位.TI:发送中断标志位 ,RI:接收中断标志位.
TI=1表示帧发送结束,RI=1表示帧接收完成.
没有更多推荐了,两个AT89C51单片机之间如何进行串行通信_百度知道
两个AT89C51单片机之间如何进行串行通信
求高手用C写个简单的程序来解析它!
我有更好的答案
  #define T1MS_1200bps
/* (e8,-24,SMOD=0) @4800bps
pcon&=0x7f @11.0592MHz*/  #define T1MS_2400bps
/* (f4,-12,SMOD=0) @4800bps
pcon&=0x7f */  #define T1MS_4800bps
/* (fa, -6,SMOD=0) @4800bps
pcon&=0x7f */  #define T1MS_9600bps
/* (fd, -3,SMOD=0) @9600bps
pcon&=0x7f */  #define T1MS_19k2bps
/* (fd, -3,SMOD=1) @19.2kbps pcon|=0x80 */    /*********************************  函数名:sel_bps(select bps)  功能:设置串口波特率  sel为选择通讯速率:  0=0,2=0,4=19.2k  作者:于振南  日期:06.02.25  *********************************/  void sel_bps(unsigned char sel)  {  switch(sel)  {  case 0:PCON&=0x7f;  TH1=T1MS_1200
/* T1 use sio */  TL1=T1MS_1200    case 1:PCON&=0x7f;  TH1=T1MS_2400
/* T1 use sio */  TL1=T1MS_2400    case 2:PCON&=0x7f;  TH1=T1MS_4800
/* T1 use sio */  TL1=T1MS_4800    case 3:PCON&=0x7f;  TH1=T1MS_9600
/* T1 use sio */  TL1=T1MS_9600    case 4:PCON|=0x80;  TH1=0
/* T1 use sio */  TL1=0    }  }  /*********************************  函数名:tran_init()(tranmit initialize)  功能:串口初始化  通讯有关参数初始化  作者:于振南  日期:06.02.25  包含子函数:sel_bps  *********************************/  void tran_init()
/* 通讯有关参数初始化 */  {  sel_bps(3); /* 选择通讯速率:0=0,2=0,4=19.2k */  /* T1 use sio */  TMOD=0x21;
/* T1=MODE2, T0=MODE1,16bit,use time */  PS=1;
/* SIO int high
优先级 */  EA=1;  ET1=0;  SM0=0;  SM1=1;
/* SM0=0 SM1=1,mode1,10bit
*/  SM2=0;
/* data int,无校验(TB8=bit_duble偶) */  TR1=1;  REN=1;  RI=0;  TI=0;  ES=1;  }  /*********************************  函数名:sio_int(sio interrupt)  功能:中断方式接收串口数据
把收到的一个字节放在z中  通讯有关参数初始化  作者:于振南  日期:06.02.25  *********************************/  void
sio_int() interrupt 4 using 2  {  ES=0;  if(RI)
/* RI==1 */  {
z=SBUF;  RI=0;  }  ES=1;  }  void trans(unsigned char dat)  {  SBUF=  while(!TI);  TI=0;  }
采纳率:21%
为您推荐:
其他类似问题
您可能关注的内容
串行通信的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。求AT89C52单片机用MAX485与PC机串口通讯程序_百度知道
求AT89C52单片机用MAX485与PC机串口通讯程序
麻烦高手能提供:用C语言编写的完整程序,或有示例,标有注释也可。
1,我想要的结果:用串口调试助手,向单片机发送命令(字母和数字),并可以收到单片机返回来的指定的命令(字母合数字)。2,caijianteng,你好,我运行了你的程序,发现串口调试助手中的接收区没有命令返回啊,麻烦你再解决下。
我有更好的答案
通信协议: 第1字节,MSB为1,为第1字节标志,第2字节,MSB为0,为非第一字节标志,其余类推……,最后一个字节为前几个字节后7位的异或校验和。
测试方法:可以将串口调试助手的发送框写上 95 10 20 25,并选上16进制发送,接收框选上16进制显示,如果每发送一次就接收到95 10 20 25,说明测试成功。
//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收
//和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的
#include &reg51.h&
#include &string.h&
#define INBUF_LEN 4 //数据长度
unsigned char inbuf1[INBUF_LEN];
unsigned char checksum,count3;
bit read_flag= 0 ;
void init_serialcomm( void )
SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80 ; //SMOD=1;
TH1 = 0xF4 ; //Baud:4800 fosc=11.0592MHz
IE |= 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
//向串口发送一个字符
void send_char_com( unsigned char ch)
while (TI== 0 );
//向串口发送一个字符串,strlen为该字符串长度
void send_string_com( unsigned char *str, unsigned int strlen)
unsigned int k= 0 ;
send_char_com(*(str + k));
} while (k & strlen);
//串口接收中断函数
void serial () interrupt 4 using 3
if (ch& 127 )
count3= 0 ;
inbuf1[count3]=
checksum= ch- 128 ;
inbuf1[count3]=
checksum ^=
if ( (count3==(INBUF_LEN- 1 )) && (!checksum) )
read_flag= 1 ; //如果串口接收的数据达到INBUF_LEN个,且校验没错,
//就置位取数标志
init_serialcomm(); //初始化串口
while ( 1 )
if (read_flag) //如果取数标志已置位,就将读到的数从串口发出
read_flag= 0 ; //取数标志清0
send_string_com(inbuf1,INBUF_LEN);
}接收到的数据放在inbuf1[]数组里面了!!!还有问题的话,我可以把C51文件给你发到邮箱里
采纳率:15%
如果与电脑连接的话,直接用单片机通过max232与电脑连接就行啦如果用485,电脑端、单片机都要加个485芯片转成485才能通信电路图如图,把其中一端改成电脑并加个232转485模块就行啦,单片机端程序#include&&reg51.h&#define&uchar&unsigned&charsbit&sendkey=P2^0;unsigned&char&void&init(void)//串口初始化{&&TMOD=0x20;&&TH1=0&&TL1=0&&PCON=0x00;&&TCON=0x40;&&TR1=1;&&SCON=0x50;}void&main(){&&init();&&while(1)&&{&&&&&&&//------------------&&&&&&&//485接收字符&&&&&&&&sendkey=0;&while(RI==0);&tempy=SBUF;&RI=0;&&&&&&&//------------------&&&&&&&//485发送字符&&&&&&&&sendkey=1;&&&&&&&&SBUF=&while(TI==0);TI=0;&&&&&&&//-------------------&&&&&&}}&好好检查下你的硬件程序我没有改运行效果见图晶振11.0592MHz
首先要有通讯协议的.
问一下你的硬件是怎么接的,我引用下面的程序出不来
也想要一份
邮箱 先谢过!
其他2条回答
为您推荐:
其他类似问题
您可能关注的内容
串口通讯的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。51单片机(AT89C52)串口收发程序
#include&reg52.h&
#define uchar unsigned char
uchar rtemp,
void SerialInit() //11.0592M晶振,波特率9600
TMOD=0x20; //设置定时器1工作方式为方式2
//启动定时器1
//串口方式1
//允许接收
PCON=0x00; //关倍频
//开串口中断
//开总中断
void SerialService() interrupt 4
rtemp=SBUF; //读缓冲区
void main()
SerialInit();
if(sflag==1)
ES=0; //发送期间关闭串口中断
while(!TI);
ES=1; //发送完成开串口中断
没有更多推荐了,

我要回帖

更多关于 单片机与电脑串口通信 的文章

 

随机推荐