蓝桥杯单片机知识汇总

蓝桥杯知识汇总

1.数码管

  • 段码显示

    uchar code display[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xbf, 0xff};

  • 打开或关闭数码管

    P2 = (P2 & 0x1f) | 0xc0;
    P0 = order[cnt];
    P2 &= 0x1f;

    P2 = (P2 & 0x1f) | 0xe0;
    P0 = display[disbuf[cnt]];
    P2 &= 0x1f;

2.LED显示

P2 = (P2 & 0x1f) | 0x80;
P0 = 0xfe;
P2 &= 0x1f;

3.系统初始化

  • 关闭外设

    P2 = ((P2 & 0x1f) | 0xa0); //关闭全部外设
    P0 = 0x00;
    P2 &= 0x1f;

    P2 = (P2 & 0x1f) | 0xe0; //数码管都不显示
    P0 = 0xff;
    P2 &= 0x1f;

  • 定时器设置

    TMOD = 0x01; //计时器0,采用方式1
    TH0 = (65536 - 2000) / 256; //定时2ms
    TL0 = (65536 - 2000) % 256;

    EA = 1; //打开总中断
    ET0 = 1; //定时器中断0打开
    TR0 = 1; //开始计数

  • 串口通信设置

    SCON = 0x50; //工作方式1
    AUXR = 0x40; //模式为1T模式
    TMOD = 0x20; //定时器模式为2,自动重装

    TH1 = 256 - (11059200 / 2400 / 32); //波特率为2400
    TL1 = 256 - (11059200 / 2400 / 32);

    EA = 1; //打开总中断
    ES = 1; //打开串口中断
    TR1 = 1; //打开计时器1

4.IIC

define SlaveAddrW 0x90

define SlaveAddrR 0x91

define EEPROMW 0xa0

define EEPROMR 0xa1

5.DS1302

  • 命令字

    define AM(X) X

    define PM(X) (X + 12)

    define DS1302_SECOND 0x80

    define DS1302_MINUTE 0x82

    define DS1302_HOUR 0x84

    define DS1302_DAY 0x86

    define DS1302_MONTH 0x88

    define DS1302_WEEK 0x8A

    define DS1302_YEAR 0x8C

    define DS1302_RAM(X) (0xC0 + (X) * 2)

  • 函数操作

    void InitDS1302(void){
    Write_Ds1302(0x8E, 0x00);//关掉写保护
    Write_Ds1302(0x80, 0x50);//秒
    Write_Ds1302(0x82, 0x59);//分
    Write_Ds1302(0x84, 0x23);//时
    Write_Ds1302(0x8E, 0x80);//打开写保护
    }

    //转化时间格式
    void DS1302_GetTime(SYSTEMTIME *Time){
    unsigned char ReadValue;

    /* 将BCD码转换成十进制数 */
    ReadValue = Read_Ds1302(DS1302_MINUTE | 0x01);
    Time->minute = ((ReadValue & 0x70)>>4) * 10 + (ReadValue & 0x0f);

    ReadValue = Read_Ds1302(DS1302_HOUR | 0x01);
    Time->hour = ((ReadValue & 0x70)>>4) * 10 + (ReadValue & 0x0f);
    }

6.A/D

unsigned char Rb2_Read(){
unsigned char dat;

IIC_Start();
IIC_SendByte(0x90); //写入地址
IIC_WaitAck();

IIC_SendByte(0x43); //0x43是Rb2, 0x41是光敏
IIC_WaitAck();

IIC_Start();
IIC_SendByte(0x91); //读命令
IIC_WaitAck();

dat = IIC_RecByte(); //读取一个字节
IIC_Ack(0);
IIC_Stop();

return dat;
}

7.EEPROM(读取和写入数据都不可中断)

unsigned char Read_EEPROM(unsigned char con){
unsigned char dat;

IIC_Start();
IIC_SendByte(0xa0); //写入地址
IIC_WaitAck();

IIC_SendByte(con); //从起始位置开始读取
IIC_WaitAck();

IIC_Start();
IIC_SendByte(0xa1); //读命令
IIC_WaitAck();

dat = IIC_RecByte(); //读取一个字节
IIC_Ack(0);
IIC_Stop();

return dat;
}

