单片机串口发送和接受程序

发布者:王岚枫最新更新时间:2019-09-07 来源: eefocus关键字:单片机  串口发送  接受程序 手机看文章 扫描二维码
随时随地手机看文章

include "config.h"


/******************************串口1的波特率********************************/

//T1作波特率发生器

//在波特率加倍情况下 

#define BAUD_57600 256 - (OSC_FREQ/192L)/57600L // 254 FF

#define BAUD_28800 256 - (OSC_FREQ/192L)/28800L // 254 FE

#define BAUD_19200 256 - (OSC_FREQ/192L)/19200L // 253 FD

#define BAUD_14400 256 - (OSC_FREQ/192L)/14400L // 252 FC

#define BAUD_9600 256 - (OSC_FREQ/192L)/9600L // 250 FA


 


#define SYS_Fosc 11059200L //晶振频率

uint32_t COMM_BAUD_RATE=9600 ; //串口波特率

#define OSC_FREQ 11059200 //11059200


static INT8U Send_buf[10] = {0} ;

static INT8U Recv_buf[10] = {0} ;



static INT8U SendDataLen = 0 ;

static INT8U ResendDataLen = 0 ;

/************************************************************************

函 数 名: 串口初始化

功能描述: STC10L08XE 单片机串口初始化函数

返回函数: none

其他说明: none

**************************************************************************/

void UartIni(void)

{

TMOD = 0x20; // 设置 T1 为波特率发生器

SCON = 0x50; // 0101,0000 8位数据位, 无奇偶校验


PCON = 0x00; //PCON=0;


TH1=256-(SYS_Fosc/COMM_BAUD_RATE/32/12);//设置为9600波特率

TL1=256-(SYS_Fosc/COMM_BAUD_RATE/32/12);


TR1 = 1; //定时器1打开

REN = 1; //串口1接收使能

ES = 1; //串口1中断使能

EA = 1; 

}

//串口接受函数初始化1

void UartIni1(void)

{

SCON = 0x50; //8-bit variable UART

TMOD = 0x20; //Set Timer1 as 8-bit auto reload mode

TH1 = TL1 = -(SYS_Fosc/12/32/COMM_BAUD_RATE); //Set auto-reload vaule

TR1 = 1; //Timer1 start run

ES = 1; //Enable UART interrupt

EA = 1; //Open master interrupt switch

}

/***********************************************************

* 名 称: 

* 功 能: 

* 入口参数: 无 

* 出口参数:无

* 说 明: 

**********************************************************/

void Uart_Isr() interrupt 4 using 1

{

if(RI)

{


}


}

/************************************************************************

功能描述: 串口发送一字节数据 sbuf=data 

接受 data=sbuf

入口参数: DAT:带发送的数据

返 回 值: none

其他说明: none

**************************************************************************/

void Uart_PutByte(uint8_t DAT)

{

ES = 0;

TI=0;

DAT=SBUF ;

while(TI==0);

TI=0;

ES = 1;

}

///*****************************************************************************************************

// - 功能描述: 串口接受一帧数据

// - 隶属模块: 内部 

// - 参数说明: 

// - 返回说明: 

// - 注:无 

//*****************************************************************************************************/

void SendCmd(INT8U len )

