51单片机使用printf函数出现问题(2)

问题1:不用TI=1,也可以正常进行串口打印。

#include <STC12C5A60S2.H>
#include <math.h>
#include <stdio.h>
#include <intrins.h>
#include <stdlib.h>
#define uchar 		unsigned char
	#define u8 unsigned char 
#define u16 unsigned int
#define uint     	unsigned int
/***********************************************************
端口设置
***********************************************************/ 
sbit CLK 			= P0^0;  	//时钟信号
sbit DIO 			= P0^1;  	//数据/地址数据
sbit k1   		= P3^2;  	//菜单键 
sbit k2   		= P3^3;		//阈值加
sbit k3     	= P3^4;		//阈值减
sbit dht1			=	P2^5;   //定义数据线1
sbit dht2			=	P2^6;   //定义数据线2
sbit dht3			=	P2^7;   //定义数据线3
/***********************************************************
可调参数
***********************************************************/ 
unsigned 	char 	mode	=0				;//菜单模式初始值
	signed 	int 	Tlow1	=-5				;//低温阈值初始值
	signed 	int 	TSS3	=50				;//高温阈值初始值
					int 	RHSS1	=55				;//		
					int 	TIME	=5				;//
					int 	heat1				;
					int 	heat2				;
					int 	heat3				;
					int		temp1;
					int		temp2;
					int 	humidity1;
					int 	humidity2;
					int 	humidity3;
					int 	ms_num= 0;
					int 	s 		= 0;
					int 	min 	= 0;
unsigned  char  key1=0;
unsigned  char  key2=0;
unsigned  char  key3=0;
					
unsigned  char  flag1;
unsigned  char  flag2;
unsigned	char	tempflag=1;
/***********************************************************
4G模块初始化
***********************************************************/ 
unsigned char code at_mode[]			="AT+RESTORE\r\n";															//进入AT指令系统
unsigned char code state_sim[]		="AT+CPIN\r\n";													//测试sim卡是否插入正常
unsigned char code sim_intensity[]="AT+CSQ\r\n";													//测试信号强度
unsigned char code ip_adress[]		="AT+SOCK=TCPC,103.46.128.49,48118\r\n";//设置服务器ip地址,端口号
unsigned char code rst[]					="AT+REBT\r\n";													//发送数据
/***********************************************************
温湿度传感器数值初始化
***********************************************************/ 
unsigned char  SEGData[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,  //0123456789 
0x77,0x7c,0x39,0x5e,0x79,0x71,0x3d,0x76,0x0f,0x0e,	//ABCDEFGHIJ
0x75,0x38,0x37,0x54,0x5c,0x73,0x67,0x31,0x49,0x78,	//KLMNOPQRST
0x3e,0x1c,0x7e,0x64,0x6e,0x59,0x40									//UVWXYZ("-"是36)
};//0-9,a是10,k是20,u是30,‘—’是36

/***********************************************************
定时中断以及延迟相关函数
***********************************************************/ 
void Delayms (unsigned int xms);
void Timer0_Routine(void);
void UART_Routine(void);
/***********************************************************
数据发送服务相关数值初始化
***********************************************************/ 
void sendByte(unsigned char dat);
void SendStr (unsigned char *dat);
/***********************************************************
主函数
***********************************************************/
void main( void )
{	
	UART_Routine();
	Timer0_Routine();
	while(1)
{		
	printf("AT\r\n");
}
}
/********************************************************************
波特率初始化
**************************************************************/
void UART_Routine(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	AUXR &= 0xFB;		//定时器时钟12T模式
	BRT = 0xFD;		//设置定时重载值
	AUXR |= 0x01;		//串口1使用独立波特率发射器为波特率发生器
	AUXR |= 0x10;		//启动独立波特率发射器
//	TI=1;
}
void Timer0_Routine(void)		//50毫秒@11.0592MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式		
	TL0 = 0x00;		//设置定时初始值
	TH0 = 0x4C;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;
	EA  = 1;			//允许全局中断
}
/********************************************************************
* 名称 : Delay_1ms(unsigned int i)
* 功能 : 延时子程序,延时时间为 140us
* 输入 : 
* 输出 : 无
**************************************************************/
void Delayms(unsigned int xms)		//@11.0592MHz,12c5a60
{
	unsigned char i, j;
while(xms--)
{
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
}
}
/***********************************************************
xus软件延迟,延迟时间为:10乘以xus 单位us
***********************************************************/ 
void Delayus(unsigned char xus)			//@11.0592MHz 12c5a60
{
	while(xus--)
{
		
	_nop_();
}
}
/**************************************************************
发送字符串相关函数
**************************************************************/
void SendByte(unsigned char dat)
{
	SBUF = dat;
	while(!TI);
	TI = 0;
}
void SendStr( unsigned char *dat) 
{
	while(*dat != '\0')
	{
	  sendByte(*dat++);
	}
}
/**************************************************************
发送单个数据或者整个数组相关函数
**************************************************************/
char putchar( char c)
{
  sendByte(c);
  return c ;
}
unsigned char putuchar (unsigned char x)
{
	sendByte(x);
  return x ;
}

keil相关优化等级设置
在这里插入图片描述
串口显示结果
在这里插入图片描述
可以看出,即使TI=1被注释掉了,但是依旧可以串口打印!这是为什么呢?
于是我就开始删除一些无关紧要的代码,开始一步一步“试探”。当我将 void SendByte(unsigned char dat) 这个函数删除之后,发现就不能正常串口打印了。
之后,我将最后四个函数全部删除,与此同时,将TI=1,就可以正常串口打印了
在这里插入图片描述
就很奇怪,不知道那里的问题?如果有大佬1知道的话,指导一下我吧!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值