单片机程序巧用printf

发布者:bin0990最新更新时间:2015-05-27 来源: 51hei关键字:单片机程序  printf 手机看文章 扫描二维码
随时随地手机看文章
      当我们在调试代码时,通常需要将程序中的某个变量打印至PC机上,来判断我们的程序是否按预期的运行,printf函数很好的做到了这一点,它能直接以字符的方式输出变量名和变量的值。
printf函数在使用时,不仅仅要初始化串口,还需要其它的一些设置或者要调用其它的一些函数 否则printf函数将不能按我们想要的方式执行。
    由于不同的编译器studio函数不一样,所以使用的方法也不一样,这需要大家去看编译器的help帮助选项,这里我们以STM32、51和AVR整理了几个串口打印程序,供需要的朋友参考。
   1、在KEIL下使用printf函数,以STM32为例
    在uart.c中添加如下代码
View Code
/*******************************************************************************
    函数名:fputc
    输  入:
    输  出:
    功能说明:
    重定义putc函数,这样可以使用printf函数从串口1打印输出
*******************************************************************************/
int fputc(int ch, FILE *f)
{
    /* Place your implementation of fputc here */
    /* e.g. write a character to the USART */
    USART_SendData(USART1, (uint8_t) ch);
 
    /* Loop until the end of transmission */
    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
    {}
 
    return ch;
}
/*******************************************************************************
    函数名:fputc
    输  入:
    输  出:
    功能说明:
    重定义getc函数,这样可以使用scanff函数从串口1输入数据
******************************************************************************/
int fgetc(FILE *f)
{
    /* 等待串口1输入数据 */
    while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
    {}
 
    return (int)USART_ReceiveData(USART1);
}
    这样,只要在需要用printf的文件里#include 就可以了,printf会自已的调用fputc函数来实现串口数据的输出。
2、添加Retarget.c,实现在KEIL下使用printf函数,以LPC2478为例
    首先在Keil安装目录下面ARM/Startup/Retarget.c找到Retarget.c文件将其复制到你的工程文件夹下面;并将其加入到工程中
    在uart.c中添加如下代码