{

INT8U i = 0 ;

for(i=0; i{

Uart_PutByte(Send_buf[i]) ;

}

}


///********************************************************************************************

// - 功能描述:求和校验

// - 隶属模块:

// - 参数说明:

// - 返回说明:

// - 注: 和校验的思路如下

// 发送的指令,去掉起始和结束。将中间的6个字节进行累加,最后取反码

// 接收端就将接收到的一帧数据,去掉起始和结束。将中间的数据累加,再加上接收到的校验

// 字节。刚好为0.这样就代表接收到的数据完全正确。

//********************************************************************************************/

void DoSum( INT8U *Str, INT8U len)

{

INT16U xorsum = 0;

INT8U i;


for(i=0; i{

xorsum = xorsum + Str[i];

}

xorsum = 0 -xorsum;

*(Str+i) = (INT8U)(xorsum >>8);

*(Str+i+1) = (INT8U)(xorsum & 0x00ff);

}



///********************************************************************************************

// - 功能描述: 串口向外发送命令[包括控制和查询]

// - 隶属模块: 外部

// - 参数说明: CMD:表示控制指令,请查阅指令表,还包括查询的相关指令

// feedback:是否需要应答[0:不需要应答,1:需要应答]

// data:传送的参数

// - 返回说明:

// - 注: 

//********************************************************************************************/

void Uart_SendCMD(INT8U CMD ,INT8U feedback , INT16U dat)

{

Send_buf[0] = 0xff; //保留字节 

Send_buf[1] = 0x06; //长度

Send_buf[2] = CMD; //控制指令

Send_buf[3] = feedback;//是否需要反馈

Send_buf[4] = (INT8U)(dat >> 8);//datah

Send_buf[5] = (INT8U)(dat); //datal

DoSum(&Send_buf[0],6); //校验

SendCmd(8); //发送此帧数据

}



/************************************************************************

功能描述: 串口发送字符串数据

入口参数: *DAT:字符串指针

返 回 值: none

其他说明: API 供外部使用,直观!

**************************************************************************/

void PrintCom(uint8_t *DAT)

{

while(*DAT)

{

Uart_PutByte(*DAT++);

}

}


/************************************************************************

功能描述: 串口发送字符串数据 直接发送 hex 文件 0x0f

等价于 0f

入口参数: *DAT:字符串指针

返 回 值: none

其他说明: API 供外部使用,直观!

**************************************************************************/

void PrintCom1(uint8_t *DAT)

{


int i;

for(i=0;i<12;i++)

{

Uart_PutByte(*DAT++); //Uart_PutByte 串口发送一字节数据 sbuf=data 

}

}


关键字:单片机  串口发送  接受程序 引用地址:单片机串口发送和接受程序

上一篇:以AT24C02为例的IIC通信协议
下一篇:单片机中Sprint函数

推荐阅读最新更新时间:2024-11-09 06:23

图文详解STM32单片机远程升级
1、需要两份程序 BootLoader和App程序,两份程序均可以通过jlink下载,只需要将下载地址修改一下即可: 2、在BootLoader中的跳转函数 #define APP_FLASH_ADDR 0x8008000 iap_load_app(APP_FLASH_ADDR); //#include include.h #include iap.h #include main.h typedef void (*iapfun)(void);//?¨ò?ò???oˉêyààDíμ?2?êy. iapfun jump2app; __asm void MSR_MSP(u32 addr)
[单片机]
图文详解STM32<font color='red'>单片机</font>远程升级
51单片机数据类型int,float,指针所占字节数
1.int===2个字节 2.sfr===特殊功能寄存器,也是一种扩充数据类型,占用1个内存单元,利用它可以访问51单片机内的所有特殊功能寄存器。 sfr P1 = 0x90;/////////这一句定义P1为P1端口在片内的寄存器。 3.sfr16===16位特殊功能的寄存器。用于定时器T0,T1 4.sbit===可录址位,也是一种扩充数据类型。利用它可访问芯片内部RAM中的可寻址位或特殊功能寄存器的可寻址位。 sfr P1 = 0x90;/////////因P1端口的寄存器是可寻址位的,所以我们可以定义 sbit P1_1 = P1^1;///////P1_1为P1中的P1.1引脚 ////////== sbit P1_1
[单片机]
51<font color='red'>单片机</font>数据类型int,float,指针所占字节数
将LPC55S16-EVK MCU用于工业应用
LPC5500系列微控制器(MCU)为寻求能够处理从机器人技术到工业应用的各种应用的设备的现代嵌入式设计人员提供了许多功能。在本文中,探讨LPC5500系列的另一个成员LPC55S16 MCU,该器件非常适合工业和专业应用,这得益于其150 MHz的快速时钟速度,开箱即用的CAN-通讯支持。 FD总线网络,电流消耗低。 LPC55S16-EVK功能和应用 LPC55S16-EVK开发板基于LPC55S1x MCU系列,这是基于Arm®Cortex®-M33的LPC5500系列MCU中的简化入门级系列。这些微控制器带有多达256 KB的闪存和单个内核。它保持较小的64针HTQFP封装,并以最高150MHz的时钟频率工作。该Tru
[单片机]
将LPC55S16-EVK <font color='red'>MCU</font>用于工业应用
51单片机采用ADC0808检测ADC_LCD1602显示
系统整体设计 1)本设计的控制器采用51单片机 2)ADC0808采集光敏电阻的分压 光照强度越弱,被点亮的LED数目越多,当弱到一定阈值的时候 Speaker报警 3)LCD1602显示当前电压值 具体实现如下代码 #include reg51.h #include stdio.h #define uchar unsigned char #define uint unsigned int #define DATA_PORT P0 #define OPEN 0 #define CLOSE 1 volatile uchar Speaker_Alarm = 0; uchar Flag_2s = 0; //---------
[单片机]
51<font color='red'>单片机</font>采用ADC0808检测ADC_LCD1602显示
7.STC15W408AS单片机串口通信
STC15W408AS只有一个串口,串口1,有4种工作方式,其中两种方式的波特率是可变的,另两种是固定的,以供不同应用场合选用。 一、串口1相关寄存器 下面只把接下来我需要的寄存器和寄存器的位说明一下。 1.1 控制寄存器SCON 其中SM0、SM1按下列组合确定串行口1的工作方式: REN:允许/禁止串行接收控制位。由软件置位REN,即REN=1为允许串行接收状态,可启动串行接收器RxD,开始接收信息。软件复位REN,即REN=0,则禁止接收。 TI: 发送中断请求标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置位,即TI=1,向主机请求中断,响应中断后TI必须用软件清零,即TI=0。在其他方式
[单片机]
7.STC15W408AS<font color='red'>单片机</font><font color='red'>串口</font>通信
为什么说嵌入式开发比单片机难?说的太对了
单片机和嵌入式,其实没有什么标准的定义来区分他们,对于进行过单片机和嵌入式开发的开发者来说,都有他们自己的定义,接下来,就谈谈本人对这两个概念的理解和感悟。 首先明确概念,什么是单片机,单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。 比如最经典的51系列单片机,如下图所示,外
[单片机]
步进电机控制+普中51单片机+普中官方
1 实验现象 通过ULN2003驱动模块控制28BYJ48步进电机运行方向及速度,当按下KEY1键可调节电机旋转方向;当按下KEY2键,电机加速(5档);当按下KEY3键,电机减速(5档);同时将电机转速档位显示在数码管上。 2 实验原理 (1)步进电机必须加驱动才可以运转,驱动信号必须为脉冲信号,没有脉冲的时候,步进电机禁止,加入适当的脉冲信号,就会以一定的角度(成为步角)转动。转动的速度和脉冲的频率成正比。 (2)步进电机具有瞬间启动和急速停止的优越特性; (3)改变脉冲的顺序,可以方便的改变转动的方向。 3 系统框图 4 硬件设计 见《普中-2&普中-3&普中-4开发板原理图》:独立按键模块、单片机核心
[单片机]
步进电机控制+普中51<font color='red'>单片机</font>+普中官方
基于单片机的智能照明控制系统设计
随着电子技术的飞速发展,基于单片机的控制系统已广泛应用于工业、农业、电力、电子、智能楼宇等行业,微型计算机作为嵌入式控制系统的主体与核心,代替了传统的控制系统的常规电子线路。楼宇智能化的发展与成熟,也为基于单片机的照明控制系统的普及与应用奠定了坚实的基础。本文介绍了基于单片机AT89C51的室内灯光控制系统及其原理,提出了有效的节能控制方法。该系统采用了当今比较成熟的传感技术和计算机控制技术,利用多参数来实现对学校教室室内照明的控制。系统以单片微型计算机为核心外加多种接口电路组成,共有六个主要部分:AT89C51芯片、光信号采集电路、人体信号采集电路、时钟控制电路DS12887、输出控制电路、定时监视器电路。 主控制
[单片机]
基于<font color='red'>单片机</font>的智能照明控制系统设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved