日常踩坑记录

51单片机使用printf为什么编译通过了,但是没有效果 ?

MCU型号:STC12C5A60S2

晶振 :11.0592MHZ

实验内容:利用单片机和PC机串口通信的

(晶振为11.0592MHZ)设置波特率为9600
第一个版本的代码如下**(不能正确输出的代码)**:

#include <REGX51.H>
#include "string.h"
#include "stdio.h"//----------------------------串口变量------------------------------------//
#define  Max_BUFF_Len 50               //数据缓存最大值unsigned char Rec;                     //串口数据接收暂存位
unsigned char Rx_Buff[Max_BUFF_Len];   //缓存数组
unsigned int  Rx_Count;                //数据缓存存放地址
//------------------------------------------------------------------------//void Uart_init()
{ TMOD|=0X21;         TH1=0Xfd;TL1=0Xfd;     //设置波特率9600TR1=1;          // 开中断1 SM0=0;     SM1=1;         REN=1;              ES=1;          TH0=0xcd;    //1ms定时TL0=0xd4;ET0=1;TR0 = 1;    //开定时器0EA=1;          //开总中断
}int main()       //主函数
{Uart_init();   //串口初始化while(1){    printf("Hello Word\r\n");  //输出Hello Word}
}void Timer0() interrupt 1
{TH0=0xcd;    //1ms定时TL0=0xd4;if(Rx_Buff[Rx_Count-1] == 0x0a || Rx_Count == Max_BUFF_Len)    //如果接收到尾标识是换行符(或者等于最大接收数就清空重新接收){  if((strstr((char*)Rx_Buff,"OK"))||(strstr((char *)Rx_Buff,">"))) //检测到关键字符{                                  Rx_Count=0;memset(Rx_Buff, 0, sizeof(Rx_Buff));            //清空数组,为下一次数据做准备printf("Data Get OK\r\n"); P1=~P1;                             //接收成功反转P1端口} else{Rx_Count=0;                   //不是需要的数据或者达到最大接收数则开始重新接收}           }
}void Usart0() interrupt 4   //串口中断
{if(RI){RI=0;                   //接收中断清零Rec=SBUF;               //将接收的数据暂存到RecRx_Buff[Rx_Count]=Rec;  //将接收到的数据存入数组Rx_Count++;             //存放地址+1}
}

经过一番捣鼓,查看51单片机状态控制寄存器SCON寄存器才恍然大悟。
TI 为发送中断标志位,由硬件置位,软件清除。工作方式0中在发送第8位末尾由硬件置位;在其他工作方式时,在发送停止位开始时由硬件置位。TI=1时,申请中断。CPU响应中断后,发送下一帧数据。在任何工作方式中都必须由软件清除TI。:

分析代码后发现,程序运行到while(!TI)停止在该句,因为初始化后TI默认为0,而且还没有发送过数据,TI一直为0,因此程序不会继续向下执行。

解决方法:修改Uart_init()函数,添加TI = 1启动发送

void Uart_init()
{ TMOD|=0X21;         TH1=0Xfd;TL1=0Xfd;     //设置波特率9600TR1=1;          // 开中断1 SM0=0;     SM1=1;         REN=1;              ES=1;          TH0=0xcd;    //1ms定时TL0=0xd4;ET0=1;TR0 = 1;    //开定时器0EA=1;          //开总中断   TI=1;      //使用printf输出必须打开TI
}

再重新下载到开发板进行调试,完美解决。

又是解决小bug的一天。。。

51单片机使用printf函数输出相关推荐

  1. silabs系列51单片机使用printf函数

    找了一些资料,不得要领,后来顿悟,就这么简单,下面是手把手教学 include "stdio.h"文件,然后在c文件中添加如下代码 char putchar(char c) {   ...

  2. C语言printf重入,单片机中printf函数的重映射

    单片机中printf函数的重映射 一.源自于:大侠有话说 1.如果你在学习单片机之前学过C语言,那么一定知道printf这个函数.它最最好用的功能 除了打印你想要的字符到屏幕上外,还能把数字进行格式化 ...

  3. 关于C语言中printf函数“输出歧视”的问题

    目录 关于C语言中printf函数"输出歧视"的问题 问题描述 探索问题原因 另一种研究方法 问题结论 关于C语言中printf函数"输出歧视"的问题 问题描述 ...

  4. c程序设计语言中printf,编程序 用getchar函数读入两个字符c1和c2,然后分别用putchar和printf函数输出这两个字符。请问...

    编程序,用getchar函数读入两个字符给c1和c2,然后分别用putchar和printf函数输出这两个字符.请问: 1. 变量C1,C2应定义为字符型或整型?或二者皆可? 答:在这个题目里,变量C ...

  5. C语言学习之编程序,用getchar函数读入两个字符给cl和c2,然后分别用putchar函数和printf函数输出这两个字符

    编程序,用getchar函数读入两个字符给cl和c2,然后分别用putchar函数和printf函数输出这两个字符.思考以下问题: (1)变量cl和c2应定义为字符型,整型还是二者皆可? (2)要求输 ...

  6. 使用printf函数输出

    多行文本输出 整段输出 多行文本输出 在上节的教程中,我们使用printf()函数输出了Hello, World! 以向这个世界问好.你可能留意到了文中提到的\n,它用于产生一个新行,这样再次输出文本 ...

  7. c语言之printf函数输出字符数据

    //用printf函数输出字符数据 #include <stdio.h> int main() {//定义两个变量char c = 'a';int i = 97;//输出变量%c以字符形式 ...

  8. 51单片机串口打印函数

    51单片机串口通信调试printf函数重定向输出打印 1.首先需要实现串口的发送和接收. 2.输出printf需要哪些步骤: 1)需要引入头文件 <stdio.h> 2)添加如下代码: c ...

  9. 51单片机实现printf

    printf函数在格式化输出时,向下调用了char putchar(char c);这个函数,在"stdio.h"里可以发现有这个函数,所以我们需要自己构造一个这样的函数,即通过串 ...

