历史上的今天
返回首页

历史上的今天

今天是:2025年05月13日(星期二)

正在发生

2020年05月13日 | 51单片机 printf函数 调试程序

2020-05-13 来源:eefocus

主要分三个部分(1)51单片机程序部分;(2)keil工具部分;(3)为何printf输出为串口。


(1)51单片机程序部分


#include

#include

 

void InitUART(void)//使用定时器1作为串口波特率发生器

{

    TH1 = 0xF3; //晶振12mhz 波特率串口上设为2400才不显示乱码代码是4800

    TL1 = TH1;

    TMOD |= 0x20; //定时器1方式2

    SCON = 0x50; //串口接收使能

    ES = 1; //串口中断使能

    TR1 = 1; //定时器1使能

    TI = 1; //发送中断标记位,必须设置

}

//毫秒延时函数

void delay_ms(unsigned int t)

{

    unsigned char a,b;

    while(t--)

    {

      for(b=102;b>0;b--)

      for(a=3;a>0;a--);

    }

}

 

void main()

{

    InitUART(); //初始化串口

    EA = 1;   //开总中断

    while(1)

    {

        delay_ms(500);

        printf("hellon");//串口打印结果

    }

 }


代码部分注意事项:


代码中包含 头文件#include,其中包含printf函数;

串口初始化时,TI = 1;


(2)keil设置显示串口输出结果


在C51中、printf和scanf函数主要用于串行数据的收发


有时在进行软件调试的时候,需要使用printf函数输出一些结果


要在Keil中看到这些结果,只需要两步:(当然首先要进入调试界面再做以下两步)


1  设置

打开Peripherals-->Serial窗口,选择IRQ中的TI、RI两个选项


2  打开输出窗口

打开View-->Serial Window #1窗口


在程序中的printf语句的输出就显示在这个窗口中


现在就到程序窗口运行程序、运行结束后打开Serial窗口就可以看到printf的输出了。


(3)为何printf从串口输出


查看了keil的帮助文件里面的printf函数说明,原来printf函数最终是调用putchar函数来实现打印输出字符的。


KeilC51LIB文件夹里面找到了putchar.c文件,putchar函数使用TI和SBUF,确定为串口终端输出。


注意:printf重定向功能,即用户自己定义putchar函数,例如


//UART1 发送串口数据

void UART1_SendData(char dat)

{

    ES=0;           //关串口中断

    SBUF=dat;           

    while(TI!=1);   //等待发送成功

    TI=0;           //清除发送中断标志

    ES=1;           //开串口中断

}

 

//UART1 发送字符串

void UART1_SendString(char *s)

{

    while(*s)//检测字符串结束符

    {

        UART1_SendData(*s++);//发送当前字符

    }

}

 

//重写putchar函数

char putchar(char c)

{

    UART1_SendData(c);

    return c;

}

推荐阅读

史海拾趣

Don Connex Electronics Co Ltd公司的发展小趣事

随着国内市场的逐渐饱和,Don Connex Electronics开始寻求海外市场的拓展。公司组建了一支专业的国际市场团队,积极参加国际电子展会,与国际客户建立联系。通过不断努力,公司成功打入欧洲和北美市场,并与多家国际知名企业建立了长期合作关系。这一举措不仅提升了公司的品牌影响力,也极大地促进了公司的销售业绩。

Defense Supply Center Columbus公司的发展小趣事

Defense Supply Center Columbus公司自成立之初,就深知技术创新对于电子行业的重要性。公司投入大量资源,建立起一支专业的研发团队,专注于研发先进的军事电子设备和系统。通过不断的技术创新,公司成功开发出了一系列高性能、高可靠性的军事电子产品,为国防事业做出了重要贡献。这些产品的成功推出,不仅提升了公司的市场地位,也为公司赢得了众多客户的信赖和好评。

ALCOA公司的发展小趣事

ALCOA,全称美国铝业公司,其发展历程可追溯至19世纪末。当时,铝在地球上蕴藏丰富,但提炼单质的铝却十分困难。年轻的查尔斯·霍尔(Charles Hall)发明了用电解方式生产单质铝的方法,并于1889年获得专利。随后,他与艾尔弗雷德·亨特(Alfred E. Hunt)船长合作,投资建厂,开始批量生产铝。这一技术创新不仅推动了铝产量的快速上升,还使得铝这种曾经比金子还贵的金属逐渐走进了人们的日常生活。

