C8051F350 库printf和接收

源码:

/********************************Copyright (c)**********************************\
**
**                   (c) Copyright 2019, Main, China, SRED.
**                           All Rights Reserved
**
**
**----------------------------------文件信息------------------------------------
** 文件名称: main.c
** 创建人员: Sudaroot
** 创建日期: 2019-06-26
** 文档描述:
**
**----------------------------------版本信息------------------------------------
** 版本代号: V0.1
** 版本说明: 初始版本
**
**------------------------------------------------------------------------------
\********************************End of Head************************************/
#include <C8051F350.h>
#include <stdio.h>
#include <string.h>

#define  RX_BUF_SIZE        50

unsigned char rx_receiving_completed = 0;
unsigned char rxbuf[RX_BUF_SIZE] = {0};

void Init_Device(void);




void main(void)
{
    Init_Device();
    //===UART============
    TR1 = 1;        /* TIMER 1 ON CONTROL */
    TI0 = 0;        /* UART 0 TX INTERRUPT FLAG Enable*/
    ES0 = 1;        // Enable UART0 interrupts

    printf("sudaroot: printf and receive test!\r\n");

    while(1)
    {
        if(rx_receiving_completed == 1)
        {
            printf("%s", rxbuf);
            memset(rxbuf, 0, RX_BUF_SIZE);
            rx_receiving_completed = 0;
        }
    }
}

// Peripheral specific initialization functions,
// Called from the Init_Device() function
void PCA_Init()
{
    PCA0CN    = 0x40;
    PCA0MD    &= ~0x40;
    PCA0MD    = 0x00;
}

void Timer_Init()
{
    TMOD      = 0x20;
    TH1       = 0x96;
}

void UART_Init()
{
    SCON0     = 0x10;
}

void Port_IO_Init()
{
    // P0.0  -  Unassigned,  Open-Drain, Digital
    // P0.1  -  Unassigned,  Open-Drain, Digital
    // P0.2  -  Unassigned,  Open-Drain, Digital
    // P0.3  -  Unassigned,  Open-Drain, Digital
    // P0.4  -  TX0 (UART0), Push-Pull,  Digital
    // P0.5  -  RX0 (UART0), Push-Pull,  Digital
    // P0.6  -  Unassigned,  Open-Drain, Digital
    // P0.7  -  Unassigned,  Open-Drain, Digital

    // P1.0  -  Unassigned,  Open-Drain, Digital
    // P1.1  -  Unassigned,  Open-Drain, Digital
    // P1.2  -  Unassigned,  Open-Drain, Digital
    // P1.3  -  Unassigned,  Open-Drain, Digital
    // P1.4  -  Unassigned,  Open-Drain, Digital
    // P1.5  -  Unassigned,  Open-Drain, Digital
    // P1.6  -  Unassigned,  Open-Drain, Digital
    // P1.7  -  Unassigned,  Open-Drain, Digital

    P0MDOUT   = 0x30;
    XBR0      = 0x01;
    XBR1      = 0x40;
}

void Oscillator_Init()
{
    OSCICN    = 0x83;
}

void Interrupts_Init()
{
    IE        = 0x90;
}

// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
    PCA_Init();
    Timer_Init();
    UART_Init();
    Port_IO_Init();
    Oscillator_Init();
    Interrupts_Init();
}

char putchar(char c)
{
    ES0 = 0;
    SBUF0 = c;

    while(!TI0);

    TI0 = 0;
    ES0 = 1;

    return c;
}

void UART0_Interrupt (void) interrupt 4
{
    static unsigned int rx_offset = 0;

    if(RI0 == 1)
    {
        RI0 = 0;

        if(rx_receiving_completed == 0)
        {
            if(rx_offset < RX_BUF_SIZE)
            {
                rxbuf[rx_offset] = SBUF0;

                if(rxbuf[rx_offset] == '\n')
                {
                    rx_receiving_completed = 1;
                    rx_offset = 0;
                }
                else
                {
                    rx_offset++;
                }
            }
            else
            {
                rx_receiving_completed = 1;
                rx_offset = 0;
            }
        }
    }
}

/********************************End of File************************************/

测试结果:

 

 

为什么 putchar函数需要关闭串口中断?

char putchar(char c)
{     
    ES0 = 0;      //关闭串口中断
    SBUF0 = c;    //发送
    while(!TI0);  //等待发送完成
    TI0 = 0;      //清除完成标志位
    ES0 = 1;      //恢复串口中断
    
    return c;
}

打开51单片机的头文件<stdio.h>

#pragma SAVE
#pragma REGPARMS
extern char _getkey (void);
extern char getchar (void);
extern char ungetchar (char);
extern char putchar (char);
extern int printf   (const char *, ...);
extern int sprintf  (char *, const char *, ...);
extern int vprintf  (const char *, char *);
extern int vsprintf (char *, const char *, char *);
extern char *gets (char *, int n);
extern int scanf (const char *, ...);
extern int sscanf (char *, const char *, ...);
extern int puts (const char *);

#pragma RESTORE

其中我们可以看到

#pragma SAVE
#pragma REGPARMS

#pragma RESTORE

这几个定义的作用可以点击

搜索SAVE

 

这几个定义都有说明,需要的自己可以研究一下。

 

全篇完。

本人博客仅仅代表我个人见解方便记录成长笔记。

若有与 看官老爷见解有冲突,我坚信看官老爷见解是对的,我的是错的。

感谢~!

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值