C51 串口收发,printf, 接收字符串

串口发送,接收

在while(1){printf(“xxx”); delay(100); //此处需要有delay函数;}

#include<reg51.h>  
//stdio.h,string.h用于printf函数原型  
#include<stdio.h>  

void delay(unsigned int z)  
{  
    unsigned int x,y;  
    for(x=z;x>0;x--)  
        for(y=110;y>0;y--);  
}


void uart_init(void)  
{  
    TMOD=0x20;//即0010 0000,定时器/计数器1,工作方式2  
    TH1=0xe6;//设置波特率为2400  24M  
    TL1=0xe6;  
    TR1=1;//启动定时器/计数器1  

    SCON=0x50; //0101 0000.串口工作方式1,允许串行控制  
    PCON=0x00;//设置SMOD=0  
    IE=0x90; //CPU允许中断,串行允许中断  

    TI=1;//直接使用printf必须加入此句才能实现发送  
    RI=1;
}  

int main(void)  
{  
    int a=99;  
    char *string="abde";  
    uart_init(); 

    printf("hello system is restart\n");

    while(1)  
    {  
        //puts("abcd");
        //printf("%d  %x  %c  %s  %p\n",a,a,(char)a,string,string);
        delay(1000);  
    }  
    return 0;  
}  

void uart_receiver(void) interrupt 4 //串口中断
{
    unsigned char temp; //临时变量,用于缓冲收发数据

    if(RI)  // 判断是串口接收产生中断
    {
        RI = 0;       // 清接收中断标志
        temp = SBUF;  // 接收到的数据写入缓冲BUF
        SBUF = temp;  // 将收到的数据发回给电脑端
    }

    if (TI)    // 判断是串口发送产生中断
        TI = 0;  // 清发送中断
}

C51串口接收字符串:

#include<reg51.h>  
//stdio.h,string.h用于printf函数原型  
#include<stdio.h>  

static unsigned long int SysTick = 0;


#define S_RECEVIER_SIZE  32
unsigned char RevBuffer[S_RECEVIER_SIZE];
int revDataCount = 0;
int revTempLength = 0;

void delay(unsigned int z)  
{  
    unsigned int x,y;  
    for(x=z;x>0;x--)  
        for(y=110;y>0;y--);  
}


void uart_init(void)  
{  
    TMOD=0x20;//即0010 0000,定时器/计数器1,工作方式2  
    TH1=0xe6;//设置波特率为2400  24M  
    TL1=0xe6;  
    TR1=1;//启动定时器/计数器1  

    SCON=0x50; //0101 0000.串口工作方式1,允许串行控制  
    PCON=0x00;//设置SMOD=0  
    IE=0x90; //CPU允许中断,串行允许中断  

    TI=1;//直接使用printf必须加入此句才能实现发送  
    RI=1;
}  

int main(void)  
{  
    int a=99;  
    char *string="abde";  
    uart_init(); 

    printf("hello system is restart\n");

    while(1)  
    {  
        //puts("abcd");
        //printf("%d  %x  %c  %s  %p\n",a,a,(char)a,string,string);

        delay(1000);  
    }  
    return 0;  
}  

void uart_receiver(void) interrupt 4 //串口中断
{
    unsigned char temp; //临时变量,用于缓冲收发数据

    if(RI)  // 判断是串口接收产生中断
    {
        RI = 0;       // 清接收中断标志
        temp = SBUF;  // 接收到的数据写入缓冲BUF
        //SBUF = temp;  // 将收到的数据发回给电脑端

        if (temp != '/n') // 以‘/n’做为接收字符串结束标志 
        {
            RevBuffer[revDataCount] = temp;
            revDataCount++;
        } 
        else
        {     
            printf("%s\n", &RevBuffer[0]);
            revTempLength = revDataCount;
            revDataCount = 0;
        } 
    }

    //if (TI)      // 判断是串口发送产生中断
    //  TI = 0;  // 清发送中断
}
您好!对于C51单片机的串口通信接收字符串,可以通过以下步骤来实现: 1. 首先,需要配置串口工作模式和波特率。可以使用相关的寄存器设置来配置串口工作模式和波特率,例如P3M1、P3M0和T2CON等寄存器。 2. 接下来,需要编写一个函数来接收串口数据。可以使用UART中断来实现串口数据的接收。在接收到数据时,UART中断会触发,并将数据存储在一个缓冲区中。 以下是一个示例代码: ```c #include <REG51.H> #define UART_BUFSIZE 64 volatile unsigned char uart_buffer[UART_BUFSIZE]; volatile unsigned char uart_read_ptr = 0; volatile unsigned char uart_write_ptr = 0; void UART_ISR() interrupt 4 { if (RI) { RI = 0; // 清除接收中断标志位 uart_buffer[uart_write_ptr] = SBUF; // 将接收到的数据存储到缓冲区 uart_write_ptr = (uart_write_ptr + 1) % UART_BUFSIZE; // 更新写指针 } } void UART_Init() { TMOD |= 0x20; // 设置定时器1为工作模式2 TH1 = 0xFD; // 设置波特率为9600bps TL1 = TH1; TR1 = 1; // 启动定时器1 ES = 1; // 允许串口中断 EA = 1; // 允许总中断 RI = 0; // 清除接收中断标志位 TI = 0; // 清除发送中断标志位 } unsigned char UART_Read() { unsigned char data; while (uart_read_ptr == uart_write_ptr); // 等待数据接收 data = uart_buffer[uart_read_ptr]; // 从缓冲区读取数据 uart_read_ptr = (uart_read_ptr + 1) % UART_BUFSIZE; // 更新读指针 return data; } void main() { UART_Init(); while (1) { unsigned char received_data = UART_Read(); // 处理接收到的数据 } } ``` 在上述代码中,我们使用了一个循环缓冲区来存储串口接收到的数据。在主函数的无限循环中,可以通过调用`UART_Read()`函数来获取接收到的数据,并进行相应的处理。 请注意,上述代码仅为示例,您需要根据具体的硬件和需求进行相应的修改和适配。希望对您有所帮助!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SongYuLong的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值