keil c51 printf 问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了keil c51 printf 问题相关的知识,希望对你有一定的参考价值。

#include<reg51.h>
#include<stdio.h>
void main()

char grade;
grade='B';
switch(grade)

case'A':
printf("Very good!");
break;
case'B':
printf("Good!");
break;
case'C':printf("Fine!");
break;
case'D':
printf("Pass!");
break;
default:
printf("Lost!");


要求是输出GOOD。

参考技术A 在程序中,你需要配置串口的,虽然是仿真,也要初始化串口,keil仿真只不过相当于给了你硬件而已。在keil中printf 默认是向串口中发送数据的,所以,如果应用该函数,必须先初始化串口,否则可能引起死机的情况,并且在printf之前应该先将TI置位,参考资料:
http://blog.csdn.net/lizhoubob/archive/2010/07/20/5749737.aspx追问

这个博客里的资料我之前看过啦,不能不能就这个题目说下怎么改,哪里需要改,具体一些

追答

#include
#include
void main(void)

SCON = 0x50;
TMOD = 0x20;
TCON = 0x40;
TH1 = 0xE8;
TL1 = 0xE8;
TI = 1;
TR1 = 1;
while(1)

printf("This is an example!\n");


用这个程序,我试过了,可以。

追问

这个跟我的程序有什么关系呢,你把我这个程序改好后粘过来吧,谢谢

参考技术B 可以下载一个“串口调试”和一个串口调试助手。可以在串口调剂窗口里看到输出的结果本回答被提问者采纳 参考技术C 你既然是在51单片机上做这个程序,那你就必须先把单片机的串口初始化一下啊,不然你怎么知道是哪个波特率啊,另外,你还要把编译好的HEX文件烧到单片机里,才能看效果啊追问

初始化串口我试过啦,TI=1后输出的是无穷的Good!而且这个是不需要连单片机的,仿真就可以啦,我的意思是怎么实现仿真条件下输出Good!

追答

输出无穷的GOOD是因为你的程序运行完了以后又重新启动了,相当于反复运行。如果只是仿真,你的程序是正确的。你可以直接用KEIL的仿真功能,将程序的输出定义到你的物理串口上去,这样你的物理串口就代替了单片机的串口。
记得仿真的时候,先MODE ,看提示配置串口,在ASSIGN,看提示把仿真的输出连接上去

追问

你能说下这个具体怎么改吗?

追答

MODE COM1 9600,0,8,1 //串口1,波特率9600,无校验位,数据位8位,停止位1位
ASSIGN COM1 SOUT //将输入输出分配到COM1上

追问

这个跟我的程序有什么关系呢,你把我这个程序改好后粘过来吧,谢谢

参考技术D #include<reg51.h>
#include<stdio.h>
void main(void)

char grade;
grade='B';
SCON = 0x50;
TMOD = 0x20;
TCON = 0x40;
TH1 = 0xE8;
TL1 = 0xE8;
TI = 1;
TR1 = 1;
// printf("This is an example!\n");
switch(grade)
case'A':
printf("Very good!");
break;
case'B':
printf("Good!");
break;
case'C':
printf("Fine!");
break;
case'D':
printf("Pass!");
break;
default:
printf("Lost!");

while(1);
第5个回答  2011-07-16 reg51.h 这个我不知道 是什么东西,但是这个程序需要这个吧,我去掉后试下,输出就是GOOD啊追问

你是在keil里运行的吗?我说的是可是在keil环境下,不是在VC里

追答

哦,,那是我不懂了

STM32 KEIL 下的 printf 函数

 1 //加入以下代码,支持printf函数,而不需要选择use MicroLIB
 2 #if 1
 3 #pragma import(__use_no_semihosting)             
 4 //标准库需要的支持函数                 
 5 struct __FILE 
 6 { 
 7     int handle; 
 8 
 9 }; 
10 
11 FILE __stdout;       
12 //定义_sys_exit()以避免使用半主机模式    
13 _sys_exit(int x) 
14 { 
15     x = x; 
16 } 
17 //重定义fputc函数 
18 int fputc(int ch, FILE *f)
19 {      
20 //return ITM_SendChar(ch);
21 
22      while((USART2->SR&0X40)==0);//循环发送,直到发送完毕   
23     USART2->DR = (u8) ch;      
24     return ch;
25 }
26 #endif 

 

如上图:

保留这一部分时:

 其中    可以更换任意的串口

printf输出用串口发送出去

当 下图圈圈中的部分编译

则  通过JTAG (6线)  打印到SEGGER软件上

 

但是当串口初始化函数运行了的时候     上面就失效了

原因是?

 

以上是关于keil c51 printf 问题的主要内容,如果未能解决你的问题,请参考以下文章

printf函数在Keil 开发C51单片机当中的使用细节

单片机C8051在Keil C51环境下使用printf函数打印,发现打印值和实际不对应

51单片机Keil C51下使用printf输出到串口,为何初始化了串口之后就可以使用了?

c51中 printf怎用

在keil里printf

调试笔记--keil printf小技巧