单片机和PC通过串口通信

发布者:梦幻之光最新更新时间:2016-05-31 来源: eefocus关键字:单片机  PC  串口通信 手机看文章 扫描二维码
随时随地手机看文章
通信协议:每次PC向单片机发送10个字节的数据,第一个字节为0XFA,数据开始标志,后面8个字节为任意数据,最后一个字节为前9个数据和的低字节(高字节忽略),作为校验和。

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

       串口号    :    COM1(默认,具体视使用情况而定)

       波特率    :    9600

       数据位    :    8

       其他默认

测试方法:可以用串口调试工具的字符串输入框输入:FA FA FA FA FA FA FA FA FA CA,选择HEX发送,HEX显示,如果每发送一次就接收到以上数据,并在单片机开发板上正确显示,则测试成功。

 

//52单片机串口接收和发送测试程序;

//接收采用中断方式,发送采用查询方式;

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

 

#include "Port_Config.h"                     //单片机端口定义

#include "LCD_Driver.h"                     //单片机LCD显示

#include "52_UART.h"                        //52串口

 

#define    REC_BUF_LEN     10          //数据长度

#define    uchar      unsigned char;

#define    uint         unsigned int;

 

uchar      rec_buf[REC_BUF_LEN];     //接收数据缓冲区

uint         check_sum     = 0;               //接收数据校验和

uchar      count             = 0;               //当前接收数据个数

bit           rec_flag          = 0;               //数据接收完成标志

bit           start_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个字节。

关键字:单片机  PC  串口通信 引用地址:单片机和PC通过串口通信

上一篇:使用单片机普通IO口模拟串口的三种方法
下一篇:关于单片机和PC通信显示中文的乱码问题

推荐阅读最新更新时间:2024-03-16 14:55

基于C8051F单片机的数字倾角传感器设计
  1 引言   随着市场需求和科技的发展,人们对工程、机械、航空、航海设备的可靠性和稳定性提出了更高的要求,其中姿态测量是一项重要的指标。倾角传感器是测量关于某一基准面的倾斜角或者是姿态的装置。目前,市场上已有单轴、双轴、三轴的倾角传感器,但大多都价格昂贵或者体积较大。本文提出以双轴传感器SCA100t 和C8051F 单片机实现的设计,可大大降低系统成本,不但可以构成一个单独的数字输出传感器,也可以作为一个测量模块,嵌入到测量控制系统中,广泛应用于机器人控制、平台姿态(俯仰和滚转)测量、双轴加速度测量等系统中。   2 硬件电路设计   整个系统结构如图1 所示。可分为供电电路、角度测量和数据采集与输出等。系统采用宽电源
