一、任务简述
在CT107D单片机上,利用51单片机的串行接口与上位机建立传输信道进行数据的收发。采用8位的URAT模式,即模式一,波特率为9600BPS。数据发送采用查询方式,数据接收采用中断方式。系统上电初始化后,单片机向上位机发送两个字节:0x5a,0xa5,然后等待接收上位机的数据,接收到一个字节后,在该字节的基础上加1后返回给上位机。
二、信息介绍
串行接口是一个非常重要的外设,它是单片机与外部终端的数据传输渠道。不管是简单的51单片机,还是复杂的ARM处理器,串口通信都是必不可少的,有些芯片甚至有几个串行接口。
1、串口重要概念概述
<1> 串行通信是指数据一位接一位地顺序发送或接收。
<2> 串行通信有SPI、IIC、UART等多种,最常见最通用的是指UART。
<3> 串行通信的制式有:单工(只能接收或者发送)、半双工(可以接收和发送,但是不能同时进行)、全双工(可以同时进行接收和发送)三种。
<4> 计算机的串行通信接口是RS-232的标准接口,而单片机的UART接口则是TTL电平,两者的电气规范不一致,所以要完成两者之间的数据通信,就需要借助接口芯片在两者之间进行电平转换,常用的有MAX232芯片。
<5> 波特率:每秒钟传输的位数,9600波特率就是指每秒钟传输9600位。12M晶振或11.0592M晶振的情况下,要产生9600BPS的波特率。
注意:在51单片机中需要使用定时器1来产生波特率,因此,如果使用串口通信,则定时器1就不能做其他用途,在初始化串行接口模块的时候,除了要配置SCON寄存器之外,还有根据波特率参数设置定时器1的技术初值。
SCON:串行接口控制寄存器。如下图
设置为0x50,即0101 0000
三、参考代码
#include "reg52.h"
sfr AUXR = 0x8e;
unsigned char urdat;
void Initial_UART()
{
TMOD = 0x20; //设置定时器1的工作模式。
TH1 = 0xfd; // TH1和TL1:设置波特率参数。
TL1 = 0xfd;
TR1 = 1; //打开定时器1。
AUXR = 0x00;
SCON = 0x50; //0101 0000,选择8位的URAT工作模式,允许接收数据。
ES = 1; //打开串口中断开关。
EA = 1; //打开总中断开关。
}
void Send_Byte(unsigned char dat)
{
SBUF = dat; // SBUF:串行通信数据的发送和接收缓冲器。
while(TI == 0); //发送完后跳出。
TI = 0;
}
void Service_UART() interrupt 4
{
if(RI == 1)
{
RI = 0;
urdat = SBUF;
Send_Byte(urdat + 1);
}
}
void main()
{
Initial_UART();
Send_Byte(0x5a);
Send_Byte(0xa5);
while(1);
}
学习来源于:https://www.bilibili.com/video/BV1Bt41187hw?p=3