STC12C5410AD单片机在串口通信中,如果需要用printf函数通过串口进行数据的传输,并用上位机进行接收时,只需要对putchar()函数进行一次重写,这样加上头文件stdio.h,就可以在程序中调用printf函数了。大牛勿喷~~~~
#include<STC12C5410AD.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED = P1^0;
void Delay1ms(uint count)
{
uint i,j;
for(i=0;i<count;i++)
{
for(j=0;j<120;j++);
}
{
uint i,j;
for(i=0;i<count;i++)
{
for(j=0;j<120;j++);
}
}
void RS_init()
{
PCON &= 0x7f; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xbf; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xfe; //串口1选择定时器1为波特率发生器
TMOD &= 0x0f; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xF3; //设定定时初值
TH1 = 0xF3; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA = 1;
ES = 1;
void RS_init()
{
PCON &= 0x7f; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xbf; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xfe; //串口1选择定时器1为波特率发生器
TMOD &= 0x0f; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xF3; //设定定时初值
TH1 = 0xF3; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA = 1;
ES = 1;
}
char putchar(uchar D_B)
{
ES = 0; //关串口中断
TI = 0; //清零串口发送完成的中断请求标志
SBUF = D_B;
while(TI==0); //等待发送完成
TI = 0; //清零串口发送完成中断请求标志
ES = 1; //允许串口中断
return SBUF;
}
void main(void)
{
{
ES = 0; //关串口中断
TI = 0; //清零串口发送完成的中断请求标志
SBUF = D_B;
while(TI==0); //等待发送完成
TI = 0; //清零串口发送完成中断请求标志
ES = 1; //允许串口中断
return SBUF;
}
void main(void)
{
uint h,m,s;
RS_init();
while(1)
{
LED = 0; //开启LED显示
Delay1ms(5000);
h=11;
m=15;
s=43;
printf("the time is:%d:%d:%d\r\n", h,m,s);
printf("STC12C5410AD\r\nLuna test OK\r\n");
LED = 1; // 关闭LED
Delay1ms(5000);
}
}