目录

  • 1 单片机概述
    • 1.1 单片机概述
  • 2 单片机预备知识
    • 2.1 keil4使用教程
    • 2.2 利用Proteus和keil仿真51单片机流水灯
    • 2.3 PROTEUS中文手册
    • 2.4 芯片手册
    • 2.5 KEIL及PROTEUS软件下载
    • 2.6 单片机预备知识
  • 3 单片机结构与原理
    • 3.1 单片机最小系统
    • 3.2 使用Altium Designer绘制单片机最小电路原理图
    • 3.3 电源、晶振和复位电路
    • 3.4 单片机上下拉电阻
    • 3.5 单片机结构与原理
  • 4 C51语言
    • 4.1 4.1二进制、十进制和十六进制
    • 4.2 4.2 C 语言变量类型和范围
    • 4.3 4.3 C 语言基本运算符
    • 4.4 4.4 C 语言 for 循环语句
    • 4.5 4.5 C 语言 while 循环语句
    • 4.6 4.6 C 语言函数的简单介绍
    • 4.7 4.7 单片机延时方法(Keil 软件延时)
    • 4.8 C51语言
  • 5 LED灯实例
    • 5.1 工程仿真实例
    • 5.2 单片机 LED 灯闪烁程序
    • 5.3 单片机 LED 流水灯程序
    • 5.4 LED灯实例
    • 5.5 独立按键控制LED灯
  • 6 数码管/键盘实例
    • 6.1 单片机按键介绍
    • 6.2 单片机按键消抖程序
    • 6.3 单片机矩阵按键的扫描
    • 6.4 键 盘
    • 6.5 点亮数码管
    • 6.6 数码管的显示原理
    • 6.7 数码管实例
  • 7 中断系统
    • 7.1 51单片机中断详解(上)
    • 7.2 51单片机中断详解(中)
    • 7.3 51单片机中断详解(下)
    • 7.4 INT0中断计数实例
    • 7.5 中断系统
  • 8 定时/计数器
    • 8.1 51单片机定时计数器
    • 8.2 TIME0控制LED闪烁
    • 8.3 定时器 计数器
    • 8.4 实例一
    • 8.5 实例二
    • 8.6 实验-用计数器/中断实现 100 以内的按键计数
  • 9 串行通信
    • 9.1 51单片机串口通信
    • 9.2 单片机之间双向通信
    • 9.3 串行通信
  • 10 LCD1602实例
    • 10.1 1602液晶
    • 10.2 1602实验
  • 11 IIC总线技术
    • 11.1 51单片机IIC
    • 11.2 IIC总线实例
    • 11.3 I2C串行总线
  • 12 A/D&D/A转换
    • 12.1 单片机AD和DA
    • 12.2 ADC0808模数转换实例
    • 12.3 DAC0832数模转换实例
    • 12.4 D A 与 A D转换器
51单片机串口通信

一.串口相关寄存器详解


1.串行口控制寄存器(SCON)


SM0和SM1为工作方式选择位,可选择四种工作方式:


SM2:多机通信控制位。主要用于方式2和方式3
REN:允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。
TB8,在方式2或方式3中,是发送数据的第九位
RB8,在方式2或方式3中,是接收到数据的第九位
RI:串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI。注意,RI必须由软件清除。
TI:串行口发送中断标志位。当CPU将一个发送数据写入串行口发送缓冲器时,就启动了发送过程。每发送完一个串行帧,由硬件置位TI。CPU响应中断时,不能自动清除TI,TI必须由软件清除。

2.功率控制寄存器(PCON)

该寄存器只有一位SMOD与串行口工作有关
SMOD(PCON.7)波特率倍增位。在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。

3.工作方式寄存器(TMOD)


工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。


串口是采用定时器1工作在8位自动重装定时/计数模式,即工作方式2,TMOD=0x20。

4.时钟控制寄存器(TCON)

该寄存器只有第六位与串口有关,用于开启定时器1。
TR1:T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。

二.8051的串行口结构


有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H ;接收器是双缓冲结构 ;发送缓冲器,因为发送时CPU是主动的,不会生重叠错误。

三.波特率的计算

通过软件可对单片机串行口编程为四种工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率来决定。

串行口的四种工作方式对应三种波特率。由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。
方式0的波特率 = fosc/12
方式2的波特率 =(2· SMOD/64)· fosc
方式1的波特率 =(2· SMOD/32)·T1溢出率)
方式3的波特率 =(2· SMOD/32)·T1溢出率)

对于方式1的定时器初值计算:
T1溢出率= fosc/(12·(28-X))
波特率=(2·SMOD/32)fosc/(12·(28-X))
其中X为定时器的初始值

四.程序实现

1.初始化

串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制和中断控制。具体步骤如下:
(1)确定T1的工作方式(编程TMOD寄存器);
(2)计算T1的初值,装载TH1、TL1;
(3)启动T1(编程TCON中的TR1位);
(4)确定串行口控制(编程SCON寄存器);
(5)如果串行口在中断方式工作,还要进行中断设置(编程IE、IP寄存器)。

假如我们使用的是12Mhz的晶振,然后设置波特率为4800:

void Usart_init()
{
   SCON=0x50;  //选择工作方式1,允许串行口接收数据  
   TMOD=0x20;  //选择8位自动重装定时器
   PCON=0x80;  //波特率增倍
   TH1=0xF3;   //晶振频率12MHZ,SMOD=1
   TL1=0xF3;   //波特率为4800时定时器的初值
   TR1=1;      //开定时器
}123456789

2.接收与发送

我们通过电脑上的串口调试助手发送一个十六进制的数给单片机,然后单片机又把接收到的这个数发回给电脑,实现电脑与单片机的互相通信。

void main()
{
       unsigned char tmp=0;
       Usart_Init();
       init_lcd1602();
       while(1)
       {
            /*单片机接收数据*/
            while(!RI); //等待接收数据完成
            tmp=SBUF;   //获取接受数据
            RI=0;       //清除接收标志位
            /*单片机发送数据*/
            SBUF=tmp;   //将数据写入发送缓冲区中
            while(!TI);  //等待发送完毕
            TI=0;        //清除发送标志位
       }
}