51单片机串口通信,232通信,485通信,程序

合集下载

51单片机实现的485通讯程序

51单片机实现的485通讯程序

标签:modbus8051源程序modbus协议--51端程序的实现RTU需要一个定时器来判断3.5个流逝时间。

#define ENABLE 1#define DISABLE 0#define TRUE 1#define FAULT 0#define RECEIVE_EN 0#define TRANSFER_EN 1#define MAX_RXBUF 0x20extern unsigned char emissivity;extern unsigned char tx_count,txbuf[15];extern unsigned char rx_count,rxbuf[15];extern unsigned char tx_number,rx_number;extern bit rx_ok;unsigned char rx_temp;void InitTimer1() //针对标准8051{TMOD=(TMOD|0xf0)&0x1f; //将T1设为16位定时器TF1=0;TH1=0x62; //设T1位3.5位的接收时间35bit/9600bit/s=3.646msTL1=0x80;//晶振为11.0592MHz,T=65535-3.646ms*11.0592MHz/12=0xf2df//0x6280是22.1184M下LPC9XX下的值。

ET1=1;//允许T1中断TR1=1;//T1开始计数}void timer1() interrupt 3 using 2 //定时器中断{TH1=0x62; //3.646ms interruptTL1=0x80;if(rx_count>=5) //超时后,若接收缓冲区有数则判断为收到一帧{rx_ok=TRUE;}}void scomm() interrupt 4 using 3 //modbus RTU模式{if(TI){TI = 0;if(tx_count < tx_number) //是否发送结束{SBUF = txbuf[tx_count];}tx_count++;}if(RI){rx_temp=SBUF;if(rx_ok==FAULT) //已接收到一帧数据,在未处理之前收到的数舍弃{if(rx_countrxbuf[rx_count]=rx_temp;rx_count++;}TH1=0x62; //timer1 reset,count againTL1=0x80;RI=0;}}在主循环中判断标志rx_ok来执行帧处理。

单片机对RS232-RS485相互通讯的硬件设计

单片机对RS232-RS485相互通讯的硬件设计

70内蒙古石油化工2014年第4期单片机对R S232--R S485相互通讯的硬件设计雷兆钢(包头供电局,内蒙古包头014030)摘要:随着数据采集系统的广泛应用,通常由单片机构成的应用系统常需要与PC机之间交换数据,实现单片机与PC机之间的通讯功能,以充分发挥PC和单片机之间的功能互补,资源共享的优势。

但常用的R S一232协议在某些场合下不能满足设计的要求,如在长距离传输时,传输信号易受外界的干扰。

本文设计一种硬件电路。

利用R S一232争R S一485接口芯片,实现单片机与PC机之间的远程通讯。

关键词:长距离传输;R S一485接口;转换中图分类号:TP368.1文献标识码:A文章编号:1006--7981(2014)04—0070—03目前,在很多的分布式数据采集和控制系统中,为了克服单片机的功能不足,都引入了PC机。

并采用主从式结构模式,即以PC机为主机,分布在现场的各个单片机系统为从机而组成的系统结构进行串行通信。

大多数的电脑设备都具有R S一232接口,然而由于R S一232接口标准出现较早,难免有不足之处,R S一485即是其中一个性能优于R S--232的接口,较后者而言,R S一485的接口信号电平低,且与TTL电平兼容;传输速率高;传输距离长。

因此,在一定的场合中,需通过R S一485接口进行通讯,把R S一232接口转换为R S--485接口成为了实际通信中的一个必要环节。

l概述1.1串行通信的概念所谓“串行通信”是指外设和计算机问使用一根数据信号线(另外需要地线,可能还需要控制线),数据在一根数据信号线上一位一位地进行传输,每一位数据都占据一个固定的时间长度。

在串行通信中,数据通常是在两个站(如终端和微机)之间进行传送,同一时刻按照数据流的方向可分成三种基本的传送方式:全双工、半双工、和单工。

但单工目前已很少采用。

目前多数终端和串行接口都为半双工方式提供了换向能力,也为全双工方式提供了两条独立的引脚。

51单片机串口通信程序。。含详细例子

