51单片机使用printf函数输出
日常踩坑记录
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函数输出相关推荐
- silabs系列51单片机使用printf函数
找了一些资料,不得要领,后来顿悟,就这么简单,下面是手把手教学 include "stdio.h"文件,然后在c文件中添加如下代码 char putchar(char c) { ...
- C语言printf重入,单片机中printf函数的重映射
单片机中printf函数的重映射 一.源自于:大侠有话说 1.如果你在学习单片机之前学过C语言,那么一定知道printf这个函数.它最最好用的功能 除了打印你想要的字符到屏幕上外,还能把数字进行格式化 ...
- 关于C语言中printf函数“输出歧视”的问题
目录 关于C语言中printf函数"输出歧视"的问题 问题描述 探索问题原因 另一种研究方法 问题结论 关于C语言中printf函数"输出歧视"的问题 问题描述 ...
- c程序设计语言中printf,编程序 用getchar函数读入两个字符c1和c2,然后分别用putchar和printf函数输出这两个字符。请问...
编程序,用getchar函数读入两个字符给c1和c2,然后分别用putchar和printf函数输出这两个字符.请问: 1. 变量C1,C2应定义为字符型或整型?或二者皆可? 答:在这个题目里,变量C ...
- C语言学习之编程序,用getchar函数读入两个字符给cl和c2,然后分别用putchar函数和printf函数输出这两个字符
编程序,用getchar函数读入两个字符给cl和c2,然后分别用putchar函数和printf函数输出这两个字符.思考以下问题: (1)变量cl和c2应定义为字符型,整型还是二者皆可? (2)要求输 ...
- 使用printf函数输出
多行文本输出 整段输出 多行文本输出 在上节的教程中,我们使用printf()函数输出了Hello, World! 以向这个世界问好.你可能留意到了文中提到的\n,它用于产生一个新行,这样再次输出文本 ...
- c语言之printf函数输出字符数据
//用printf函数输出字符数据 #include <stdio.h> int main() {//定义两个变量char c = 'a';int i = 97;//输出变量%c以字符形式 ...
- 51单片机串口打印函数
51单片机串口通信调试printf函数重定向输出打印 1.首先需要实现串口的发送和接收. 2.输出printf需要哪些步骤: 1)需要引入头文件 <stdio.h> 2)添加如下代码: c ...
- 51单片机实现printf
printf函数在格式化输出时,向下调用了char putchar(char c);这个函数,在"stdio.h"里可以发现有这个函数,所以我们需要自己构造一个这样的函数,即通过串 ...
最新文章
- atom和phpcs
- JAVA SE学习day_03:包装类、文件操作——file
- AndoridSQLite数据库开发基础教程(5)
- c语言程序设计小学期论文,c语言程序设计小学期.pdf
- WEB HTTP:浏览器HTTP协议漫谈、请求对象Httprequest、响应对象HttpResponse、浏览器内部工作原理(待完善)
- python office转pdf_python 如何将office文件转换为PDF
- WinForm 生产环境、测试环境 多配置-App.config(分享)
- [收集]代码段(Code Snippets)
- python视频网站项目_Python项目04 视频网站数据清洗整理和结论研究
- JavaScript中的Array.prototype.slice.call()方法学习
- 解决Android模拟器不能联网问题
- oracle查询同一天生日的,关于date生日判断的问题
- EveryDay-Shell之ifconfig输出详解“——netspeed.sh网速监控脚本
- 滴滴新算法让你应对女友?道翰天琼认知智能机器人平台API接口大脑为您揭秘
- [乡土民间故事_徐苟三传奇]第廿九回_蠢财主落水知上当
- gps wifi信号测试软件,搜星+WiFi+EMI 导航平板信号性能横评
- 针式个人知识管理系统帮助:实现您的PKM梦想!
- 关于R语言多水平线性回归分析
- Android Snackbar控件
- 阿里云主机安全组端口开放完整教程