View Code
// Implementation of sendchar (also used by printf function to output data) 
   int sendchar (int ch) {                 // Write character to Serial Port 
   while (!(U0LSR & 0x20)); 
  return (U0THR = ch); 
int getkey (void)  {                     // Read character from Serial Port 
  while (!(U0LSR & 0x01)); 
  return (U0RBR); 
}
    这样,只要在需要用printf的文件里#include 就可以了,printf会通过Retarget中的fputc函数调用sendchar来实现串口数据的输出。
   事实上,和第一种的方式是一样的。
3、自定义printf函数,以AVR为例
   前面介绍的是在KEIL编译器上使用printf函数,但不是所有的编译器平台都能适用,因此有时候我们需要自定义printf函数,下面以AVR在GCC下为例
   在usart.c中添加如下代码
View Code
#include    
#include    
 
/*********************************************************/
//向串口usart0发送一个字节函数   
 void Uart0_putchar( unsigned char sdbyte)  
 {
     UDR0=sdbyte;
     while(!(UCSR0A&0x40));
     UCSR0A|=0x40;
 }
////////////////////////////////////////////////////////
void Uart0_printf(char *str,...)
{
 char  buf[128];
 unsigned char i = 0;
 va_list ptr;
 va_start(ptr,str);
 vsprintf(buf,str,ptr);
 while(buf[i])
 {
     Uart0_putchar(buf[i]);
     i++;
 }
}
  这样有了printf格式化输出函数,随时能把需要的变量打印到pc机或液晶上,调试起来就方便多了。
关键字:单片机程序  printf 引用地址:单片机程序巧用printf

上一篇:二维数组如何进行冒泡排序
下一篇:MMA7260的STC12C5410AD单片机程序

推荐阅读最新更新时间:2024-03-16 14:03

51单片机实例讲解,数码管显示数字“5555”程序
利用单片机及某些数字电路块的结合,可以实现静态字符的显示。本例是利用74LS164八位移位寄存器(串入、并出)与单片机串行口结合,使数码管静态显示数字“5555”。 (1)数码管显示数字“5555”硬件电路(见图20)。 图20 显示字符“5555”接线原理图 在图20的电路中,74LS164的相关引脚与数码管的a、b、c、d、e、f、g引脚相连接,并且74LS164为串行输入、并行输出,所以L4LS164串行输入的数据与数码管对应字符的关系见表7。 表7 L4LS164串行输入的数据与数码管对应字符的关系表 (2)数码管显示数字“5555”硬件电路元器件(见表8)。 表8 数码管显示数字“5555”硬件电路
[单片机]
51<font color='red'>单片机</font>实例讲解,数码管显示数字“5555”<font color='red'>程序</font>
第二课:8051单片机开发之程序下载
上回我们分析了单片机的最小硬件系统,那么在今天我们一起来学习一下单片机的程序下载流程。那么我们先看个单片机程序下载电路图,如下图所示: 图1 单片机最小系统完整电路图 图1 给出的是我们常用的一个单片机最小系统电路,比我们前面讲的单片机最小系统多了两个基本电路,那就是程序下载接口和P0口多了一排1K的上拉电阻(这排电阻有什么用,后面我们再分析)。 从图上我们看到,程序下载接口为一个10针的排针接口,这个接口把单片机的相关下载引脚引出来,是国际标准的统一接口,为了配合下载线接口而设置的(当然我们也可以随便用几个排针将下载的接口引出,但是我强烈的建议不要那样做,我们要走那标准的道路)。这个接口的实物图如下:
[单片机]
SH-3系列单片机程序设计关键技术
SH一3是Renesas公司SupezH系列的高端32位RISC构架单片机系列,具有低功耗、高性能、集成MMU、cache和电源管理模块等特点,处理速度为60~260MIPs。SH-3包括SH7705、SH7708、SH7709、SH7727、SH7729等单片机,广泛应用于彩色打印机、扫描仪、DVD解码器等高端数码设备上。SH7709S是SH-3系列中有代表性的一款单片机,文中介绍方法均在SH7709S的系统中得到验证。 主要介绍程序设计时三个关键部分:建立中断处理程序结构、初始化C程序中赋初始值的变量和上电初始化流程。   1 建立中断处理程序结构 SH-3的中断处理方式与一般处理器不同,没有固定的中断向量表,比较灵括,用
[单片机]
PIC单片机无符号BCD加法子程序
!--StartFragment-- ;******************* 无符号 BCD 加法 *************** ; ; This routine performs a 2 Digit Unsigned BCD Addition ; It is assumed that the two BCD numbers to be added are in ; locations Num_1 & Num_2. The result is the sum of Num_1+Num_2 ; and is stored in location Num_2 and the overflow carry is returne
[单片机]
单片机遥控控制流水灯程序
;-------------------------------------------------------------------------------- IRCOM EQU 20H ;20H-23H IR使用 IRIN EQU P3.2 D1 EQU 30H ;流水灯移位数缓存 D2 EQU 31H NO_M EQU 44H ;-------------------------------------------------------------------------------- ORG 0000H AJMP MAIN ORG 0003H ;外部中断INT0入口地址 AJMP IR_IN ;------------
[单片机]
单片机串口程序模板
#include reg52.h void main() { SCON = 0x50;//方式1( SM0 SM1:0 1)串行口位10位通用异步接口。发送或接收一帧数据信息为10位,包括1位起始位 0 、8位数据位、1位停止位 1 。 TMOD=0X20; //设置计时器工作模式2并装值开启 TH1=0XFD; TL1=0XFD; TR1=1; EA=1; //打开总中断 ES=1; //打开串口中断 //while(1); } void write() interrupt 4 { if(RI==1)// 发送结束标志 { RI=0; //重新置0,以便下次发送 P0=SBUF; //发送到P0口 }
[单片机]
51单片机直流电机调速源程序
单片机源程序如下: #include reg52.h sbit IN1=P1^1; sbit IN2=P1^2; sbit IN3=P1^3; sbit IN4=P1^4; unsigned char pwm_val_right=0; unsigned char push_val_right=0; unsigned int time=0; unsigned char pwm_val_left=0; unsigned char push_val_left=0; bit right_moto_stop=1; sbit right_moto_pwm=P2^0; bit left_moto_stop=1; sbit left_mot
[单片机]
51单片机实现数码管通过一二级菜单来设置数据的综合程序
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: LED-74HC595 ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200607 ---- @ModifiedTime: 20200607
[单片机]
51<font color='red'>单片机</font>实现数码管通过一二级菜单来设置数据的综合<font color='red'>程序</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved