当前位置:首页 > 单片机 > 单片机
[导读]想来想去不知道要怎么样把232串口通信说清楚,想想还是直接把代码分析一遍吧...重点是“常用波特率与定时器1的参数关系”这张表格!波特率的设置很重要!一、串口初始化void usart_init(){ SCON = 0x50; //

想来想去不知道要怎么样把232串口通信说清楚,想想还是直接把代码分析一遍吧...

重点是“常用波特率与定时器1的参数关系”这张表格!波特率的设置很重要!

一、串口初始化

void usart_init()

{

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

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

PCON = 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:发送接收数据位8

5.RB8:接收数据位8

6.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 4 using 1

{

if(1 == RI) //RI接受中断标志

{

RI = 0; //清除RI接受中断标志

ReData = SBUF; //SUBF接受/发送缓冲器

Flag=1; //标志位置1表示有新数据进来

}

}


RI:接收中断标志位 RI=1表示帧接收完成


四、总代码



#include


//变量声明

unsigned char SenData, //发送数据

Flag, //标志位

ReData; //接收数据


//函数声明

void usart_init(); //串口中断初始化

void send_data(unsigned char a); //串口数据发送


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

//串口中断初始化

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

void usart_init()

{

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

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

PCON = 0x00;

TH1 = 0xFD; //波特率9600、数据位8、停止位1。效验位无 (11.0592M)

TL1 = 0xFD;

ES = 1; //开串口中断

EA = 1; //开总中断

TR1 = 1; //启动定时器

}


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

//串口数据发送

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

void send_data(unsigned char a)

{

SBUF = a; //SUBF接受/发送缓冲器

while(0 == TI); //每次等待发送完毕,再执行下一条

TI=0; //手动清0

}


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

//串口中断程序

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

void ser_int (void) interrupt 4 using 1

{

if(1 == RI) //RI接受中断标志

{

RI = 0; //清除RI接受中断标志

ReData = SBUF; //SUBF接受/发送缓冲器

Flag=1; //标志位置1表示有新数据进来

}

}


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

//主函数

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

void main()

{

usart_init(); //串口中断初始化

while(1)

{

if (Flag==1) //判断是否有数据过来,有则进入循环

{

EA=0; //进入循环之后就把总中断关闭,防止处理过程中又有中断进来

//----------------------该段即对接收的数据进行处理

if(ReData=='a')

SenData = 'b';

else

SenData = 'c';

send_data(SenData); //串口数据发送

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

Flag=0; //数据处理完毕后将标志位置0,表示没有新数据要处理

EA=1; //打开总中断,允许接收新数据

}

}

}


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

STM32与51单片机之间有什么差异呢?两者可以说是一场科技与性能的较量了。在科技飞速发展的今天,微控制器(MCU)已广泛应用于各类电子设备和系统中,发挥着举足轻重的作用。其中,STM32和51单片机作为两种常见的微控制...

关键字: STM32 51单片机 MCU

51单片机将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对51单片机的相关情况以及信息有所认识和了解,详细内容如下。

关键字: 单片机 51单片机

上位机串口通信是指在上位机(通常是计算机或微控制器)与外部设备之间通过串行通信协议进行数据传输和通信的过程。在串口通信中,数据以位为单位按顺序传送,通常使用一个或两个物理线路(通常是两条线)来实现数据的发送和接收。

关键字: 上位机 串口通信

串口通信(Serial Communication)是一种常用的数据传输方式,它通过串行数据线逐位传输数据,具有成本低、简单易用、可靠性高等优点。在工业控制、通信设备、嵌入式系统等领域得到广泛应用。

关键字: 串口通信 嵌入式系统

串口通信是一种常见的通信方式,用于在不同设备之间传输数据。它通过串行数据线(通常是一对TXD和RXD线)在设备之间进行通信。串口通信具有简单、可靠、成本低等优点,因此在工业控制、嵌入式系统、数据采集等领域得到广泛应用。

关键字: 串口通信 串口编程

串口通信是一种常见的通信方式,主要应用于计算机和其他设备之间的数据传输。它的主要原理是利用串行数据传输的方式,将数据一位一位地按顺序传输,而不是同时传输所有的数据。下面我们来看看串口通信的主要原理以及如何提高其传输速度。

关键字: 串口通信 串口速度

串口通信是一种常见的通信方式,它通过串行方式传输数据。串口通信的原理相对简单,主要涉及到数据位的传输和接收。在串口通信中,数据按照一定的波特率(baud rate)逐位传输。通常,一个字节的数据由8位组成,所以传输一个字...

关键字: 串口通信 波特率

RS 232串口通信是一种常见的串行通信协议,广泛应用于计算机和其他设备之间的数据传输。它是由美国电子工业协会(EIA)制定的一种标准,规定了数据传输的物理层和部分数据链路层的规范。

关键字: RS 232 串口通信

虽然 USB 几乎完全取代那些旧电缆和连接器,但 UART 绝对不会成为过去。您会发现许多 DIY 电子项目都使用 UART。

关键字: UART 串口通信 USB

STM32是一款由STMicroelectronics生产的微控制器系列,具有高性能、低功耗和丰富的外设资源。其中,串口通信是一种常用的通信方式,可以实现与其他设备之间的数据传输。

关键字: STM32 串口通信 微控制器
关闭
关闭