ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:76.49KB ,
资源ID:1954360      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/1954360.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(单片机C语言实现printf.docx)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

单片机C语言实现printf.docx

1、单片机C语言实现printf单片机串口实现printf函数背景叙述:在初学C语言时,利用printf函数向屏幕上输出字符,非常的好用和方便。学会单片机以后,尤其在学会串口通信之后,通过单片机的串口向PC机发送数据,怎么实现printf函数的功能。对于学习单片机来说,如果没有仿真器,出错误的时候不好找,只能用最笨的办法,使用printf函数,可是在KEIL里面使用printf却不像VC里面那么简单,因为其发送和硬件是有关系的。所以今天就简单来说说怎么在51单片机中使用printf函数:包括使用自带的printf函数和自己动手写一个printf函数功能描述:通过printf函数向串口发送数据,显示

2、在终端或者串口助手上Proteus中串口终端的介绍2、串口的配置尤其注意配置的波特率一定要和程序代码中所写的一样(否则会造成无法显示字符)数据位停止位奇偶校验位极性(这些属性基本上是默认的配置)3、串口终端的使用proteusvirtualterminal使用注意事项a.virtualterminal默认显示字符,如果单片机发送的是非显示字符,则虚拟终端不会显示,会导致用户认为通讯未通。运行程序,在虚拟终端窗口里面点击右键,在弹出菜单里面:选HEXDISPLAYMODEU显示按十六进制显示,能显示所有字符。b.virtualterminal默认情况下不显示回显字符,运行程序,在虚拟终端窗口里面

