




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机串口实现printf函数背景叙述:在初学C语言时,利用printf函数向屏幕上输出字符,非常的好用和方便。学会单片机以后,尤其在学会串口通信之后,通过单片机的串口向PC机发送数据,怎么实现printf函数的功能。对于学习单片机来说,如果没有仿真器,出错误的时候不好找,只能用最笨的办法,使用printf函数,可是在KEIL里面使用printf却不像VC里面那么简单,因为其发送和硬件是有关系的。所以今天就简单来说说怎么在51单片机中使用printf函数:包括使用自带的printf函数和自己动手写一个printf函数功能描述:通过printf函数向串口发送数据,显示在终端或者串口助手上Proteus中串口终端的介绍1、连接方法如下所示2、串口的配置尤其注意配置的波特率一定要和程序代码中所写的一样(否则会造成无法显示字符)数据位停止位奇偶校验位极性(这些属性基本上是默认的配置)3、串口终端的使用proteus virtual terminal 使用注意事项a. virtual terminal 默认显示字符,如果单片机发送的是非显示字符,则虚拟终端不会显示,会导致用户认为通讯未通。运行程序,在虚拟终端窗口里面点击右键,在弹出菜单里面:选HEX DISPLAY MODE,则显示按十六进制显示,能显示所有字符。b.virtual terminal 默认情况下不显示回显字符,运行程序,在虚拟终端窗口里面点击右键,在弹出菜单里面:选Echo Typed Characters 显示回显字符c.virtual terminal 和模拟物理串口COMPIM不能同时使用,同时使用会发生相互影响。d. 启动仿真后可以右键单击终端,最后一栏打开和关闭串口显示终端源程序直接使用系统自带的printf函数:特别注意需要置位TI=1,否则是无法发送的,程序如下(此程序在proteus终端上不能显示汉字,但在串口调试助手上可以)/*decription*利用printf函数向串口打印信息51单片机晶振频率11.0592MHZ串口通信波特率9600bps利用printf函数TI初始值必须置1*/*includes file*/#include#include#include#include#define uchar unsigned char#define uint unsigned intvoid delay_1ms(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void uart_init(void)TMOD=0x20; /定时计数器1,工作方式2TH1=0xFD; /设置波特率9600TL1=0xFD;TR1=1;SCON=0x50; PCON=0x00;EA=1;ES=1;TI=1; /若利用printf函数则TI初始值必须置1void main()uart_init();while(1)/ SBUF = H;/ while(TI=0);/ TI=0; printf(i am herro!nr); delay_1ms(1000); if(ff) ff=0;printf(%c,num); void ser_interrupt() interrupt 4if(RI=1)ES=0;RI=0;num=SBUF;ES=1;ff=1;4.编写自己的printf函数(这个函数不能再proteus中仿真,但实际中可以使用)a.预备知识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,否则程序就算能编译通过也是无法运行的。函数形参列表中的变量在内存中的位置是顺次排列的。头文件Stdarg.h里的几个宏定义就是利用了这么一点,顺次获取多个参数Keil中上述函数的定义如下typedef char* va_list; /va_list即为字符指针类型#define va_start(ap,v) ap=(va_list)&v+sizeof(v)#define va_arg(ap,t) (int*)ap)+0)#define va_end(ap) /keil中什么也没有做每个平台下面的Stdarg头文件的定义都是不相同的。就拿keil那里的来入手。先看一个最简单的可变参数列表的函数:void mytest(inta,.)intb;va_list ap;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的地址,即第一个固定参数的地址,然后强制类型转换为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,防止误操作。具体内容详见/googlemi/article/details/8988567内部拓展RAM定义:集成在单片机内部的数据存储器,在物理上是内部,但逻辑上是外部,访问时需要使用MOVX或者xdata访问,具体可以看STC8051手册。89C52单片机内含有1024byte=1Kbyte的内部拓展RAM,在访问的时候,使用C语言的时候,需要加上xdata才可以访问,使用汇编的时候需要用MOVX指令访问。xdata:访问内部RAM数据源程序/*decription*利用printf函数向串口打印信息51单片机晶振频率11.0592MHZ串口通信波特率9600bps利用系统自带printf函数TI初始值必须置1*/*includes file*/#include#include/用于vsprintf函数原型#include#include#define uchar unsigned char#define uint unsigned intvoid delay_1ms(uint z);void uart_init(void);void sendbyte(uchar c);void sendstring(uchar *string);void uart_printf(const char*fmt,.);/可变参数列表函数void main(void)int a=99;uart_init();while(1)uart_printf(10进制%d 16进制%x 字符格式%c,a,a,a); delay_1ms(1000);void delay_1ms(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void uart_init(void)TMOD=0x20; /定时计数器1,工作方式2TH1=0xFD; /设置波特率9600TL1=0xFD;TR1=1;SCON=0x50; PCON=0x00;EA=1;ES=1;void sendbyte(unsigned char c)if(c=n)SBUF=0X0D;while(TI=0);TI=0;SBUF=0X0A;while(TI=0);TI=0;elseSBUF=c;while(TI=0);TI=0;void sendstring(unsigned char *string)while(*string!=0) /判断是否到字符串的尾端sendbyte(*string);string+;void ua
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东省【中职专业高考】2025年中职高考对口升学(理论考试)真题卷【财经商贸大类】模拟练习
- 2025安徽黄山市黄山区消防救援大队政府专职消防员招聘2人模拟试卷及答案详解(历年真题)
- 2025海南保亭黎族苗族自治县市场监督管理局公益性岗位人员招聘1人考前自测高频考点模拟试题及答案详解(必刷)
- 广播安全播出技术培训课件
- 2025年甾体药物原料合作协议书
- Ibuprofenyl-CoA-Ibuprofenyl-coenzyme-A-生命科学试剂-MCE
- 广彩工艺传承
- 2025年离合器面片项目合作计划书
- GP130-modulator-2-生命科学试剂-MCE
- 2025年旋挖钻机项目合作计划书
- 2025至2030中国生物基化学品行业产业运行态势及投资规划深度研究报告
- 雾化吸入课件
- 采购战略合作协议范本5篇
- 财务部安全生产培训报告课件
- 公司兼职人员劳务合同4篇
- 制造过程质量追溯系统设计
- 2025年能源行业新能源产业风险管理可行性研究报告
- 会计毕业论文烟草专业
- 数字文旅概论 课件全套 第1-9章 数字文旅内涵与发展背景 - 数字营销
- 井盖安全常识培训课件
- 年产5万吨电熔锆刚玉新材料扩建项目环境影响报告表
评论
0/150
提交评论