一、UART:通用的异步收发器,串行(全双工、串口、异步通信)
二、通信方式:
1、单工:事先确定发送方和接收方,两个主机之间通过一根数据线进行传输,数据在传输时方向具有单一性
2、半双工:两个主机之间通过一根数据线传输,通信的主机可作为发射方也可以作为接收方,数据的传输方向是双向的,(同一时刻数据的传输方向单向)
3、全双工:两根数据线进行传输,传输方向是双向的
三、主机和从机的区别
1、主机:拥有绝对的控制权,主机想何时发起通信就可以通信,给从机下发指令
2、从机:无法发起通信,完成主机下发的指令,并将结果上交给主机
四、UART数据传输的顺序
串口通信中,遵行LSB(低位)传输
五、串行与并行
1、串行:通信传输数据时,通过一根线实现,需要按照一个bit的次序先后传输(资源消耗小,传输速度慢)
2、并行:多个bit再多根数据线进行传输(资源消耗大,传输速度快)
六、串口通信时序
起始位+数据位(8bit)+校验位+停止位
注:奇校验:总1的个数保持在奇数个
偶校验:总1的个数保持在偶数个
七、波特率
每秒传输的bit数量
八、同步和异步
串口通信通过波特率实现同步
12C通过时钟线实现同步
TTL、RS232、RS5485电器属性:
1)TTL:TTL电平 ->高电平:5v 低电平:0v
2)RS232:负逻辑 高电平:-3 -15v 低电平:3-15v
3)RS485:差分信号 高电平:7-12v 低电平:-1 -15v
九、UART相关寄存器配置
1、SCON:串口控制寄存器
1)将SCON寄存器中的bit6和bit7清零
2)将SCON寄存器bit6置一,代表串口工作在方式一
3)将SCON寄存器bit4置一,允许串口接收数据
4)T1,R1需要配置
2、PCON:电源控制寄存器
1)将PCON中bit6清零,代表通过SCON中的bit7和bit6指定串口工作模式
2)将PCON中bit7置一,代表波特率翻倍
3、TCON、TMOD:定时器模式选择、定时器控制寄存器
1)将TMOD高4位清零
2)将TMOD中的bit5置一,代表在8位自动重装模式
3)为定时器赋初值,(TL,TH)公式:2^8 - 2^mod*focs/32/bps/12
4)将TCON中的bit6置一,代表计数器开始计数
#include "uart.h"
#include"delay.h"
#include"led.h"
#include"digiter.h"
#include"timer.h"
#include<stdio.h>
#include <string.h>
#include<string.h>
int parse(void)
{
int i = 0;
unsigned char sum = 0;
int ret = 0;
if((unsigned char)recv_buffer[0] == 0xaa && (unsigned char)recv_buffer[6] == 0xbb)
{
if((unsigned char)recv_buffer[1] == 0x01)
{
for(i;i < 5;i++)
{
sum += (unsigned char)recv_buffer[i];
}
if(sum == (unsigned char)recv_buffer[5])
{
ret = recv_buffer[2];
}
}
}
return ret;
}
//xdata char tmp[32] = {0};
void do_handler(unsigned int n)
{
unsigned int num = 0;
switch(n)
{
case 1:
led_init();
led_show(recv_buffer[4]);
break;
case 2:
digiter_show(recv_buffer[4]);
break;
case 3:
Timer0_Init();
break;
default:
break;
}
}
void callback(void)
{
xdata char send_buffer[32] = {0};
int i = 0;
unsigned char sum = 0;
memcpy(send_buffer,recv_buffer,7);
send_buffer[2] |= (1 << 7);
if((unsigned char)recv_buffer[0] == 0xaa && (unsigned char)recv_buffer[6] == 0xbb)
{
if((unsigned char)recv_buffer[1] == 0x01)
{
for(i;i < 5;i++)
{
sum += send_buffer[i];
}
send_buffer[5] = sum;
}
}
uart_sendbuffer(send_buffer,7);
}
int main()
{
int ret = 0;
xdata char buf[32] = {0};
uart_init();
while(1)
{
// digiter_show(1);
if(pos != 0)
{
delay(0xafff);
ret = parse();
do_handler(ret);
if(ret != 0)
{
callback();
}
pos = 0;
}
}
return 0;
}