51单片机串口通信程序。。含详细例子
while(RI == 0); RI = 0; c = SBUF; // 从缓冲区中把接收的字符放入 c 中 SBUF = c; // 要发送的字符放入缓冲区 while(TI == 0); TI = 0; } }
4.//////////////// /////////////////////////////////////////////////////////
pw.fpReadSign(); SendData();//通知上位机,送出读出器件特征字 }
void Erase()//擦除器件 {
pw.fpErase(); SendData();//通知上位机,擦除了器件 }
void Write()//写器件 {
BYTE n; pw.fpInitPro();//编程前的准备工作 SendData();//回应上位机表示进入写器件状态,
{
unsigned char c;
TMOD = 0x20; // 定时器 1 工作于 8 位自动重载模式, 用于产生波特率
TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate))); SCON = 0x50; PCON = 0x00; TR1 = 1; IE = 0x00; // 禁止任何中断 while(1) {
///////////////////////////////////////////////////////////////////////////////// //所支持的 FID,请在这里继续添加
///////////////////////////////////////////////////////////////////////////// extern void PreparePro00();//FID=00:AT89C51 编程器 extern void PreparePro01();//FID=01:AT89C2051 编程器 extern void PreparePro02();//FID=02:AT89S51 编程器

51单片机的串口通信程序

51单片机的串口通信程序

单片机串口通信程序#include <reg52.h>#include<intrins.h>#include <stdio.h>#include <math.h>#define uchar unsigned char#define uint unsigned intsbit Key1 = P2^3;sbit Key2 = P2^2;sbit Key3 = P2^1;sbit Key4 = P2^0;sbit BELL = P3^6;sbit CONNECT = P3^7;unsigned int Key1_flag = 0;unsigned int Key2_flag = 0;unsigned int Key3_flag = 0;unsigned int Key4_flag = 0;unsigned char b;unsigned char code Num[21]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x 02,0x78,0x00,0x10,0x89};unsigned char code Disdigit[4] = {0x7F,0xBF,0xDF,0xEF};unsigned char Disbuf[4];void delayms(uint t){uint i;while(t--){/* 对于11.0592M时钟,约延时1ms */for (i=0;i<125;i++){}}}//-----------------------------------------------------void SendData(uchar Dat){uchar i=0;SBUF = Dat;while (1){if(TI){TI=0;break;}}}void ScanKey(){if(Key1 == 0){delayms(100);if(Key1 == 0){Key1_flag = 1;Key2_flag = 0;Key3_flag = 0;Key4_flag = 0;Key1 = 1;}else;}if(Key2 == 0){delayms(100);if(Key2 == 0){Key2_flag = 1;Key1_flag = 0;Key3_flag = 0;Key4_flag = 0;Key2 = 1;}else;}if(Key3 == 0){delayms(50);if(Key3 == 0){Key3_flag = 1;Key1_flag = 0;Key2_flag = 0;Key4_flag = 0;Key3 = 1;}else;}if(Key4 == 0){delayms(50);if(Key4 == 0){Key4_flag = 1;Key1_flag = 0;Key2_flag = 0;Key3_flag = 0;Key4 = 1;}else;}else;}void KeyProc(){if(Key1_flag){TR1 = 1;SendData(0x55);Key1_flag = 0;}else if(Key2_flag){TR1 = 1;SendData(0x11);Key2_flag = 0;}else if(Key3_flag){P1=0xff;BELL = 0; CONNECT = 1;Key3_flag = 0;}else if(Key4_flag){CONNECT = 0;BELL = 1;Key4_flag = 0;}else;}void Initdisplay(void){Disbuf[0] = 1;Disbuf[1] = 2;Disbuf[2] = 3;Disbuf[3] = 4;}void Display() //显示{unsigned int i = 0;unsigned int temp,count;temp = Disdigit[count];P2 =temp;temp = Disbuf[count];temp = Num[temp];P0 =temp;count++;if (count==4)count=0;}void time0() interrupt 1 using 2 {Display();TH0 = (65535 - 2000)/256;TL0 = (65535 - 2000)%256;}void main(){Initdisplay();TMOD = 0x21;TH0 = (65535 - 2000)/256;TL0 = (65535 - 2000)%256;TR0 = 1;ET0 = 1;TH1 = 0xFD; //11.0592MTL1 = 0xFD;PCON&=0x80;TR1 = 1;ET1 = 1;SCON = 0x40; //串口方式REN = 1;PT1 = 0;PT0 = 1;EA = 1;while(1){ScanKey();KeyProc();if(RI){Disbuf[0] = 0;Disbuf[1] = 20;Disbuf[2] = SBUF>>4;Disbuf[3] = SBUF&0x0f;RI = 0;}else;}}。

51单片机串口通信

51单片机串口通信

