1.通信有串行通信和并行通信
并行通信通常是把数据字节的各位用多条数据线同时传送,控制简单,传输速度快,传输线较多。
串行通信是指,使用一条数据线将数据一位一位地依次传输,传输线少,长距离传送时成本低。
RXD(Received Data)接收数据
TXD(Transmit Data)发送数据
2.各个寄存器
TCON 定时器/计数器中断控制寄存器 (可位寻址)
7 | TF1 | 定时器/计数器T1溢出标志 |
6 | TR1 | 定时器T1的运行控制位 |
5 | TF0 | 定时器/计数器T0溢出中断标志 |
4 | TR0 | 定时器T0的运行控制位 |
3 | IE1 | 外部中断1请求源(INT1/P3.3)标志 |
2 | IT1 | 外部中断1触发方式 IT1=0时低电平触发,IT=1时下降沿触发 |
1 | IE0 | 外部中断0请求源(INT0/P3.2)标志 |
0 | IT0 | 外部中断0触发方式 IT1=0时低电平触发,IT=1时下降沿触发 |
TMOD 定时器模式寄存器
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
符号 | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
对应的 | T1 | T1 | T1 | T1 | T0 | T0 | T0 | T0 |
IE 中断使能寄存器(可位寻址)
7 | EA | 总中断使能 |
6 | ||
5 | ET2 | 定时器2中断使能 |
4 | ES | 串口中断时能 |
3 | ET1 | 定时器1中断使能 |
2 | EX1 | 外部中断1使能 |
1 | ET0 | 定时器0中断使能 |
0 | EX0 | 外部中断0使能 |
SCON 串行控制寄存器
7 | SM0 | |
6 | SM1 | |
5 | SM2 | 多机通信控制位 |
4 | REN | 使能串行接 |
3 | TB8 | |
2 | RB8 | |
1 | TI | 发送中断标志位 |
0 | RI | 接收中断标志 |
串口接收发送
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选
uchar num;//数码管显示的值
//共阴数码管段选表0-9
uchar code duanxuan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
//数码管位选码
uchar code weixuan[] = {0xfe, 0xfd, 0xfb};
void UART_Init();
void display(uchar i)
{ static uchar wei;
DU=1;
P0=0x00;
DU =0;
WE = 1;//打开位选锁存器
P0 = weixuan[wei];
WE = 0;//锁存位选数据
switch(wei)
{
case 0: DU = 1; P0 = duanxuan[i/100%10]; DU = 0; break;
case 1: DU = 1; P0 = duanxuan[i/10%10]; DU = 0; break;
case 2: DU = 1; P0 = duanxuan[i%10]; DU = 0; break;
}
wei++;
if(wei == 3)
wei = 0;
}
void main()//main函数自身会循环
{
EA = 1; //打开总中断
ET0 = 1;//打开定时器0中断
TR0 = 1; //启动定时器0
TMOD |= 0X01; //定时器工作模式1,16位定时模式
TH0 = 0xED;
TL0 = 0xFF; //定时5ms
UART_Init();
while(1);
}
//串口初始化
void UART_Init()
{
EA = 1;//打开总中断
ES = 1;//打开串口中断
SM0 = 0;//串口工作方式1,8位UART波特率
SM1 = 1;
REN = 1;//允许串口接收
TR1 = 1;//启动定时器1
TMOD |= 0x20;//定时器1,工作模式1,8位自动重装
TH1 = 0xfd;
TL1 = 0xfd;//设置比特率9600
}
//定时器0中断函数
void timer0Init() interrupt 1
{
TH0 = 0xED;
TL0 = 0xFf; //定时5ms
display(num); //数码管显示函数
}
//串口中断函数
void UART() interrupt 4
{
uchar temp;
if(RI)
{
num = SBUF;//读SBUF,读出串口收到的数据
RI = 0;//软件清零接收标志位
temp = num;
SBUF = ++temp; //写入SBUF,把要发送的数据送给发送缓存器
}
if(TI)
{
TI = 0;//清零发送标志位
}
}
串口发送文字
#include <reg52.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
//毫秒级延时函数定义
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
//串口初始化
void UART_Init()
{
SM0 = 0; SM1 = 1;//串口工作方式1,8位UART波特率可变
TR1 = 1;//启动定时器1
TMOD |= 0x20;//定时器1,工作模式2 8位自动重装
TH1 = 0xfd;
TL1 = 0xfd;//设置比特率9600
}
void main()
{
UART_Init(); //串口初始化
while(1)
{
TI = 1;
puts("五音不六药");
TI = 0;
delay(1000);
}
}