您的位置 首页 电源

单片机运用printf函数的两种方法

今天就简单来说说怎么在51单片机中使用printf函数:包括使用自带的printf函数和自己动手写一个printf函数,再贴代码之前先介绍几个相关的

今日就简略来说说怎样在51单片机中运用”printf”函数:包含运用自带的printf函数和自己动手写一个printf函数,再贴代码之前先介绍几个相关的常识,首要用于自己写printf函数。

①C言语函数:vsprintf,

其原型为int vsprintf(char *string, char *format, va_list param);,效果为将param按格局format写入字符串string中,因而他能够用于将任何格局数据转化为字符串数据,比方把整数97转化为ASCII码的97的程序就像下面这样vsprintf(string,”%d”,97),当然还有一点需求留意:在keil里边运用sprintf需求包含stdio.h这个头文件(当然这儿也能够运用sprintf,效果彻底差不多,只需求稍加修正即可,不多介绍)。提到这儿,再来说说另一个函数itoa吧,其实他比vsprintf更简略,其原型为char *itoa(int value, char *string, int radix),效果为将value按radix进制写入到string字符串中,运用时需求包含头文件stdlib.h,可是在keil里边却无法运用,头文件里边不包含itoa,即便把VC里边的仿制进来形似仍是不可,呵呵,现在不知道原因。

②可变参数函数

详细来说便是stdarg.h里边的这几个函数va_start,va_arg,va_list,va_end,这几个参数用于拓荒一段内存区域,能够合作vsprintf运用,可是对内存运用较大,需求单片机具有必定的RAM,不然程序就算能编译经过也是无法运转的,用法见这儿http://blog.csdn.net/googlemi/article/details/8988567

③内部拓宽RAM

界说:集成在单片机内部的数据存储器,在物理上是内部,但逻辑上是外部,拜访时需求运用MOVX或许xdata拜访,详细能够看STC8051手册,如下所示

从这儿能够看出,STC12C5A60S2单片机内部含有1024byte=1Kbyte的内部拓宽RAM,在拜访的时分,运用C言语的时分,需求加上xdata才干够拜访,运用汇编的时分需求用MOVX指令拜访。

到这儿咱们先来算一算STC12C5A60S2单片机在不接外部RAM的状况下总的RAM巨细,先看一下内部的RAM分布图

:内部RAM(256byte)包含三部分:低128byte,高128byte和特别功用寄存器区,特别留意和51不同,他的特别功用寄存器和高128byte地址堆叠,可是物理上是分隔的,一切内部可用的RAM有256byte,所以到此为止能够得到内部RAM巨细总共有:256byte+1024byte=1280byte

说了这么多,下面不多说,直接上程序

《一》直接运用体系自带的printf函数:特别留意需求置位TI=1,不然是无法发送的,程序如下:

[cpp] view plaincopyprint?

01.//此程序首要用于uart发送(proteus终端不能显现汉字,但串口帮手能够),输入换行符换行

02.#include

03.//stdio.h,string.h用于printf函数原型

04.#include

05.

06.

07.void delay(unsigned int z);

08.void uart_init(void);//串行口初始化

09.

10.int main(void)

11.{

12. int a=99;

13. char *string=”abde”;

14. uart_init();

15. while(1)

16. {

17. printf(“%d %x %c %s %p”,a,a,(char)a,string,string);

18. delay(1000);

19. }

20. return 0;

21.}

22.

23.void uart_init(void)

24.{

25. TMOD=0x20;//即0010 0000,定时器/计数器1,工作方式2

26. TH1=0xfd;//设置波特率为9600

27. TL1=0xfd;

28. TR1=1;//发动定时器/计数器1

29.

30. SCON=0x50; //0101 0000.串口工作方式1,答应串行操控

31. PCON=0x00;//设置SMOD=0

32. IE=0x90; //CPU答应中止,串行答应中止

33.

34. TI=1;//直接运用printf有必要参加此句才干完成发送

35.}

36.

37.void delay(unsigned int z)

38.{

39. unsigned int x,y;

40. for(x=z;x>0;x–)

41. for(y=110;y>0;y–);

42.}

//此程序首要用于uart发送(proteus终端不能显现汉字,但串口帮手能够),输入换行符换行

#include

//stdio.h,string.h用于printf函数原型

#include

void delay(unsigned int z);

void uart_init(void);//串行口初始化

int main(void)

{

int a=99;

char *string=”abde”;

uart_init();

while(1)

{

printf(“%d %x %c %s %p”,a,a,(char)a,string,string);

delay(1000);

}

return 0;

}

void uart_init(void)

{

TMOD=0x20;//即0010 0000,定时器/计数器1,工作方式2

TH1=0xfd;//设置波特率为9600

TL1=0xfd;

TR1=1;//发动定时器/计数器1

SCON=0x50; //0101 0000.串口工作方式1,答应串行操控

PCON=0x00;//设置SMOD=0

IE=0x90; //CPU答应中止,串行答应中止

TI=1;//直接运用printf有必要参加此句才干完成发送

}

void delay(unsigned int z)

{

unsigned int x,y;

for(x=z;x>0;x–)

for(y=110;y>0;y–);

}

《二》自己动手写一个相似printf的函数:uart_printf

可是这种状况占用RAM较多,由于需求拓荒大数组,所以需求运用拓宽型的51单片机,一般的AT89C51和STC89C52之类的会形成内存不够用、仓库溢出等等问题,所以以下程序都是根据STC12C5A60S2的,由于它含有内部拓宽的1024byte的RAM,能够用来存储大数组

[cpp] view plaincopyprint?

01.//此程序首要用于uart发送(proteus不能仿真,但实践是能够运转的),输入换行符换行

02.#include

03.//stdio.h,stdarg.h用于vsprintf函数原型

04.#include

05.#include

06.

07.void delay(unsigned int z);

08.void uart_init(void);//串行口初始化

09.void sendbyte(unsigned char c);

10.void sendstring(unsigned char *string);

11.void uart_printf(const char *fmt,…);

12.

13.int main(void)

14.{

15. int a=99;

16. uart_init();

17. while(1)

18. {

19. uart_printf(“10进制:%d 16进制:%x 字符格局:%c”,a,a,a);

20. delay(1000);

21. }

22. return 0;

23.}

24.

25.void uart_init(void)

26.{

27. TMOD=0x20;//即0010 0000,定时器/计数器1,工作方式2

28. TH1=0xf3;//设置波特率为2400

29. TL1=0xf3;

30. TR1=1;//发动定时器/计数器1

31.

32. SCON=0x50; //0101 0000.串口工作方式1,答应串行操控

33. PCON=0x00;//设置SMOD=0

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/258294.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部