keil中的printf函数显示结果

来源:互联网 发布:mac怎么用u盘重装系统 编辑:程序博客网 时间:2024/05/01 18:07

问题描述:

今天在keil中写c51程序时,遇到一个问题-----按道理在keil中c51程序只要引入头文件<stdio.h>即可使用printf函数,编译、运行即可显示出printf里的内容,但是遇到了下面几个问题:一.c51程序如何在keil里运行(以前只是用keil来写一些小程序,写好了直接烧录到单片机运行的。。。。。。);二.运行了结果显示不出来。若能显示出printf里的内容,程序调试将会方便很多,特做笔记,方便以后查看和初学者学习。


解决办法:

在各种百度,Google,查阅相关资料之后终于解决了。keil虽然不像vc++类似的软件直接拥有运行的快捷方式,因为它是针对嵌入式开发的一款软件,但是他同样提供了debug功能,所以针对第一个问题,只要编译好之后,点击debug,下拉菜单里有Start/Stop Debug Session 选项,点击它,这时你就进入了debug模式,debug下拉菜单里还有run选项,同样点击一下程序就开始运行了,点stop程序就停止运行,这样第一个问题解决好了,但更重要的问题还没解决-----------我们是要看到printf里的内容,方便调试。百度你会发现大量如"在debug下打开view菜单里的Serial Windows的UART #1”之类的内容,他们说的对么,当然是对的,但是我的keil怎么还没有显示出printf里的内容呢,原来里面有一个很重要的机制-------printf函数是调用putchar函数输入的,而putchar应该是先判断ti是否为1,不为1则等待为1。 如果为1则清0,然后送出一个字符。因此 你如果直接使用printf函数,你的程序就会在putchar函数中等待ti为1。这时你的程序就相当于直接死掉了。你可以通过改写putchar函数 实现自己的目的。TI相当于是初始化~不给赋初值就不干活。

无奈,总不能和机器唱反调吧,于是就老老实实地干活,初始化TI,在程序中加入了如下语句:

        SCON = 0x50;       //SCON 串行口控制寄存器方式2工作 多机通信 禁止接收
TMOD = 0x20;   //TMOD 定时器方式寄存器 控制T1 与~INT0无关 定时器模式 工作方式2 
TCON = 0x40;   //TCON 定时器控制寄存器 有T1溢出中断 停T1计数 无T0中断(硬件复位) 停T0复位 
TH1 = 0xE8;   //定时器1高位初始化
TL1 = 0xE8;   //定时器1低位初始化
TI = 1;   //发送中断标志
TR1 = 1;   //启T1计数

再 编译->Debug->Start/Stop Debug Session ->run  终于在UART #1窗口中出现了梦寐以求的printf中的内容。(注:UART #1窗口在debug下的View->Serial Windows->UART #1)


0 0
原创粉丝点击