常用的通信接口:
UART(串口) TXD,RXD 全双工,异步 点对点通信
IIC SCL,SDA 半双工,同步 可挂载多个设备
SPI SCLK,MOSI,MISO,CS 全双工,同步 可挂载多个设备
全双工:通信双方可以在同一时刻互相传输数据 (类似TX RX两条数据线)
半双工:通信双方可以互相传输数据,但必须分时复用一根数据线
单工:通信只能有一方发送到另一方,不能反向传输
异步:通信双方各自约定通信速率
同步:通信双方靠一根时钟线来约定通信速率
在这次实验中用到的是UART串口通信,先看芯片手册了解到89C52只有1个UART,四种工作模式
串口工作原理(模式1): RXD接受数据,通过移位寄存器,在SBUF缓存寄存器中读取,TH1,TL1配置定时器算波特率,TI,RI为发送,接收标志位 请求中断,响应后必须要软件复位
利用芯片手册进行配置串口寄存器
Uart.c
#include "Uart.h"
#include <REGX52.H>
#include "Delay.h"
void Uart_Init()
{
SCON=0x50;
PCON |= 0x80;
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xF3; //设定定时初值
TH1 = 0xF3; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA=1; //开启中断
ES=1;
}
void Uart_SendByte(unsigned char Byte)//发送数据
{
SBUF=Byte;// 将byte值写入SBUF
while(TI==0); //判断TI发送标志位是否为0 为0则要置1
TI=0;
}
main.c
#include <REGX52.H>
#include "Uart.h"
#include "Delay.h"
unsigned char sec;
void main()
{
Uart_Init();//初始化
while(1)
{
}
}
void Uart_Routine() interrupt 4 // UART中断
{
if(RI==1) //如果接收标志位为1,接收到了数据
{
P2=~SBUF; //读取数据,取反后输出到LED
Uart_SendByte(SBUF); //将受到的数据发回串口 单片机向电脑发生数据
RI=0; //接收标志位清0
}
}
另外波特率计算
以本次为例,TL1,THL=0XF3 F3=243
256-243=13us 每记13次数溢出一次
1/13=0.0769230769230769MHz;
0.0769230769230769/16=0.0048076923076923MHz=4,807.692307692308HZ约等于4800