51单片机必会驱动

51单片机必会驱动


  • 51单片机必会驱动
    • 数码管驱动
      • 动态扫描显示
      • 静态显示
    • 串口驱动
      • 相关原理
      • 代码
    • PCF8951 ADDA驱动
      • ADC
      • DAC
    • 矩阵键盘驱动
      • 相关原理
      • 代码
    • AT24C02存储模块驱动
    • DS1302S时钟驱动
    • 1602液晶驱动
    • 18B20温度模块驱动

数码管驱动

动态扫描显示

#include 
typedef unsigned char u8;
typedef unsigned int u16;

sbit LSA = P2^2;//三八译码器输入端,位选
sbit LSB = P2^3;
sbit LSC = P2^4;

u8 code smgduan[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管段码

void delay(u16 i)
{
    while(i--);
}

void digDisplay()
{
    u8 i;
    for(i=0;i<8;i++)
    {
        switch (i)
        {
            case 0:
                LSA = 0;LSB = 0;LSC = 0;break;
            case 1:
                LSA = 1;LSB = 0;LSC = 0;break;
            case 2:
                LSA = 0;LSB = 1;LSC = 0;break;
            case 3:
                LSA = 1;LSB = 1;LSC = 0;break;
            case 4:
                LSA = 0;LSB = 0;LSC = 1;break;
            case 5:
                LSA = 1;LSB = 0;LSC = 1;break;
            case 6:
                LSA = 0;LSB = 1;LSC = 1;break;
            case 7:
                LSA = 1;LSB = 1;LSC = 1;break;
        }
            P0 = smgduan[7-i];
            delay(100);
            P0 = 0x00;//消隐
    }
}

void main()
{
    while(1)
    {
        digDisplay();
    }
}

静态显示

这里写代码片

串口驱动

相关原理

  1. 串行通信分类
    异步通信:异步通信是以字符(构成的帧)为单位进行传输,字符之间时间间隔任意
    同步通信:同步通信时要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。传输数据的位之间的距离均为“位间隔”的整数倍 ,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系。可通过外同步和自同步实现。
  2. 传输方向:单工、半双工(分时双向通信)、全双工。
  3. 传输速率:比特率。即每秒钟传输二进制代码的位数
  4. 串行通信接口标准:
    a) RS-232C接口
    有25针和9针接口
    特点: (1)传输距离短,传输速率低 (2) 有电平偏移 (3)抗干扰能力差
    b) RS-422A接口(全双工)
    RS-422A输出驱动器为双端平衡驱动器,差分电路避免或大大减弱地线干扰和电磁干扰的影响,RS-422A传输速率(90Kbps)时,传输距离可达1200米。
    c) RS-485接口(半双工)
    RS-485是RS-422A的变型,需要两根传输线,抗干扰性极好,传输距离可达1200米,传输速率可达1Mbps。
  5. 串口控制寄存器SCON
    SCON 是一个特殊功能寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志:
    这里写图片描述
    SM0、SM1:工作方式选择位,有四种方式可选
    51单片机必会驱动_第1张图片
    SM2:多机通信控制位,主要用于方式2和方式3。
if(SM2==1)
{
    if(RB8==0)
        不激活RI,丢弃收到的信息;
    else
        收到的数据进入SBUF,激活RI;
}else
{
    无视RB8,数据进入SBUF,激活RI;
}
在方式0时,SM2必须是0。在方式1时,如果SM2=1,则只有接收到有效停止位时,RI才置1。
REN:允许串行接受位
TB8:在方式2或方式3中,是发送数据的第九位
RB8:在方式2或方式3中,是接收数据的第九位
TI:发送中断标志位
RI:接收中断标志位