51单片机串口通信51单片机串口通信(转载)2009-03-03 18:22一、串口通信原理串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计算机端,而且也能实现计算机对单片机的控制。

由于其所需电缆线少,接线简单,所以在较远距离传输中,得到了广泛的运用。

串口通信的工作原理请同学们参看教科书。

以下对串口通信中一些需要同学们注意的地方作一点说明:1、波特率选择波特率(Boud Rate)就是在串口通信中每秒能够发送的位数(bits/second)。

MSC- 51串行端口在四种工作模式下有不同的波特率计算方法。

其中,模式0和模式2波特率计算很简单,请同学们参看教科书;模式1和模式3的波特率选择相同,故在此仅以工作模式1为例来说明串口通信波特率的选择。

在串行端口工作于模式1,其波特率将由计时/计数器1来产生,通常设置定时器工作于模式2(自动再加模式)。

在此模式下波特率计算公式为:波特率=(1+SMOD)*晶振频率/(384*(256-TH1))其中,SMOD——寄存器PCON的第7位,称为波特率倍增位;TH1——定时器的重载值。

在选择波特率的时候需要考虑两点:首先,系统需要的通信速率。

这要根据系统的运作特点,确定通信的频率范围。

然后考虑通信时钟误差。

使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。

为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信。

下面举例说明波特率选择过程:假设系统要求的通信频率在20000bit/s以下,晶振频率为12MHz,设置SMOD=1(即波特率倍增)。

则TH1=256-62500/波特率根据波特率取值表,我们知道可以选取的波特率有:1200,2400,4800,9600,19200。

列计数器重载值,通信误差如下表:因此,在通信中,最好选用波特率为1200,2400,4800中的一个。

2、通信协议的使用通信协议是通信设备在通信前的约定。

单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。

「51单片机」RS232串口通信代码分析

「51单片机」RS232串口通信代码分析