Armel Electronics Inc公司的发展小趣事

随着公司产品的不断升级和市场的逐步扩大,Armel Electronics Inc公司开始寻求更广阔的市场空间。公司积极与国内外知名企业展开合作,共同开发新产品,开拓新市场。通过国际合作,Armel不仅提升了自身的技术水平,还进一步扩大了市场份额,实现了公司的快速发展。

ELNA(依娜)公司的发展小趣事

随着全球对环保和可持续发展的重视,ELNA也开始关注绿色制造和环保产品。公司积极采用环保材料和清洁能源,减少生产过程中的污染和排放。同时,ELNA还加强了对废旧产品的回收和再利用,推动循环经济的发展。

台湾凯励(Carli)公司的发展小趣事

在电子行业中,品质控制和质量管理是企业生存和发展的关键。凯励公司深知这一点,建立了严格的质量管理体系和检测机制。公司从原材料采购到生产制造、产品检测等各个环节都严格把控品质,确保产品的稳定性和可靠性。此外,凯励公司还引进了先进的生产设备和检测仪器,提高了生产效率和产品质量。

问答坊 | AI 解惑

英语版本资料专区!

做ti的东西,以后一些技术手册,设计方案的少不了和英语的东西打交道,所以开个话题,也方便大家查找!!!…

查看全部问答>

无线传输设备

大家好好看看 …

查看全部问答>

做技术是不太容易,难道做销售就容易吗

今天运气很好,刚一上车就有座位,于是我就从容地从包里拿出临走前从办公室里顺的两瓣柚子,旁若无人地吃了起来,想着SOSO同志今天买的比上次好。 吃着柚子,思考这几天论坛里的一个也算是大热的帖子。我关注他,是EEWORLD论坛里几乎没有如此针锋 ...…

查看全部问答>

LPCXpresso1343-VB-USB

之前见到有人发帖“lpc1343之三:通过USB接口控制开发板LED闪烁速度并读取AD转换结果”,详见https://bbs.eeworld.com.cn/thread-106706-1-2.html,作者很牛很有实力,1343的C源码至今我还没有完全看懂,但鄙人用VB做软件,最近挤出点时间解决了VB ...…

查看全部问答>

请问:在嵌入式(wince)下如何通过GPRS模块利用手机卡提供的GPRS上网

各位前辈大家好。 请问:在嵌入式(wince)下如何通过GPRS模块利用手机卡提供的GPRS上网,我买了个嵌入式开发板utu-s3c2440-s和GSM/GPRS/CDMA-MODEM模块,现在连接上之后,可以实现给其他手机发送信息和拨打电话,但不知怎么实现通过它实现无线上 ...…

查看全部问答>

【付费】在WinCe5.0下控制USB摄像头拍照的程序,联系QQ:1015689153

【付费】在WinCe5.0下控制USB摄像头拍照的程序,联系QQ:1015689153…

查看全部问答>

DOS下如何驱动鼠标

最近要做一个跟鼠标驱动有关的项目,找了好多鼠标驱动的资料,没发现自己想要的,哪位有鼠标驱动的源代码,请给我发一份:cier18@126.com.…

查看全部问答>

为什么程序加while(1),运行起来程序还是会跳出while执行上面的初始化呢?

为什么程序加while(1),运行起来程序还是会跳出while执行它上面的初始化呢? 我是触摸屏加ADC采样,触摸屏是GPIO低电平产生中断,ADC是定时器触发中断。两个一起用,触摸液晶屏总是会死掉,没一点反应,还有就是会跳出while(1),执行上面的ADC初 ...…

查看全部问答>

EZ430-RF2500 CC2500无线开发套件,EZ430-TMS37157 PaLFI 无源低频评估套件,展示

拿到两套开发套件,开包展示ing。EZ430-RF2500 CC2500无线开发套件EZ430-TMS37157 PaLFI 无源低频评估套件…

查看全部问答>

更新IAR5.4后 为什么CCS4.2连接launchpad 调试出现错误啊

如题 更新IAR5.4后  为什么CCS4.2连接launchpad 调试出现错误啊…

查看全部问答>