#include "STC8Axx.h"
#include "Uart1.h"
#include "Sys.h"#include <intrins.h>
#include <stdio.h>   //用于printf
#include <stdarg.h>  //用于vsprintf函数原型 bit bUart1Busy;bit            bUart1ReceiveFinish                   = 0;                       //串口1接收完成标志     (1: 表示是   0: 表示否)
bit           bIsUart1ReceiveCommandHead            = 0;                       //是否接收到命令头      (1: 表示是   0: 表示否)
unsigned char Uart1CurrentReceiveLength             = 0;                       //串口1当前接收数据的长度
unsigned char Uart1ReceiveDataBuf[kUart1ReceiveMaxLength];                      //串口1接收到的数据[串口1接收数据最大长度]
unsigned char Uart1SendDataBuf[kUart1SendMaxLength]={0xAA,0x00,0x00,0xBB};     //串口1发送数据[串口1接收数据最大长度]//------------------------------------------------------------------------------
//读取串口1中断处理数据(字符串)(判断命令头,命令尾)
//------------------------------------------------------------------------------
void Uart1_ReadInterruptDataManage()
{Sys_CheckIAP(SBUF);                                                        //系统_检测是否需要进入下载模式if(bIsUart1ReceiveCommandHead == 0)                                          //是否接收到命令头      (1: 表示是   0: 表示否){if(SBUF == 0xCC){bIsUart1ReceiveCommandHead = 1;                                       //是否接收到命令头      (1: 表示是   0: 表示否)Uart1CurrentReceiveLength = 0;                                        ///串口1当前接收数据的长度Uart1ReceiveDataBuf[Uart1CurrentReceiveLength] = SBUF;              //串口1接收到的数据[串口1当前接收数据的长度]Uart1CurrentReceiveLength ++;                                        //串口1当前接收数据的长度}                                                         }else{Uart1ReceiveDataBuf[Uart1CurrentReceiveLength] = SBUF;                   //串口1接收到的数据[串口1当前接收数据的长度]Uart1CurrentReceiveLength ++;                                            //串口1当前接收数据的长度if(SBUF == 0xDD)                                                    {                                                                   bIsUart1ReceiveCommandHead = 0;                                    //是否接收到命令头      (1: 表示是   0: 表示否)bUart1ReceiveFinish = 1;                                          //串口1接收完成标志     (1: 表示是   0: 表示否)}                                                          if(Uart1CurrentReceiveLength >= kUart1ReceiveMaxLength)                 //串口1当前接收数据的长度 >= {bIsUart1ReceiveCommandHead = 0;                                     //是否接收到命令头      (1: 表示是   0: 表示否)bUart1ReceiveFinish = 0;                                          //串口1接收完成标志     (1: 表示是   0: 表示否)}}
}                                                                       ------------------------------------------------------------------------------
读取串口1中断处理数据(字符串)(判断命令头,命令尾,长度,有校验)
------------------------------------------------------------------------------
//void Uart1_ReadInterruptDataManage2()
//{
//  if(bIsUart1ReceiveCommandHead == 0)                                           //是否接收到命令头      (1: 表示是   0: 表示否)
//  {
//      if(SBUF == kUart1CommandStart)
//      {
//          bIsUart1ReceiveCommandHead = 1;                                    //是否接收到命令头      (1: 表示是   0: 表示否)
//          Uart1CurrentReceiveLength = 0;                                     ///串口1当前接收数据的长度
//          Uart1ReceiveDataBuf[Uart1CurrentReceiveLength] = SBUF;     //串口1接收到的数据[串口1当前接收数据的长度]
//          Uart1CurrentReceiveLength ++;                                     //串口1当前接收数据的长度
//      }
//  }
//  else
//  {
//      Uart1ReceiveDataBuf[Uart1CurrentReceiveLength] = SBUF;         //串口1接收到的数据[串口1当前接收数据的长度]
//      Uart1CurrentReceiveLength ++;                                         //串口1当前接收数据的长度
//      if((Uart1CurrentReceiveLength > 2) && (Uart1CurrentReceiveLength >= Uart1ReceiveDataBuf[1]))
//      {
//          if(Uart1ReceiveDataBuf[Uart1CurrentReceiveLength-1] == kUart1CommandEnd)
//          {
//              bIsUart1ReceiveCommandHead = 0;                                    //是否接收到命令头      (1: 表示是   0: 表示否)
//              bUart1ReceiveFinish = 1;                                           //串口1接收完成标志     (1: 表示是   0: 表示否)
//          }
//          else
//          {
//              bIsUart1ReceiveCommandHead = 0;                                    //是否接收到命令头      (1: 表示是   0: 表示否)
//              bUart1ReceiveFinish = 0;                                           //串口1接收完成标志     (1: 表示是   0: 表示否)
//          }
//      }
//      if(Uart1CurrentReceiveLength >= kUart1ReceiveMaxLength)                 //串口1当前接收数据的长度 >=
//      {
//          bIsUart1ReceiveCommandHead = 0;                                    //是否接收到命令头      (1: 表示是   0: 表示否)
//          bUart1ReceiveFinish = 0;                                           //串口1接收完成标志     (1: 表示是   0: 表示否)
//      }
//  }
//}
//
------------------------------------------------------------------------------
读取串口1中断处理数据(字符串)
------------------------------------------------------------------------------
//void Uart1_ReadInterruptDataManage()
//{
//  if(bIsUart1ReceiveCommandHead == 0)                                               //是否接收到命令头      (1: 表示是   0: 表示否)
//  {
//      if(SBUF == '[')
//      {
//          bIsUart1ReceiveCommandHead = 1;                                        //是否接收到命令头      (1: 表示是   0: 表示否)
//          Uart1CurrentReceiveLength = 0;                                     ///串口1当前接收数据的长度
//          Uart1ReceiveDataBuf[Uart1CurrentReceiveLength] = SBUF;             //串口1接收到的数据[串口1当前接收数据的长度]
//          Uart1CurrentReceiveLength ++;                                     //串口1当前接收数据的长度
//      }
//  }
//  else
//  {
//      Uart1ReceiveDataBuf[Uart1CurrentReceiveLength] = SBUF;                 //串口1接收到的数据[串口1当前接收数据的长度]
//      Uart1CurrentReceiveLength ++;                                         //串口1当前接收数据的长度
//      if(SBUF == ']')
//      {
//          bIsUart1ReceiveCommandHead = 0;                                        //是否接收到命令头      (1: 表示是   0: 表示否)
//          bUart1ReceiveFinish = 1;                                           //串口1接收完成标志     (1: 表示是   0: 表示否)
//      }
//      if(Uart1CurrentReceiveLength >= kUart1ReceiveMaxLength)                 //串口1当前接收数据的长度 >=
//      {
//          bIsUart1ReceiveCommandHead = 0;                                        //是否接收到命令头      (1: 表示是   0: 表示否)
//          bUart1ReceiveFinish = 0;                                           //串口1接收完成标志     (1: 表示是   0: 表示否)
//      }
//  }
//}                                                                     //------------------------------------------------------------------------------
//串口1中断函数
//------------------------------------------------------------------------------
void Uart1_Isr() interrupt 4 using 1
{if (TI){TI = 0;bUart1Busy = 0;}if (RI){RI = 0;Uart1_ReadInterruptDataManage();                                        //读取串口1中断处理数据}
}//------------------------------------------------------------------------------
//串口1_切换
//------------------------------------------------------------------------------
void Uart1_Swap()
{P_SW1 = 0x00;                                                             //RXD/P3.0, TXD/P3.1
//  P_SW1 = 0x40;                                                              //RXD_2/P3.6, TXD_2/P3.7
//  P_SW1 = 0x80;                                                              //RXD_3/P1.6, TXD_3/P1.7
//  P_SW1 = 0xc0;                                                              //RXD_4/P4.3, TXD_4/P4.4
}//------------------------------------------------------------------------------
//串口1_初始化
//------------------------------------------------------------------------------
void Uart1_Init()
{SCON = 0x50;                                                              //8位数据,可变波特率AUXR |= 0x40;                                                              //定时器1时钟为Fosc,即1TAUXR &= 0xFE;                                                             //串口1选择定时器1为波特率发生器TMOD &= 0x0F;                                                                //设定定时器1为16位自动重装方式TL1 = kUart1_BRT;TH1 = kUart1_BRT >> 8;ET1 = 0;                                                                  //禁止定时器1中断TR1 = 1;                                                                 //启动定时器1Uart1_Swap();                                                               //串口1_切换ES = 1;                                                                        //打开串口1中断bUart1Busy = 0;
}------------------------------------------------------------------------------
串口1_发送一个字符
------------------------------------------------------------------------------
//void Uart1_SendChar(unsigned char dat)
//{
//    while (bUart1Busy);
//    bUart1Busy = 1;
//    SBUF = dat;
//}------------------------------------------------------------------------------
串口1_发送字符串
------------------------------------------------------------------------------
//void Uart1_SendString(unsigned char *p)
//{
//    while (*p)
//    {
//        Uart1_SendChar(*p++);
//    }
//}///**********************************************************************************//  * @brief  串口1发送函数
//  * @param  arr:被发送数据的地址
//  * @param  len:被发送数据的长度
//  * @retval 发送结果// **********************************************************************************/
//void Uart1_Sendarray(u8* arr,u8 len)//串口1发送数组
//{
//    u8 i=0;
//    for(i=0;i<len;i++)
//    {
//      Uart1_SendChar(arr[i]);
//    }
//}/*------------------------------------------------发送一个字节
------------------------------------------------*/
void SendByte(unsigned char c)
{ if(c=='\n')//如果遇到\n就换行 { //发送CR(carriage return) SBUF=0x0D;  while(!TI);//等待发送完成 TI=0; //发送 LF(NL line feed,new line) SBUF=0x0A;  while(!TI);//等待发送完成 TI=0;        } else { SBUF=c; while(!TI);//等待发送完成 TI=0; }
}
/*------------------------------------------------发送一个字符串
------------------------------------------------*/
void SendStr(unsigned char *s)
{while(*s!='\0')// \0 表示字符串结束标志,通过检测是否字符串末尾{SendByte(*s);s++;}
}
/*------------------------------------------------发送一个指定类型数据
------------------------------------------------*/
void Uart1_printf(const char *fmt,...)
{va_list ap;char xdata string[50];//访问内部拓展RAM,非访问外部RAM,不能超过内部拓展RAM大小(此处为1024) va_start(ap,fmt);vsprintf(string,fmt,ap);//此处也可以使用sprintf函数,用法差不多,稍加修改即可,此处略去 SendStr(string);va_end(ap);
}

使用方法:

Uart1_printf("OK!\r\n");
    Uart1_printf("开始命令%bd\r\n",char); //调试输出
    Uart1_printf("开始命令%d\r\n",int); //调试输出
    Uart1_printf("开始命令%ld\r\n",long); //调试输出

STC单片机使用Printf相关推荐

  1. stc单片机使用printf()函数打印

    串口波特率初始化: 利用stc-isp工具生成初始化代码, 在串口初始化函数中添加 **TI=1;**如下图,否则printf()无法输出. void UartInit(void) //9600bps ...

  2. STC单片机不同数据类型串口打印输出示例程序

    STC单片机不同数据类型串口打印输出示例程序 串口监视器打印 程序代码 #include "STC15W4K.H" #include <stdio.h> // 为使用K ...

  3. STC单片机波特率计算

    正在做STC系列单片机的串口实验, 可是上网没找到适合的波特率计算软件,总不能每次都用脑袋算吧, 干脆花了点时间写了个小程序,粗糙了些,但将就着用呗,呵呵 程序: #include <stdio ...

  4. STC单片机获取红外解码从串口输出

    STC单片机获取红外解码从串口输出 串口数据演示 所使用的红外接收头VS1838 VS1838引脚定义 电气特性 所使用的红外按键板 红外遥控接收模块 VS/HX1838 相关的资料: https:/ ...

  5. stc51单片机怎么学, 先掌握STC单片机程序烧录方法

    大家好,我是无际的搭档徐明. 今天我在这里和大家探讨一下关于51单片机怎么学这个话题. 08年我在大学里学习单片机课程的时候,学习内容主要包括单片机的发展历史,单片机的框架,单片机的寄存器,以及单片机 ...

  6. STC单片机功率控制下载板

    作者:卓晴博士,清华大学自动化系 更新时间:2020-09-06 Sunday 01为什么制作下载功率板? 在调试中,使用 STC8单片机下载电路 调试电路开发板的时候,如果电路板的功率比较大,直接使 ...

  7. STC单片机高速下载电路改进

    01改进的思路 在2020年5月20日,收到了来自STC公司发送过来更新后的STC8H技术手册,其中对于原来连接在UART-TTL转换RS232芯片与STC8H下载端口的二极管和电阻可以去掉了. 这两 ...

  8. 制作新版STC单片机WiFi下载器

    简 介: 基于WiFi的STC单片机下载器可以方便对STC的8A,8G,8H,15系列的单片机完成程序下载,方便了程序的开发与调试.特别适应于需要强磁隔离.运动平台的单片机开发,做到程序的快速更新与测 ...

  9. 通过WiFi对STC单片机程序下载和调试

    简 介: 设计了基于WiFi-UART的STC单片机下载调试模块,这样便于对嵌入式系统进行远程调试开发,特别是在一些具有移动功能的平台,强电平台以及需要实时监视和修改程序的应用场合. 关键词: STC ...

最新文章

  1. Java核心技术卷1——笔记(1)
  2. CentOS-文件操作
  3. hibernate中@Entity和@Table的区别
  4. android listview下拉刷新动画,ListView下拉刷新实现方式详解和改造(上)
  5. 基于sqlite数据库的C语言编程
  6. JavaMail 发送邮件的实例
  7. Android Studio 字体大小设置
  8. 轻量通用型互联网应用架构
  9. rocketmq 双主双从同步写安装部署
  10. 微信小程序云开发教程-微信小程序的API入门-API的类型和语法结构
  11. 详细介绍各种常见的分布
  12. 01-SQL基本语句
  13. Nexus下载构件失败
  14. 三星530换固态硬盘_韩国三星网红固态硬盘PM981系列惨遭黑苹果和INTEL10代主板嫌弃...
  15. 新颖的自我介绍_三句有创意的自我介绍
  16. 【示波器专题】示波器探头的原理深入——有源探头之电流探头
  17. wav音乐里面竟然有病毒?
  18. ARP协议格式和实例分析
  19. Linux操作系统基础知识命令参数详解
  20. Roman to Integer/Integer to Roman

热门文章

  1. 获取当天早上8点 - 明天早上8点时间
  2. sheng的学习笔记-ConcurrentHashMap(JDK1.7和16)源码分析
  3. jsp页面链接下载文件
  4. vue mysql 电商_mei-shopone: nuxt(vue)+node(egg.js)+mysql晒点风格极简商城,电商系统。适合入门全栈开发,槑先森工作室。...
  5. 用小米平板,如何看小度路由器所连接的移动硬盘上的视频
  6. TensorFlow之设备(device)详解
  7. 在windows系统上安装双系统
  8. Restful 是什么? 怎么使用Restful
  9. 河北省2018计算机一级考试试题,2018年3月计算机一级考试MSOffice模拟试题1
  10. PHP应用-一揽子解决方案