「51单⽚机」RS232串⼝通信代码分析想来想去不知道要怎么样把232串⼝通信说清楚,想想还是直接把代码分析⼀遍吧...重点是“常⽤波特率与定时器1的参数关系”这张表格!波特率的设置很重要!⼀、串⼝初始化void usart_init(){SCON = 0x50; //REN=1允许串⾏接受状态,串⼝⼯作模式1TMOD = 0x20; //定时器⼯作⽅式2PCON = 0x00;TH1 = 0xFD; //波特率9600、数据位8、停⽌位1。

效验位⽆ (11.0592M)TL1 = 0xFD;ES = 1; //开串⼝中断EA = 1; //开总中断TR1 = 1; //启动定时器}SCON寄存器1.SM0、SM1:串⾏⼝⼯作⽅式控制位2.SM2:多机通信控制位3.REN:允许接收位4.TB8:发送接收数据位85.RB8:接收数据位86.TI:发送中断标志位 TI=1表⽰帧发送结束7.RI:接收中断标志位 RI=1表⽰帧接收完成1.GATE:门控制位 GATE=0,仅受TRX控制 GATE=1,受TRX和外部中断引脚共同控制2.C/T:定时器模式和计数器模式选择器 C/T=1,计数器 C/T=0,定时器3.M1、M0:⼯作⽅式选择位PCON寄存器SMOD:是波特率是否加倍的选择位。

SMOD=0时:波特率不加倍。

SMOD=1时:波特率加倍。

⼆、串⼝数据发送void send_data(unsigned char a){SBUF = a; //SUBF接受/发送缓冲器while(0 == TI); //每次等待发送完毕,再执⾏下⼀条TI=0; //⼿动清0}SBUF:有两个物理上独⽴的接收、发送缓冲器SBUF,它们占⽤同⼀地址99H ;接收器是双缓冲结构;发送缓冲器,因为发送时CPU是主动的,不会产⽣重叠错误。

TI:发送中断标志位 TI=1表⽰帧发送结束三、串⼝中断程序void ser_int (void) interrupt 4using1{if(1 == RI) //RI接受中断标志{RI = 0; //清除RI接受中断标志ReData = SBUF; //SUBF接受/发送缓冲器Flag=1; //标志位置1表⽰有新数据进来}}RI:接收中断标志位 RI=1表⽰帧接收完成四、总代码#include<reg51.h>//变量声明unsigned char SenData, //发送数据Flag, //标志位ReData; //接收数据//函数声明void usart_init(); //串⼝中断初始化void send_data(unsigned char a); //串⼝数据发送//---------------------------//串⼝中断初始化//---------------------------void usart_init(){SCON = 0x50; //REN=1允许串⾏接受状态,串⼝⼯作模式1TMOD = 0x20; //定时器⼯作⽅式2PCON = 0x00;TH1 = 0xFD; //波特率9600、数据位8、停⽌位1。

(完整word版)51单片机之间的通信程序

(完整word版)51单片机之间的通信程序

以下程序通过实践检测完全可以放心使用不过注意硬件电路的连接单片机的串口通信主要理解SCON的状态控制寄存器的用法波特率的设定1 两个单片机一个为主机一个为从机,又主机控制从机的LED灯得简单程序入手注意硬件的连线将单片机串口的第二引脚与另一单片机串口的第三引脚相连同时另一单片机的第二串口引脚也与前一个单片机的第三引脚相连主机部分的程序设计//主机程序发送控制信号的#include〈reg52。

h〉#define uchar unsigned char#define uint unsigned intsbit KEY=P3^0;//按键sbit ledA=P1^1;//定义了三个灯来指示发送的字符是什么sbit ledB=P1^3;sbit ledC=P1^5;sbit ledstop=P1^6;uchar KEY_number=0;//按键计数void delay(unsigned int z)//延时函数{unsigned int x,y;for(x=z;x〉0;x—-)for(y=240;y〉0;y-—);}void init(){SCON=0x40;//主机串口工作方式1 REN=0 之允许发送不能接收TMOD=0x20;PCON=0x00;TH1=0xfd;TL1=0xfd;T1=RI=0;//必须要做来保证可以顺利进入终端TR1=1;EA=1;ES=1;}void Put_charToSBUF(uchar c) //把一个字符写入SBUF{SBUF=c;while(TI==0); //巧妙的等待处理等带发送完毕TI=0;}void main(){init();while(1){if(KEY==0){delay(5);if(KEY==0){ P1=0xff;while(!KEY);KEY_number++;if(KEY_number==4) KEY_number=0;}}switch (KEY_number){case 0: ledstop=0; break;case 1: ledA=~ledA; Put_charToSBUF(’A’);break;case 2: ledB=~ledB; Put_charToSBUF('B'); break;case 3: ledC=~ledC; Put_charToSBUF('C'); break;}delay(100) ;}}从机部分的程序#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit d1=P1^0;sbit d2=P1^1;sbit d3=P1^2;void delay(unsigned int z)//延时函数{unsigned int x,y;for(x=z;x〉0;x—-)for(y=240;y〉0;y—-);}void init(){SCON=0x50;//允许串口接收 TMOD=0x20;PCON=0x00;TH1=0xfd;TL1=0xfd;RI=0;TR1=1;EA=1;ES=1;}void main(){init();while(1){if(RI){RI=0;switch(SBUF){case 'A’: d1=~d1;break;case 'B’: d1=1; d2=~d2;break;case ’C’: d2=1; d3=~d3; break;}}else d1=d2=d3=1;delay(100) ;}}上面的程序是一主一从单片机之间也可以建立一个双向的通信过程//甲机程序发送控制信号的同时接收乙机发来的串口信息并//且显示在数码管上#include〈reg52。

51单片机串口通信程序。。含详细例子

51单片机串口通信程序。。含详细例子

{ P3_4=0; P3_3=1;
} void RstPro()//编程器复位 {
pw.fpProOver();//直接编程结束 SendData();//通知上位机,表示编程器就绪,可以直接用此函数因为协议号(ComBuf[0])还没被修改,下同 }
void ReadSign()//读特征字 {
} void serial () interrupt 4 using 3 //串口接收中断函数 {
if (RI) { RI = 0 ; ch=SBUF; read_flag= 1 ; //就置位取数标志 }
} main()
{ init_serialcom(); //初始化串口 while ( 1 ) { if (read_flag) //如果取数标志已置位,就将读到的数从串口发出 { read_flag= 0 ; //取数标志清 0 send_char_com(ch); } }
while(RI == 0); RI = 0; c = SBUF; // 从缓冲区中把接收的字符放入 c 中 SBUF = c; // 要发送的字符放入缓冲区 while(TI == 0); TI = 0; } }
4.//////////////// /////////////////////////////////////////////////////////
SendData(); } else break;//等待回应失败 } pw.fpProOver();//操作结束设置为运行状态 ComBuf[0]=0;//通知上位机编程器进入就绪状态 SendData(); }
void Lock()//写锁定位
{
pw.fpLock();
SendData();
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档