6. 功率控制寄存器PCON
这里写图片描述
SMOD:波特率倍增位,为1时波特率提高一位
7. 80C51串行口工作方式
a) 方式0
这种工作方式比较特殊,与常见的微型计算机的串行口不同,它又叫同步移位寄存器输出方式。在这种方式下,数据从 RXD 端串行输出或输入,同步信号从 TXD 端输出,波特率固定不变,为振荡率的 1/12 。该方式是以 8 位数据为一帧,没有起始位和停止位,先发送或接收最低位。
b) 方式1
方式1是10位数据的异步通信口。TXD为数据发送引脚,RXD为数据接收引脚。其中1位起始位,8位数据位,1位停止位。
用软件置REN为1时,接收器以所选择波特率的16倍速率采样RXD引脚电平,检测到RXD引脚输入电平发生负跳变时,则说明起始位有效,将其移入输入移位寄存器,并开始接收这一帧信息的其余位。接收过程中,数据从输入移位寄存器右边移入,起始位移至输入移位寄存器最左边时,控制电路进行最后一次移位。
当RI=0,且SM2=0(或接收到的停止位为1)时,将接收到的9位数据的前8位数据装入接收SBUF,第9位(停止位)进入RB8,并置RI=1,向CPU请求中断。
c) 方式2和方式3
方式2和方式3时起始位1位,数据9位(含1位附加的第9位,发送时为SCON中的TB8,接收时为RB8),停止位1位,一帧数据为11位。方式2的波特率固定为晶振频率的1/64或1/32,可由 PCON 的最高位选择。方式3的波特率由定时器T1的溢出率决定。
采用这种方式可接收或发送 11 位数据,以 11 位为一帧,比方式 1 增加了一个数据位,其余相同。第 9 个数据即 D8 位具有特别的用途,可以通过软件控制它,再加特殊功能寄存器 SCON 中的 SM2 位的配合,可使 MCS-51 单片机串行口适用于多机通信。方式 2 的波特率固定,只有两种选择,为振荡率的 1/64 或 1/32 ,

SM0 SM1 方式 功 能 说 明
0 0 0 同步移位寄存器方式(用于扩展I/O口)
0 1 1 8位异步收发,波特率可变(由定时器控制)
1 0 2 9位异步收发,波特率为fosc/64或fosc/32
1 1 3 9位异步收发,波特率可变(由定时器控制)
8. 波特率的计算
方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率来决定。四种工作方式共有三种波特率。
方式0的波特率 = fosc/12
方式2的波特率 =(2^(SMOD)/64)· fosc
方式1的波特率 =(2^(SMOD)/32)·(T1溢出率)
方式3的波特率 =(2^(SMOD)/32)·(T1溢出率)
T1 溢出率 = fosc /{12×[256-TH1)]}
51单片机必会驱动_第2张图片
9. 串口使用方法
配置产生波特率的定时器1、串行口控制和中断控制的参数
a) 确定T1的工作方式(编程TMOD寄存器);
b) 计算T1的初值,装载TH1、TL1;
c) 启动T1(编程TCON中的TR1位);
d) 确定串行口控制(编程SCON寄存器);
串行口在中断方式工作时,要进行中断设置(编程IE、
IP寄存器)。

代码

#include 

typedef unsigned char u8;
typedef unsigned int u16;

void UsartInit()/*完成串口初始化工作*/
{
    TMOD = 0x20;//T1的M1M0:10 选择方式2 8位自动重装定时器 C/~T 位为0 是定时器
    TH1 = 0xF3;//因为是8位 所以TH和TL一样 波特率4800 SMOD:1 计算之后的初值
    TL1 = 0xF3;
    PCON = 0x80;//最高位为1 波特率翻倍
    TR1 = 1;//运行定时器T1
    SCON = 0x50;//串口控制寄存器 SM0SM1:01 采用方式1(10位异步收发器 8位数据)REN:1 允许串口接收
    ES = 1;//串口中断开
    EA = 1;//总中断开
}

void main()
{
    UsartInit();
    while(1);
}

void Usart() interrupt 4
{
    u8 receiveData;
    receiveData = SBUF;//从数据缓冲区SBUF中读取数据至receiveData变量中
    RI = 0;//接收中断标志位 置0以接收下组数据
    SBUF = receiveData ;//给SBUF赋值 意在向串口发送数据
    while(!TI);//判断是否发送完成 若完成会被置1 向CPU请求中断
    TI = 0;//发送中断标志位 置0以发送下组数据
}

PCF8951 AD/DA驱动

ADC

DAC

矩阵键盘驱动

相关原理

代码

AT24C02存储模块驱动

DS1302S时钟驱动

1602液晶驱动

18B20温度模块驱动

你可能感兴趣的:(单片机学习-51)