通讯协议:每次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个字节。