[单片机]
基于C8051F<font color='red'>单片机</font>的数字倾角传感器设计
基于单片机控制的程控有源滤波器电路
有源滤波器广泛应用于数字信号处理、通信、自动控制领域,但设计可变宽频带有源滤波器则比较困难。利用单片机控制参数可编程的双二阶通用开关电容有源滤波器,精确设置有源滤波器的中心频率f0,品质因数Q及有源滤波器的工作方式。 2 开关电容有源滤波器工作原理 开关电容有源滤波器的基本原理是在电路两节点之间接具有高速开关的电容器,等效于两节点之间连接一只电阻。图1(a)是一个有源RC积分器,图1(b)是采用一只接地电容C1和CMOS开关T1、T2替代输入电阻R1。图1(c)是不重叠的两相时钟脉冲,用于驱动T1、T2。时钟频率fCLK高于信号频率。当φ1为高电平时,T1导通(视短路)而T2截止(视开路),此时C1与输人信号V1相连并充电
[工业控制]
基于<font color='red'>单片机</font>控制的程控有源滤波器电路
基于51单片机的pwm直流电机调速
仿真原理图如下 单片机源程序如下: #include reg52.h /********************************************* * 定时器初值 *********************************************/ #define T0HIGH 0xec #define T0LOWW 0x8a /********************************************* * *********************************************/ typedef unsigned char u8; typed
[单片机]
基于51<font color='red'>单片机</font>的pwm直流电机调速
单片机控制多普勒血流计系统的设计和实现
0 引言   多普勒血流计的出现标志着在微血管灌流方面取得重大进步。本设计采取双通道装置拾取多普勒信号,有效地抑制噪声信号,采用单片机来对信号进行控制及处理,既简化了电路,又有助于信号的处理及读取。运用12位的AD574A不但提高了信号精度,利用其双极性,也省去了以往信号处理中复杂的乘方、开方电路或绝对值电路。通过四位LED显示,直观、准确地读取血细胞灌流量的瞬时相对定量值,可精确到小数点后两位。并同时配有扬声器来形象表示信号的强弱和变化。还可通过绘图仪,对信号进行长时间检测、记录,以便研究和分析。 1 系统总体方案   系统组成框图如图1所示。系统工作时,从激光探头发射出一束激光照射到组织上,并穿透组织形成一个半径为1mm
[医疗电子]
<font color='red'>单片机</font>控制多普勒血流计系统的设计和实现
51单片机寄存器功能一览表
21个特殊功能寄存器(52系列是26个)不连续地分布在128个字节的SFR存储空间中,地址空间为80H-FFH,在这片SFR空间中,包含有128个位地址空间,地址也是80H-FFH,但只有83个有效位地址,可对11个特殊功能寄存器的某些位作位寻址操作(这里介绍一个技巧:其地址能被8整除的都可以位寻址)。 在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。在单片机中有一些独立的存储单元是用来控制这些器件的,被称之为特殊功能寄存器(SFR)。这样的特殊
[单片机]
C51单片机看门狗电路
采用89C51单片机和X25045组成的看门狗电路,X25045硬件连接图如图1所示。X25045芯片内包含有一个看门狗定时器,可通过软件预置系统的监控时间。在看门狗定时器预置的时间内若没有总线活动,则X25045将从RESET输出一个高电平信号,经过微分电路C2、R3输出一个正脉冲,使CPU复位。图1电路中,CPU的复位信号共有3个:上电复位(C1、R2),人工复位(S、R1、R2)和Watchdog复位(C2、R3),通过或门综合后加到RESET端。C2、R3的时间常数不必太大,有数百微秒即可,因为这时CPU的振荡器已经在工作。 看门狗定时器的预置时间是通过X25045的状态寄存器的相应位来设定的。如表1所示,X25
[单片机]
C51<font color='red'>单片机</font>看门狗电路
一辆汽车居然含有$1500当量的半导体,来看看都是啥
一辆新能源汽车的半导体价值是传统燃油汽车的两倍之多,比如一辆特斯拉Model 3的半导体价值高达1500美元。专家表示,汽车电子化率将会从现在的30%逐步提升到50%以上,汽车电动化、智能化渗透率持续提升,将为汽车半导体行业带来重大市场机遇。 传感器,汽车的眼睛耳朵 汽车智能驾驶系统由感知、决策、执行三个层面组成,其中,感知系统是前提,涉及了大量的传感器应用。汽车传感器作为采集智能驾驶所需数据的眼睛和耳朵,把汽车运行中各种工况信息转化成电讯号输送给决策单元最终下达指令控制车辆运行。 赛迪顾问汽车产业研究中心总经理鹿文亮表示,汽车智能化的终极目标是实现自动驾驶,自动驾驶系统需要稳定性更高、更灵敏、更全面的传感器。
[汽车电子]
一辆汽车居然含有$1500当量的半导体,来看看都是啥
微控制器的抗干扰软件编程方法
    微控制器越来越多地用于各种电子领域,例如自动化、工业控制中。随着金属氧化物半导体的硅晶体管几何尺寸的不断缩小,系统设计中的电磁兼容性(EMC)问题,成为采胳膊小尺寸器件进行设计的必须考虑的主要问题。     在嵌入式微控制器内部,对于内部产生的电磁发射,采用软件措施的效果并不明显。因为发射主要是由CPU中的内部时钟和噪声引起,而且高速开关电流是由微控制器中的多种不同的门所形成。如果芯片版图设计时没有考虑电磁兼容性,那么外部的PCB(印制电路板)将会大大增强那些不必要的噪声信号。所以在很多设计中,采用软件很难消除这种固有的电子发射影响。     但是,在控制器应用中,却可采用软件的方式来
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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