最新文章

  1. atom和phpcs
  2. JAVA SE学习day_03:包装类、文件操作——file
  3. AndoridSQLite数据库开发基础教程(5)
  4. c语言程序设计小学期论文,c语言程序设计小学期.pdf
  5. WEB HTTP:浏览器HTTP协议漫谈、请求对象Httprequest、响应对象HttpResponse、浏览器内部工作原理(待完善)
  6. python office转pdf_python 如何将office文件转换为PDF
  7. WinForm 生产环境、测试环境 多配置-App.config(分享)
  8. [收集]代码段(Code Snippets)
  9. python视频网站项目_Python项目04 视频网站数据清洗整理和结论研究
  10. JavaScript中的Array.prototype.slice.call()方法学习
  11. 解决Android模拟器不能联网问题
  12. oracle查询同一天生日的,关于date生日判断的问题
  13. EveryDay-Shell之ifconfig输出详解“——netspeed.sh网速监控脚本
  14. 滴滴新算法让你应对女友?道翰天琼认知智能机器人平台API接口大脑为您揭秘
  15. [乡土民间故事_徐苟三传奇]第廿九回_蠢财主落水知上当
  16. gps wifi信号测试软件,搜星+WiFi+EMI 导航平板信号性能横评
  17. 针式个人知识管理系统帮助:实现您的PKM梦想!
  18. 关于R语言多水平线性回归分析
  19. Android Snackbar控件
  20. 阿里云主机安全组端口开放完整教程

热门文章

  1. 只允许匿名用户下载的ftp
  2. 联想服务器cpu虚拟化怎么开启,联想vt虚拟化怎么开启,amdvt虚拟化怎么开启
  3. Excel技巧 - 如何替换换行符
  4. VUE2.0搭建H5项目
  5. 运用“孤独九剑”解决项目实际问题(一)
  6. 3d效果之旋转的球形
  7. 数据的偏度和峰度——df.skew()、df.kurt()
  8. tablayout下划线长度
  9. JavaScript中的 new 操作符到底做了些什么?
  10. Windows VIM java 自动补全