zoukankan      html  css  js  c++  java
  • 如何高效地使用51单片机串口输入输出

    51单片机一般使用串口的方法都是这样的

    #include<reg52.h>
    #define uint unsigned int
    void UART_Init();
    uint num ;
    /*
    ******************************************
    **函数名称:主函数
    *******************************************
    */
    int main()
    {
            UART_Init();
            while(1);
    }
    /*
    *****************************************
    **函数功能:串口初始化函数
    *****************************************
    */
    void UART_Init()
    {
         
                TMOD = 0x20; //定时器0工作模式2,自动重装8位计数器
                TH1 = 0xfd;
                TL1 = 0xfd;//定时器溢出时,会自动将高8位中的值赋值给低8位.比特率9600
                TR1 = 1;
                SM0 = 0;
                SM1 = 1;
                REN = 1;
                EA = 1;
                ES = 1;
    }
    /*
    ********************************************
    **函数名称:串口中断函数
    ********************************************
    */
    void UART() interrupt 4
    {
        if(RI == 1)        //如果接收到计算机发的数据
            {
                num = SBUF;  //取出数据
                num++;       
                RI = 0;       //清除标志位
                SBUF = num;  //把数据加1后再发送给计算机
            }
            if(TI == 1)    //如果发送完毕
            {
                TI = 0;       //清除标志位
            }
    }
    

    可以看到这样的代码非常麻烦而且不容易维护,有时候为了串口需要在逻辑代码里面添加一些串口控制,非常麻烦,而已小白看着也头疼,那如何高效地使用串口呢。我们可以使用printf和scanf。printf这个不用多说,但是scanf这个东西需要说一下,就是当串口输入空格回车换行的时候就结束了,在单片机串口通讯的过程中肯定有空格,比如接收一些AT指令,但不过这个scanf在单片机上运行的不是很顺利,我就改用getchar()了。

    #include	"stc15fxxxx.h"
    #include <stdio.h>
    #include <string.h>
    
    char xdata readData[300];
    
    /*
    ******************************************
    **    串口初始化
    *******************************************
    */
    void UartInit(void)                 //11.0592MHz
    {
            SCON = 0x50;                //8位数据,可变波特率
            AUXR |= 0x01;               //串口1选择定时器2为波特率发生器
            AUXR |= 0x04;               //定时器2时钟为Fosc,即1T
    				
    	    //9600
    		//T2L = 0xE0;		        //设定定时初值
    		//T2H = 0xFE;		        //设定定时初值
    	
    		//115200
    		T2L = 0xE8;					//设定定时初值
    		T2H = 0xFF;					//设定定时初值
            AUXR |= 0x10;               //启动定时器2
    }
    /*
    ******************************************
    **    读取串口字符串
    *******************************************
    */
    void ReadString(){
    		int i = 0;
    		char ch;
    		while((ch = getchar()) != '
    '){
    			readData[i] = ch;
    			i++;
    		}
    }
    /*
    ******************************************
    **    主函数
    *******************************************
    */
    void main()
    {
            UartInit();//串口初始化
            EA=1; //打开总中断
            ES=1; //串口1中断
            TI=1;
    	
    		while(1){
                
                readString();
    			printf("%s
    ",readData);
    
            }
    }
  • 相关阅读:
    php 观察者模式
    php 策略模式
    php 适配器模式
    php 单例模式
    程序员应该关注的行业网站
    Mysql 5.7 索引使用规则和设计优化
    Docker官方镜像源或阿里云镜像源加速解决pull过慢的问题
    MySQL 优化案例
    mysql优化count(*)查询语句
    Mysql超大分页优化处理
  • 原文地址:https://www.cnblogs.com/kawayidamiao/p/13843770.html
Copyright © 2011-2022 走看看