当前位置:首页 > 技术学院 > 热搜器件
[导读]uart作为程序调试很有帮助,所以一个好的uart模块个人认为非常重要的。

uart作为程序调试很有帮助,所以一个好的uart模块个人认为非常重要的
这里的用stc12单片机,因为不用12分频,所以可以进行115200波特率快速传输(注意晶振必须11.0592MHz,12MHz的会乱码,本人亲测),而如果改用其他的51单片机,只需要把UartInit()函数改成自己的初始化设置就行,比如89c52,当然要记得改52头文件。
此uart本人比较欣赏的是可以直接调用UartPrintf()函数,跟c中prinf()用法几乎相同,支持%d%0.2f等省去了字符转换。而对于接收到的字符命令进行处理只需要在UartReceiveHandler函数中修改即可,例子中是对“End”字符命令进行处理,测试程序main.c是博文手写,未经测试,只是提示主框架用法
main.c-------------------------------------------------------------------------------------------------------
#include"uart.h"
void main(void)
{
    UartInit();
    while(1)
    {
          UartReceiveHandler();
    }
}
uart.h--------------------------------------------------------------------------------------------------------
#ifndef __UART_H__
#define __UART_H__

void UartInit(void);
void UartPrintf(const char *fmt,...);
void UartReceiveHandler(void);

#endif

uart.c--------------------------------------------------------------------------------------------------------

#include"STC12C5A60S2.h"
#include
#include        //stdio.h,stdarg.h用于vsprintf函数原型
#include

 

#define UART0_BUF_LEN 32

int UART1_Recv_count;     //接收计数

bit UART1_Overflow_Flag;//缓冲区满标志
bit MarkFlag = 1;

idata unsigned char UART1_Recv_BUF[UART0_BUF_LEN];
                        //串口接收缓冲区


void UartInit(void)        //115200bps@11.0592MHz
{
    PCON &= 0x7F;        //波特率不倍速
    SCON = 0x50;        //8位数据,可变波特率
    AUXR |= 0x04;        //独立波特率发生器时钟为Fosc,即1T
    BRT = 0xFD;            //设定独立波特率发生器重装值
    AUXR |= 0x01;        //串口1选择独立波特率发生器为波特率发生器
    AUXR |= 0x10;        //启动独立波特率发生器
    ES = 1;             //充许串口1中断
    EA=1;                 //开总中断
}
void sendbyte(unsigned char c)
{
    if(c=='\n')            //如果遇到\n就换行
    {
                        //发送CR(carriage return)
        SBUF=0x0D; 
        while(!TI);        //等待发送完成
        TI=0;
        
                        //发送 LF(NL line feed,new line)
        SBUF=0x0A; 
        while(!TI);        //等待发送完成
        TI=0;       
    }
    else
    {
        SBUF=c;
        while(!TI);        //等待发送完成
        TI=0;
    }
}
 
void sendstring(unsigned char *string)
                        //此处*string相当于数组
{
    while(*string!='\0')//判断是否到字符串末尾
    {
        sendbyte(*string);
        string++;
    }
}
 
void UartPrintf(const char *fmt,...)
{
    va_list ap;
    char xdata string[1024];        //访问内部拓展RAM,非访问外部RAM,不能超过内部拓展RAM大小(此处为1024)
    
    va_start(ap,fmt);
    vsprintf(string,fmt,ap);        //此处也可以使用sprintf函数,用法差不多,稍加修改即可,此处略去
    sendstring(string);
    va_end(ap);
}

 


void UART1_Int(void) interrupt 4
{
    if (RI == 1)
    {
        RI = 0;
        if(UART1_Overflow_Flag==0)
        {
            if(UART1_Recv_count
            {
                UART1_Recv_BUF[UART1_Recv_count++] = SBUF;
                if(SBUF=='\r' || SBUF=='\n')
                {
                    UART1_Overflow_Flag=1;
                }
            }
            else
            {
                UART1_Overflow_Flag=1; // 关闭串口中断,停止接收
            }
        }
    }
}

//void Delay_10ms()
//{
//    unsigned int i,j;
//    for(i=0; i<5; i++)
//        for(j=0; j<2000; j++);
//}
void UartReceiveHandler(void)
{
  
//    unsigned char i;
//    unsigned int Led;
unsigned long Count;

    if (UART1_Overflow_Flag==1) //串口中断数据接收完毕,开始处理
    {

 


        if(0 == strncmp("End",UART1_Recv_BUF,strlen("End")))
        {  
            UartPrintf("Start\n");
            Count = ReadCount();
            UartPrintf("End:%ld\n",Count);
        }

 

//        UartPrintf("\r\n");
        UART1_Recv_count = 0; //缓存清零
        UART1_Overflow_Flag=0;//允许串口继续接收数据
    }
}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

伴随物联网、车联网、人工智能等新兴应用领域的拓展和深化,智能家居、智慧楼宇、智慧城市和智能工业等行业快速发展,带动物联网无线模组需求释放,进而带动串口WiFi模块,BLE蓝牙模块以及ZigBee模块的需求增长

关键字: uart 串口通信 物联网

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种常用的串行通信协议,广泛应用于单片机或各种嵌入式设备之间的通信。

关键字: uart 串口通信 嵌入式

单片机是STC12C5A60S2,用的是单片机的硬件SPI驱动的nRF24L01+,这个是从机(接收机的)。主机(发射机)是用的STC12C5A60S2单片机,软件模拟SPI。这个是硬件全貌。 STC12C5A60S2...

关键字: stc12c5a60s2 单片机 SPI程序

本程序是在基于STC12C5A60S2芯片基础上采用硬件PCA/PWM模块编写。

关键字: stc12c5a60s2 51单片机 C KEIL 头文件

在众多的51系列单片机中,要算国内STC 公司的1T增强系列更具有竞争力,因他不但和8051指令、管脚完全兼容,而且其片内的具有大容量程序存储器且是FLASH工艺的,如STC12C5A60S2单片机内部就自带高达60K...

关键字: stc12c5a60s2 51单片机 C KEIL

射雕英雄传中的裘千丈说,UART就是我的轻功水上漂过河。想从河上过(通信),提前布暗桩,行走时步伐按桩距固定(波特率提前确定),步幅太大或太小都会落水。为了不被二弟裘千仞识破,可以安排侍卫在对岸监视通知,没风险才开始表演...

关键字: uart 通信技术

射雕英雄传中的裘千丈说,UART就是我的轻功水上漂过河。想从河上过(通信),提前布暗桩,行走时步伐按桩距固定(波特率提前确定),步幅太大或太小都会落水。为了不被二弟裘千仞识破,可以安排侍卫在对岸监视通知,没风险才开始表演...

关键字: uart 通信技术

射雕英雄传中的裘千丈说,UART就是我的轻功水上漂过河。想从河上过(通信),提前布暗桩,行走时步伐按桩距固定(波特率提前确定),步幅太大或太小都会落水。为了不被二弟裘千仞识破,可以安排侍卫在对岸监视通知,没风险才开始表演...

关键字: uart 通信技术

还记得当年的打印机,鼠标和调制解调器吗?他们都有巨大笨重的连接器和粗电缆,并且必须拧到你的电脑上。这些设备正是使用UART协议与计算机进行通信。虽然USB几乎完全取代了旧的电缆和连接器,但UART绝对没有过时。你会发现目...

关键字: uart 通信技术

这篇基础的UART,献给刚好需要的您!

关键字: uart 嵌入式
关闭
关闭