您的位置 首页 新品

单片机和PC经过串口通讯

通信协议:每次PC向单片机发送10个字节的数据,第一个字节为0XFA,数据开始标志,后面8个字节为任意数据,最后一个字节为前9个数据和的低字…

通讯协议:每次PC单片机发送10个字节的数据,榜首个字节为0XFA,数据开端标志,后边8个字节为恣意数据,终究一个字节为前9个数据和的低字节(高字节疏忽),作为校验和。

串口设置:PC串口参数设置

串标语:COM1(默许,具体视运用情况而定)

波特率:9600

数据位:8

其他默许

测验办法:能够用串口调试东西的字符串输入框输入:FAFAFA FA FA FA FA FA FACA,挑选HEX发送,HEX显现,假如每发送一次就接纳到以上数据,并在单片机开发板上正确显现,则测验成功。

//52单片机串口接纳和发送测验程序;

//接纳选用中止方法,发送选用查询方法;

//52串口通讯,T1做串口波特率发生器;

#include “Port_Config.h”//单片机端口界说

#include “LCD_Driver.h”//单片机LCD显现

#include “52_UART.h”//52串口

#defineREC_BUF_LEN10//数据长度

#defineucharunsigned char;

#defineuintunsigned int;

ucharrec_buf[REC_BUF_LEN];//接纳数据缓冲区

uintcheck_sum= 0;//接纳数据校验和

ucharcount= 0;//当时接纳数据个数

bitrec_flag= 0;//数据接纳完结标志

bitstart_flag= 0;//接纳数据开端标志

//==================================================

//函数:void Init_UART1(void)

//描绘:串口初始化函数,运用T1方法2自重载方法做波特率发生器,

//串口运用方法1,8位数据,可变波特率

//参数:无

//回来:无

//作者:geoff日期:2010/11/04

//修正:日期:

//版别:V1.1

//==================================================

void UART1_Init(void)

{

SCON=0x50 ;//方法1,8位可变波特率

TMOD=0x20 ;//定时器1,方法2,8位自重载

PCON=0x00 ;//倍频禁用

TH1=0xfa ;//晶振22.1184MHz,波特率9600;

TL1=0xfa ;//9600

IE|=0x90 ;//开中止

TR1=1 ;//发动定时器

}

//==================================================

//函数:uchar UART1_Receive_Char(void)

//描绘:单片机从串口接纳一个字符

//参数:无

//回来:uchar dat//接纳到的数据

//作者:geoff日期:2010/11/11

//修正:日期:

//版别:V1.1

//==================================================

uchar UART1_Receive_Char(void)

{

uchar rec_data;

while(!RI);//等候接纳完结

RI = 0;//接纳完结后,清接纳完结中止

rec_data = SBUF;

return rec_data;

}

//==================================================

//函数:void UART1_Send_Char(uchar send_data)

//描绘:单片机向串口发送一个字符

//参数:uchar send_data//待发送数据

//回来:无

//作者:geoff日期:2010/11/09

//修正:日期:

//版别:V1.1

//==================================================

void UART1_Send_Char(uchar send_data)

{

SBUF = send_data;

while(!TI);//等候发送完结

TI = 0;//发送完结后,清发送完结中止

}

//==================================================

//函数:void UART1_Send_String(uchar *str, uchar len)

//描绘:单片机向串口发送一个字符串

//参数:uchar *str//待发送数据

//uchar len//字符串长度

//回来:无

//作者:geoff日期:2010/11/10

//修正:日期:

//版别:V1.1

//==================================================

void UART1_Send_String(uchar *str, uchar len)

{

uchar i;

for(i=0; i

{

UART1_Send_Char(*(str+i));

}

}

//==================================================

//函数:void UART1_Intr(void) interrupt 4

//描绘:串口中止处理函数,承受串口向单片机发来的数据

//参数:无

//回来:无

//作者:geoff日期:2010/11/10

//修正:geoff日期:2010/11/12

//版别:V2.1留意:榜首个数据以0XFA开端

//==================================================

void UART1_Intr(void) interrupt 4

{

uchar rec_temp;

if(RI)//RI=1,串口接纳到数据

{

RI = 0;//清RI

rec_temp = SBUF;//接纳数据

if((rec_temp==0xfa)&&(count==0))//判别数据是否以OXFA开端

{

check_sum = 0;//清校验和

rec_buf[count] = rec_temp;//把接纳到的数据存到接纳数组里

count++;//

/////测验用

LCD_DataWrite(rec_temp);//在LCD上显现接纳数据

check_sum += rec_temp;//核算校验和

start_flag = 1;//数据以OXFA开端,置开端标志

}

else if(start_flag==1)//判别数据是否开端

{

rec_buf[count] = rec_temp;//接纳数据

count++;//

/////测验用

LCD_DataWrite(rec_temp);//在LCD上显现接纳数据

check_sum += rec_temp;//核算校验和

if(count==REC_BUF_LEN)//判别是否是终究一位数据,第十位

{

count = 0;//从0从头计数

start_flag = 0;//接纳数据完毕

check_sum -= rec_temp;//核算终究校验和

if((uchar)check_sum==rec_temp)//判别数据接纳是否正确,

{//数据终究一位是校验和的后8位

rec_flag = 1;//置接纳完结标志

}

}

}

}

}

//==================================================

//函数:void UART1_Demo(void)

//描绘:串口通讯测验程序,运用T1方法2自重载方法做波特率发生器,

//串口运用方法1,8位,可变波特率

//晶振22.1184MHz,波特率9600;

//参数:无

//回来:无

//作者:geoff日期:2010/11/08

//修正:geoff日期:2010/11/09

//版别:V1.1

//==================================================

void UART1_Demo(void)

{

UART1_Init();

TI = 1;//SBUF置空

/////测验用

LCD_RegWrite(0x80);

while(1)

{

if(rec_flag == 1)//把接纳到的数据,发送到串口输出

{

rec_flag = 0;//清接纳完结标志

UART1_Send_String(rec_buf,REC_BUF_LEN);

}

Rst_WDT();//喂狗

}

}

//==================================================

//函数:void main(void)

//描绘:主函数

//参数:无

//回来:无

//作者:geoff日期:2010/11/08

//修正:日期:

//版别:V1.1

//==================================================

void main(void)

{

LCD_Init();//单片机LCD初始化

UART1_Demo();

}

本文通过约好特定通讯协议,完成单片机和PC的通讯,通过测验,单片机收发正常;呈现不能通讯时,能够多发几个非0XFA数据,让单片机预备接纳,然后依照约好的格局发送,并确保每次发送字符长度为10个字节。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/265463.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部