void Write_EEPROM(unsigned char date, unsigned char con){
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();

IIC_SendByte(con);
IIC_WaitAck();

IIC_SendByte(date);
IIC_WaitAck();

IIC_Stop();
Delay(3); //写入后要注意延时一段时间
}

8.DS18B20(读取温度不可中断)

  • 延时函数

    //单总线延时函数
    void Delay_OneWire(uint t)
    {
    char z;
    while(t--)
    for(z = 0; z < 12; z++);
    }

  • 读取温度

    /* 读取数据不可中断,可以采用关闭终端来实现 */
    unsigned int Read_Temperature(){
    unsigned char low,high;
    unsigned int temp;
    float t;

    init_ds18b20(); //器件初始化
    Write_DS18B20(0xcc); //跳过读序列
    Write_DS18B20(0x44); //启动温度转换
    Delay_OneWire(200); //延迟一会儿

    init_ds18b20();
    Write_DS18B20(0xcc); //同上
    Write_DS18B20(0xbe); //读取温度

    low = Read_DS18B20(); //读取低位
    high = Read_DS18B20(); //读取高位

    temp = (high << 8) | low;
    t = temp * 0.0625;
    temp = t + 0.5;

    return temp;
    }

9.矩阵键盘

sbit r1=P3^0; //4行
sbit r2=P3^1;
sbit r3=P3^2;
sbit r4=P3^3;
//4列
sbit c1=P4^4;
sbit c2=P4^2;
sbit c3=P3^5;
sbit c4=P3^4;

//读取矩阵键盘键值
unsigned char key_scan()
{
unsigned char key_value;

r1=0;
r2=r3=r4=1;
c1=c2=c3=c4=1;
if(!c1) key_value=0;
else if(!c2) key_value=1;
else if(!c3) key_value=2;
else if(!c4) key_value=3;

r2=0;
r1=r3=r4=1;
c1=c2=c3=c4=1;
if(!c1) key_value=4;
else if(!c2) key_value=5;
else if(!c3) key_value=6;
else if(!c4) key_value=7;

r3=0;
r2=r1=r4=1;
c1=c2=c3=c4=1;
if(!c1) key_value=8;
else if(!c2) key_value=9;
else if(!c3) key_value=10;
else if(!c4) key_value=11;

r4=0;
r2=r3=r1=1;
c1=c2=c3=c4=1;
if(!c1) key_value=12;
else if(!c2) key_value=13;
else if(!c3) key_value=14;
else if(!c4) key_value=15;

return key_value;
}

10.超声波测距

define somenops {nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop();}

sbit TX = P1^0; //发射引脚
sbit RX = P1^1; //接收引脚

//TX 引脚发送 40KHz 方波信号驱动超声波发送探头
void send_wave(void) {
unsigned char i = 8; //发送 8 个脉冲

do {
TX = 1;
somenops;somenops;somenops;somenops;somenops;
somenops;somenops;somenops;somenops;somenops;
TX = 0;
somenops;somenops;somenops;somenops;somenops;
somenops;somenops;somenops;somenops;somenops;
} while(i--);
}

void Check_Distance(){
uint t;

/* 关闭定时器 0 中断:计算超声波发送到返回的时间 */
ET0 = 0;
send_wave(); //发送方波信号
ET0 = 1;

TR1 = 1; //启动计时
while((RX == 1) && (TF1 == 0)); //等待收到脉冲
TR1 = 0; //关闭计时
//发生溢出
if(TF1 == 1) {
TF1 = 0;
distance = 99; //无返回
} else {
/** 计算时间 */
t = TH1;
t <<= 8;
t |= TL1;
distance = (unsigned int)(t * 12 * 0.017 / 12); //计算距离
}

TH1 = 0;
TL1 = 0;
}

posted @ 2018-02-25 16:25  你好,果果  Views(1698)  Comments(0)    收藏  举报