设计与开发

单片机printf函数 单片机C语言编程之:keil使用printf函数输出方法详解

小编 2024-10-23 设计与开发 23 0

单片机C语言编程之:keil使用printf函数输出方法详解

在大学里学C语言的时候经常用到printf函数,用该函数打印输出计算结果非常的方便。但是在学了单片机之后,在keil环境中也想使用该函数打印输出该怎么办呢?下面来讲解一下keil中如何使用printf函数输出结果。

1. 关于头文件

C语言编程要包含头文件,所用到的函数或者变量在哪个头文件里就把该头文件包含进去,要使用printf函数就要知道它包含在哪个头文件中。printf函数在“stdio.h” 头文件中,所以该头文件要被包含。以下语句必不可少:

#include <stdio.h>

2. 输出实例

本例简单以求余为例介绍,求余即取余数,在C语言中有“%”来表示,其运算结果返回余数。如:

8%3,其运算结果为2,即8/3 = 2,余数为2。编程如下图所示:

3. 编译和调试

程序编好后,需要进行编译。编译完毕没有错误后,进入调试模式,如下图所示:

进入调试模式后,点击Peripherals→Serial,弹出对话框如下:

选中TI和RI。

4. 查看结果

点击view→Serial Windows→UART #1

5. 点击全速运行即可看见运行结果。

赶快试一下吧。

本订阅号致力于单片机、ARM等嵌入式软硬件的设计经验分享,秉承“人人都是电子设计经验的分享者”的理念,成功路上不孤单,我们一起努力。

公众号:micropoint8。网址:www.picmcu.com

大家有什么要讨论的欢迎留言评论啊。

51单片机实现scanf和printf函数

我们在使用51单片机时,会特别平凡的用到串口这个外设,但是它没有提供像标准c一样提供scanf和printf这两个输入输出函数,这样平时每次使用起来比较麻烦。但是我们可以自己通过单片机发送一个字节和接收一个字节这两个函数来改造一下,下面请看具体过程。

1.printf函数

在格式化输出时,向下调用了char putchar(char c);这个函数,在“stdio.h”里可以发现有这个函数,所以我们需要自己构造一个这样的函数,即通过串口putchar(),代码如下:

char putchar(char c)

{

al_uart_putchar(c);

hreturn c; }

其中hal_uart_putchar(c);函数是我们比较熟悉的了,是51单片机 通过串口发送一个字节的函数,具体代码如下:

void hal_uart_putchar(char i)

{ ES = 0;

清空发送完中断请求标志位 SBUF = i;

TI = 0; /

/ //将数据放入寄存器发送

//等待发送完毕,发送完毕 TI == 1 TI = 0; //清空发送

while(TI == 0)

;完中断请求标志位 ES = 1; }

有了这两个函数,在单片机启动后,首先进行串口初始化,接着就可以使用printf了……是不是很简单……

-------------------------------------------------------------------------------------------------------------------------------------

2.下面再看scanf的具体实现方法:

scanf函数在格式化输入时,向下掉用了char getkey(void);这个函数,在“stdio.h”里可以发现有这个函数,所以我们需要自己构造一个这样的函数,即通过串口getkey(),代码如下:

char _getkey (void)

{

eturn hal_uart_getchar(); }

r

其中hal_uart_getchar(); 稍稍复杂,但也很好理解,代码如下:

char hal_uart_getchar(void)

{ uchar ch;

a character is available: while(uart_

//Wait unti

lrx_cnt == 0); ES = 0; ch = uart_rx[uart_rx_rp];

rt_rx_cnt--; ES = 1; return ch; }

uart_rx_rp = (uart_rx_rp + 1) % UART_BUF_SIZE; u

a

这个函数是从串口接收队列中取出队尾的一个字节。uart_rx_cnt 表示现在串口队列中的已有字节数,uart_rx_rp 指向队尾。

最后要介绍的一个函数是串口接收中断函数,代码如下:

void UART1InterruptReceive(void) interrupt 4

{ ES=0;//关串行口中断 if(RI) {

if(uart_rx_cnt < UART_BUF

RI=0;//接收中断信号清零,表示将继续接收

_SIZE) { uart_rx[uart_rx_wp] = SBUF;

_SIZE; uart_rx_cnt++; } } ES=1;//开串行口中断

uart_rx_wp = (uart_rx_wp + 1) % UART_BU

F}

该函数实现了串口的中断接收,收到的新的字节存放在队首,即uart_rx_wp指向队列的首地址,每次收到一个新的字节,uart_rx_cnt增1。

至此,scanf函数也可以实现了。

注:串口接收的队列没有溢出检测……

这篇文章里实现的是对于串口的格式化输入输出,实际上,我们同样可以对hal_uart_getchar();和hal_uart_putchar(c);函数进行更改,实现在屏幕上的格式化输出等,思路都是一样的……

欢迎大家评论留言,讨论

相关问答

单片机 输出电压有24V吗?

不行。明确单片机不能直接输出24V电压。单片机的输出电压通常在5V以下,甚至有些是只有几毫伏,如果需要输出高电压,需要使用电平转换电路或者驱动芯片。电平转...

单片机 输出正弦波信号?

用C语言写比较简单,用函数可以用,如果用汇编语言写,就要用查表的方法,而且采样点不能太多(不超过255为好).上面那位说得对,就是一个D/A程序,只是不断的转换...

单片机 的I/O接口能输入或输出模拟信号吗? - 懂得

单片机的I/O接口,如果该I/O口有AD功能就可以,以模拟量信号输入,如果该I/O口有PWM功能就可以,以PWM调制信号输出,或者通过滤波以模拟量信号输出,现在...

单片机 控制输出是正还是负极?

不是,单片机输出的信号类型很多,有高低电平,SPI通信等。不是,单片机输出的信号类型很多,有高低电平,SPI通信等。

肿么用c语言控制 单片机 输出高低电平-ZOL问答

若单片机的晶振频率为12MHz,用51单片机内部定时\\/计数器T0,工作方式为1,在单片机P1.0口产生周期为20ms的方*,*形占空比为50%。试解答下列问题:1)计算定时器...

单片机 是怎么通过pwm波来控制电机运转的,工作原理是什么?

三、单片机PWM控制原理现在很多单片机都有PWM功能,一般情况下,单片机的PWM功能是通过定时器来实现的,在使用时,需要对定时器的寄存器进行PWM功能的设置。...现...

单片机 能控制多大的电流和电压?

单片机本身并不直接控制电流和电压的大小,它作为一个微控制器,主要负责控制外部器件的开关和逻辑操作。单片机的输出引脚通常具有较小的电流(几毫安级别)和电...

单片机 采集指示灯的交流电平信号通过485与电脑通信来控制继电器的开关的电路图?

如果是5V单片机系统,高输出2V的情况有:1、IO口外接了较大的负载,拉低了端口的电压(一般单片机的IO为弱上拉),如果你断开负载测量端口电压还是2V的话就有可能...

单片机 怎么用c语言设置I/O口输入或输出?

单片机的IO口缺省时一般都是双向,既可以是输入又可以是输出,C语言中判断这个口是输入还是输出要看表达式的形式,比如:sbitkey=P1^0;if(key==1).....这里是作...

51 单片机 怎样用一个定时器输出两路方波 - 177****6746 的回...

你的程序只有一处错误,我已通过测试,请将mian改为main.另外,如果方便请将#include改为#include"regx52.h"请采纳,谢谢。只要你有定时器输出几路都....

猜你喜欢