用户登录
用户注册

分享至

51串口通信软件 51串口通信程序求大神

  • 作者: 法拉利集团亚洲分区总裁
  • 来源: 51数据库
  • 2020-04-21

第一:

--应该先设置方式,之后再 REN = 1。

--其原因不难理解。

第二:为什么我发送10,单片机发送给我的是“你好1”,而不是“你好10”,发送20,只能接受到2.。。。

--每当单片机收到一字节,你就关闭了串口中断,而进行发送《你好1》。

--1 后面的 0,因为你关闭中断,耽误了接收,遗失了。

--收一次X,就发送《你好X》,时间上,显然,也难以配合。

--你的这种编程思路,把《全双工》的串口,弄成了《半双工》。

参考一下:

http://hi.baidu.com/do_sermon/item/bfe96e2a46eafc13097508ee

51单片机串口通信程序

程序不正确,你这个程序的结果,应该是电脑上发一次''1",后永远 SBUF=='1' ,所有在重复

亮 与 灭,因为时间很快,人眼睛反应不过来,所以 一直是 亮 的,

简单的 你 可以改变 一种方式 试试, 发''1" 亮, 发''0" 灭,

去掉 if(cont==0),if(cont==1) 等等。

51单片机串行通信

串行通信分为查询方式和中断方式;

TI和RI分别是8位串行口控制寄存器SCON的第1位和第0位;

1.TI:发送中断标志位。在方式0中,发送完8位数据后,由硬件置位;在其它方式中,在发送停止位之初由硬件置位。因此,TI=1是发送完一帧数据的标志,其状态可供软件查询使用,也可请求中断。但是TI位必须由软件清零。

2.RI:接收中断标志位。在方式0中,接收完8位数据后,由硬件置位;在其它方式中,在接收到停止位时由硬件置位。因此,RI=1是接收完一帧数据的标志,其状态可供软件查询使用,也可请求中断。但是RI位必须由软件清零。

======================================================================

查询方式:主要是通过while(!TI);语句来查询发送是否完毕。没有发送完毕时,TI=0,while(!TI)语句为真,单片机继续查询;直到发送完毕,TI由硬件置位,这时while(!TI)语句为假,跳出该语句,然后必须写入TI=0来软件清零。

同样RI也是由while(!RI);语句来查询是否接收完毕,原理同TI,不再赘述。

======================================================================

中断方式:首先开中断,串行口发送时,当TI置位(发送完一帧数据后)后向CPU申请中断,在中断服务程序中要用软件把TI清零,也就是写入TI=0语句,以便发送下一帧数据;串行口接收数据时,当RI置位(接收完一帧数据后)后向CPU申请中断,在中断服务程序中要用软件把RI清零。

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就发送.

}

}

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

一道51单片机的C语言程序,关于串口通讯的,很简单......

#include<reg52.h> //头文件,c语言一样

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

#define uint unsigned int

unsigned char flag,a,i; //定义unsigned char变量,其实这里用uchar也行

uchar code table[]="I receive, thanks "; //定义一个数组,存放到rom中,因为有code

void init()

{

} //设置工作方式,这个懂。

void main()

{

init(); //调用初始化函数

while(1) //while(1)循环,就是一直在这里面循环,一直接收

{

if(flag==1) //等待标志位也就是要等待接收中断执行之后,标志位置1,就是执行接收中断后,flag为1

{

ES=0; //关掉中断

for(i=0;i<18;i++) //for循环,依次取出数据发送(你写错了,是8)

{

SBUF=table[i]; //将你取出的一个uchar型数据送给SBUF

while(!TI); //等待发送完成,当发送完成后TI为1

TI=0; //发送中断清零,智能软件清零如果不清0会一直中断,出错的会

}

SBUF=a; //然后再发个a

while(!TI); //同上

TI=0;

ES=1; //置位中断标志位

flag=0; //清除标志位

}

}

}

void serial() interrupt 4 //中断,注意是interrupt 4

{

RI=0; //当发生中断清楚接收中断标志RI,也就是置0,它只能软件清零,一定要注意,只要你发送或者接收到后,RI和TI都会置位,必须软件清0

a=SBUF; //从SBUF中取出数据

flag=1; //标志位置1

}

呵呵,好了,慢慢来吧,单片机还是挺重要的~~~

记得给分啊~~~

(*^__^*) 嘻嘻……

51单片机串口通信

  #include <reg51.h>

  #include <string.h>

  unsigned char ch;

  bit read_flag= 0 ;

  void init_serialcom( void ) //串口通信初始设定

  {

  SCON = 0x50 ; //UART为模式1,8位数据,允许接收

  TMOD |= 0x20 ; //定时器1为模式2,8位自动重装

  PCON |= 0x80 ; //SMOD=1;

  TH1 = 0xFD ; //Baud:19200 fosc="11".0592MHz

  IE |= 0x90 ; //Enable Serial Interrupt

  TR1 = 1 ; // timer 1 run

  TI=1;

  }

  //向串口发送一个字符

  void send_char_com( unsigned char ch)

  {

  SBUF=ch;

  while (TI== 0);

  TI= 0 ;

  }

  //串口接收中断函数

  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);

  }

  }

  }

51简单的串口通信程序

好好看 SBUF就可以了 在汇编里面是 mov sbuf,a 就可以了.. 串口程序比较简单,还是自己动手好。 而且初学者也能学到很多东西 ...

请问51单片机与51单片机之间的串口通信程序怎么写?

1、查询方式:

#include<reg51.h>

main()

{

unsigned char dat;

TMOD=0x20;

TH1=TL1=0xfd;

SCON=0x50;

TR1=1;

while(1)

{

if(RI)//接收

{

RI=0;

dat=SBUF;

}

SBUF=dat;//发送

while(!TI);

TI=0;

}

}

2、中断方式:

#include<reg51.h>

unsigned char dat;

bit flag;

void uart_isr() interrupt 4

{

if(RI)//接收

{

RI=0;

dat=SBUF;

flag=1;

}

if(TI)TI=0;

}

main()

{

TMOD=0x20;

TH1=TL1=0xfd;

SCON=0x50;

TR1=1;

EA=1;

ES=1;

flag=0;

while(1)

{

if(flag)

{

SBUF=dat;

flag=0;

}

}

}

转载请注明出处51数据库 » 51串口通信软件 51串口通信程序求大神

软件
前端设计
程序设计
Java相关