3、点击右键,在弹出菜单里面:选EchoTypedCharacters显示回显字符c.virtualterminal和模拟物理串口COMPIM不能同时使用,同时使用会发生相互影响。d.启动仿真后可以右键单击终端,最后一栏打开和关闭串口显示终直接使用系统自带的printf函数:特别注意需要置位TI=1,否则是无法发送的,程序如下(此程序在proteus终端上不能显示汉字,但在串口调试助手上可以)/*decription*利用printf函数向串口打印信息51单片机晶振频率11.0592MHZ串口通信波特率9600bps*#include#include#include#include#defineu

4、charunsignedchar#defineuintunsignedintvoiddelay_1ms(uintz)uintx,y;for(x=z;x0;x-)for(y=110;y0;y-);voiduart_init(void)TMOD=0x20;定时计数器1,工作方式2TH1=0xFD;设置波特率9600TL1=0xFD;TR1=1;SCON=0x50;PCON=0x00;EA=1;ES=1;TI=1;若利用printf函数则TI初始值必须置1)voidmain()(uart_init();while(1)(/SBUF=H;/while(TI=0);/TI=0;printf(iamher

5、ro!nr);delay_1ms(1000);(ff=0;printf(%c,num);)voidser_interrupt()interrupt4(if(RI=1)(ES=0;RI=0;num=SBUF;ES=1;ff=1;)4.编写自己的printf函数(这个函数不能再proteus中仿真,但实际中可以使用)a.预备知识C语言函数:vsprintf,其原型为intvsprintf(char*string,char*format,va_listparam);,作用为将param按格式format写入字符串string中,因此他可以用于将任何格式数据转化为字符串数据,比如把整数97转化为ASC

6、II码的97的程序就像下面这样vsprintf(string,%d,97),当然还有一点需要注意:在keil里面使用sprintf需要包含stdio.h这个头文件(当然这里也可以使用sprintf,作用完全差不多,只需要稍加修改即可,不多介绍)。说到这里,再来说说另一个函数itoa吧,其实他比vsprintf更简单,其原型为char*itoa(intvalue,char*string,intradix),作用为将value按radix进制写入到string字符串中,使用时需要包含头文件stdlib.h,可是在keil里面却无法使用,头文件里面不包含itoa,即使把VC里面的复制进来貌似还是不行

7、,呵呵,目前不知道原因。可变参数函数具体来说就是stdarg.h里面的这几个函数va_start,va_arg,va_list,va_end这几个参数用于开辟一段内存区域,可以配合vsprintf使用,但是对内存使用较大,需要单片机具备一定的RAM,否则程序就算能编译通过也是无法运行的。函数形参列表中的变量在内存中的位置是顺次排列的。头文件Stdarg.h里的几个宏定义就是利用了这么一点,顺次获取多个参数Keil中上述函数的定义如下typedefchar*va_list;/va_list即为字符指针类型#defineva_start(ap,v)ap=(va_list)&v+sizeof(v)#

8、defineva_arg(ap,t)(int*)ap)+0)#defineva_end(ap)/keil中什么也没有做每个平台下面的Stdarg头文件的定义都是不相同的。就拿keil那里的来入手。先看一个最简单的可变参数列表的函数:voidmytest(inta,.)intb;va_listap;va_start(ap,a);b=va_arg(ap,int);va_end(ap);printf(%d,%d,a,b);i.首先定义一个va_list型的变量ap,也就是char*。ii.va_start(ap,a彦替换之后就是ap=(va_list)&a+sizeof(a);首先取a的地址,即第一

9、个固定参数的地址,然后强制类型转换为va_list,接着后移a的内存大小,把当前这个地址值赋给ap。很明显,就是第一个参数a后面的那个地方,按照上面说的,也就是第一个可变参数。即现在把ap指向第一个可变参数。iii.b=va_arg(ap,int宏替换为b=(int*)ap)+0;自加在后,因此是获取第一个参数的值赋给b,然后ap后移一个类型的位置,即指向下一个元素的地址。iiii.va_end(ap),这里什么都没有做,在ADS那个版本里是将ap指向NULL防止误操作。具体内容详见内部拓展RAM定义:集成在单片机内部的数据存储器,在物理上是内部,但逻辑上是外部,访问时需要使用MOVX或者xd

10、ata访问,具体可以看STC8051手册。89C52单片机内含有1024byte=1Kbyte的内部拓展RAM,在访问的时候,使用C语言的时候,需要加上xdata才可以访问,使用汇编的时候需要用MOVX指令访问。xdata:访问内部RAM数据源程序/*decription*利用printf函数向串口打印信息51单片机晶振频率11.0592MHZ串口通信波特率9600bps利用系统自带printf函数TI初始值必须置1*includesfile*#include#include用于vsprintf函数原型#include#include#defineucharunsignedchar#defin

11、euintunsignedintvoiddelay_1ms(uintz);voiduart_init(void);voidsendbyte(ucharc);voidsendstring(uchar*string);可变参数列表函数voiduart_printf(constchar*fmt,.voidmain(void)inta=99;uart_init();while(1)uart_printf(10进制d16进制x字符格式c,a,a,a);delay_1ms(1000);)voiddelay_1ms(uintz)uintx,y;for(x=z;x0;x-)for(y=110;y0;y-);)

12、voiduart_init(void)TMOD=0x20;定时计数器1,工作方式2TH1=0xFD;设置波特率9600TL1=0xFD;TR1=1;SCON=0x50;PCON=0x00;EA=1;ES=1;)voidsendbyte(unsignedcharc)if(c=n)(SBUF=0X0D;while(TI=0);TI=0;SBUF=0X0A;while(TI=0);TI=0;else(SBUF=c;while(TI=0);TI=0;voidsendstring(unsignedchar*string)(while(*string!=0)/判断是否到字符串的尾端sendbyte(*string);string+;)voiduart_printf(constchar*fmt,.)(va_listap;charxdatastring1024;访问内部RAMva_start(ap,fmt);vsprintf(string,fmt,ap);sendstring(string);va_end(ap);)voiduart_interrupt()interrupt4(if(RI=1)(ES=0;/*添加处理代码*/ES=1;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1