源码:
/********************************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
这几个定义都有说明,需要的自己可以研究一下。
全篇完。
本人博客仅仅代表我个人见解方便记录成长笔记。
若有与 看官老爷见解有冲突,我坚信看官老爷见解是对的,我的是错的。
感谢~!