单片机
返回首页

8051/2单片机常用的本地通讯方式 UART,RS485,I2C,SPI 之 UART串口通讯 1

2022-05-19 来源:eefocus

一 ,说明


1. 串口UART, 波特率:9600


接设备的时候,一般只接GND RX TX,不会接Vcc,避免与目标设备上的供电冲突。


1.1 RS485标准( +2V ~ +6V:1 / -6V ~ -2V:0)


1.2 RS232标准( -15V ~ -3V:1 / +3V  ~ +15V:0),需要MAX232进行电平反转后,才能与MCU进行通讯


1.3 TTL标准( 2.4V--5V:1 /  0V--0.5V:0 )


二、演示

三、代码:


/**

* 8051/2 DEMO 3

* 常用的本地通讯方式

* 1. 串口UART, 波特率:9600

* 接设备的时候,一般只接GND RX TX,不会接Vcc,避免与目标设备上的供电冲突。

* 1.1 RS485标准( +2V ~ +6V:1 / -6V ~ -2V:0)

* 1.2 RS232标准( -15V ~ -3V:1 / +3V  ~ +15V:0),需要MAX232进行电平反转后,才能与MCU进行通讯

* 1.3 TTL标准( 2.4V--5V:1 /  0V--0.5V:0 )

* 2. I2C(SCL,SDA)

* 3. SPI (SCLK,SDO,SDI) 全双工

*/

 

#include 'REG52.H'

#include

 

typedef unsigned char U8;

 

/** 

 * PART 1 串口通讯 

 * RXD 和 TXD 

 * IO口:P3^0 和 P3^1  

 **/

 

 

//串口初始化

void uart_init()

   SCON = 0x50;

   TMOD = 0x20; //选择 定时器1

   //装在波特率 高8位和低8位,9600

   TH1 = 0xFD;

   TL1 = 0xFD;

   ES = 1; //打开串口中断

   TR1 = 1; //打开定时器1

   EA = 1; //打开总中断

}

 

//接收单个字符

U8 uart_get_char()

{

   U8 rx_data = 0;

   while(0==RI); //0 串口没有数据

   //如果是1

   rx_data = SBUF;

   RI=0;

   return rx_data;

}

 

//发送一个字符

void uart_send_char(char str)

{

   SBUF = str; //将待发送的字符串放入缓冲器

   while(TI==0); //等待完发送

   TI=0;       // 发送中断标志 清0

}

 

//发送字符串

void uart_send_string(U8 *buffer)

{

   U8 *plter = buffer;

   while((*plter)!=0x00){

      uart_send_char(*plter);

      plter++;

   }

}

 

//发送16进制数组, arr 数组,len 发送长度

void uart_send_bytes(U8 *arr,U8 len)

{

   U8 i;

   for(i=0;i      U8 one = arr[i];

      uart_send_char(one);

   }

}

 

//串口中断业务处理 

void uart_handle() interrupt 4

{

   //业务处理,字符和并到数组

   U8 rx_datas[6]; //需要比正常定义的数组大1

   U8 i=0;

   for(i=0;i<5;i++){

      U8 rx_data = uart_get_char();

      rx_datas[i] = rx_data;

   }

 

   //判断是否为 hello , 则返回  hello word

   if (strcmp(rx_datas, 'hello')==0)

   {

      uart_send_string('hello word rn');

   }

   //判断输入的是否为 ilove, 则返回  i love you

   if(strcmp(rx_datas,'ilove')==0)

   {

      uart_send_string('i love you rn');

   }

   //16HEX判断 ,03 02 01 01 01 , 则返回 A1 A2 A3 A4 A5 A6

   if(

      rx_datas[0]==0x03 && rx_datas[1]==0x02 && rx_datas[2]==0x01 && 

      rx_datas[3]==0x01 && rx_datas[4]==0x01

   )

   {

      U8 code hexdata[] = {0xA1,0xA2,0xA3,0xA4,0xA5,0xA6};

      uart_send_bytes(hexdata,6);

   } 

}

 

void main()

{

    uart_init();

 

    while (1){

 

    }

}

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 简洁的过零调功器电路设计与分析

  • 开关电源的基本组成及工作原理

  • 比较常见的功率整流器和滤波电路

  • 基于M66T旋律发​​生器的电路图解析

  • 一个简单的红外耳机电路

  • 基于CA3193的热电偶放大器电路

    相关电子头条文章