enjoy21cn的笔记 https://bbs.21ic.com/?490770 [收藏] [复制] [RSS]

日志

串口数据输出的方法-------探讨

已有 1280 次阅读2009-6-4 11:49 |系统分类:单片机| 串口, 数据输出

在实际的编程过程中我们要输出几个字符或字符串,方法是多中多样的,当然总有适合自己的方法。

在用keil仿真查看串口输出时,遇到了一个问题,代码如下:


#include<reg52.h>


#include <stdio.h>/* 为使用printf函数而加入*/


main()


{


     SCON= 0x50;/*SCON:工作模式1,8-bit UART,允许接收*/


     TMOD |= 0x20;/*TMOD:定时器T1,工作模式2, 8位自动重载方式*/


     TH1= 0xf3;/*当波特率为2400时,定时器初值*/


     TR1= 1;/*定时器T1开始运行*/


     TI= 1;/*允许发送数据*/


     printf("hello world");


}


上面代码调试运行后,串口不断输出"hello world",程序陷入死循环。


问题的解决:在程序末尾应加上while(1);这一点很重要。




原因:如果不加while(1); 单片机将执行一条RET指令,这条指令会让程序复位(软件复位,从堆栈弹出0000H到PC寄存器),复位后程序重新开始执行。



思考:习惯了window下编程,主程序执行完了就退出到操作系统,单片机就不一样了,退到哪里呢?

以下是单片机和编译器的对话:




单片机:我没事做了,死了算了~~~
    编译器:想死?你还是复位吧~~~RET
    单片机:o,shit~~~


 


单片机串口相关问题:标准51只有一个串口,但是现在很多基于51内核的单


片机都会有两个串口或是更多,那么printf函数针对哪个串口呢?


回答:Keil\C51\LIB目录下有个putchar.c文件,printf函数会调用该文件中的


putchar函数,putchar里面的使用的寄存器都是标准51的sfr(如TI,SBUF),它


们的地址是固定的,由此可知printf函数只针对串口0。如果想让printf函数支


持串口1或串口2。那么修改putchar函数的寄存器即可,比如SBUF改为



SBUF1。但是能不能用printf函数对串口0,串口1。。。都适用呢,自己想办法吧:)




另外:如果只是用printf输出字符串的话还是自己编个函数吧,因为printf要处理各类数据的输出,占用代码空间很大,我试了一下,程序里就一条printf语句,code就1K了,而且printf执行起来也慢。

在实际的应用中要考虑的问题很多。


路过

鸡蛋

鲜花

握手

雷人

全部作者的其他最新日志

发表评论 评论 (2 个评论)

ydz0515 2009-6-5 02:52
用PUTS()。
回复 鲁西老汉 2009-6-9 13:42
不错,学习了