第三章 LED
LED灯左侧接入电源Vcc,通过限流电阻后分别连接至STC89C52RC芯片的P2.4~P2.7引脚。 R1~R4为限流电阻,避免LED因电流过大而损坏。 以LED1为例,当P2.4引脚为低电平时,LED两侧产生电压差,LED1点亮。反之,当P2.4引脚为高电平时,LED1熄灭。
了解相关寄存器
名称 | 字节 地址 | 位地址 | |||||||
bit[7] | bit[6] | bit[5] | bit[4] | bit[3] | bit[2] | bit[1] | bit[0] | ||
P0 | 0x80 | 0x87 | 0x86 | 0x85 | 0x84 | 0x83 | 0x82 | 0x81 | 0x80 |
P1 | 0x90 | 0x97 | 0x96 | 0x95 | 0x94 | 0x93 | 0x92 | 0x91 | 0x90 |
P2 | 0xA0 | 0xA7 | 0xA6 | 0xA5 | 0xA4 | 0xA3 | 0xA2 | 0xA1 | 0xA0 |
P3 | 0xB0 | 0xB7 | 0xB6 | 0xB5 | 0xB4 | 0xB3 | 0xB2 | 0xB1 | 0xB0 |
P4 | 0xE8 | - | - | - | - | 0xEB | 0xEA | 0xE9 | 0xE8 |
那么如何控制相关寄存器:用高电平1和低电平0来表示。
sfr P2=0xA0//定义P2地址(这些定义一般都在<reg52.h>或者其他源文件)
P2 | bit[7] | bit[6] | bit[5] | bit[4] | bit[3] | bit[2] | bit[1] | bit[0] |
LED | LED4 | LED3 | LED2 | LED1 | \ | \ | \ | \ |
取值 | 1 | 0 | 1 | 0 | 默认值(1) | 默认值(1) | 默认值(1) | 默认值(1) |
状态 | 熄灭 | 点亮 | 熄灭 | 点亮 | \ | \ | \ | \ |
P2=0xAF;//点亮LED1和3 二进制:1010 1111
but更简便的某个灯亮的表示:
sbit LED1=P2^4(在原理图可看见相应的引脚);
LED1=0;
设计程序流程:
拓展:延时函数的调用方法
参考流水灯视频:
【51核心开发板——流水灯实验】 https://www.bilibili.com/video/BV1ZC411h7Ew/?share_source=copy_web&vd_source=a85f5cd1c8dc38fdd970302da00bd865
接下来是流水灯原理与代码:
#include <STC89C5xRC.H>//也可以是<reg52.h>
void Delay1ms(unsigned int xms) //@11.0592MHz延时函数
{
while(xms--)
{
unsigned char i, j;
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void main()//主函数
{
unsigned int i;
while(1)
{
P2=0xEF;
for(i=0;i<4;i++)
{
Delay1ms(500);//停顿时间
P2=P2<<1;//流水灯,每循环一次左移一位
}
}
}
第四章 按键检测
知识点:
1.当按键未按下时,输入芯片引脚的电平为高电平; 按键按下时,输入芯片引脚上的电平为低电平
按键消抖,因此需要借助延时函数。(上一章的方法会极大占用CPU,实际开发不采用)
第五章 蜂鸣器
芯片P1.0引脚与限流电阻R19相连接。当J102相接时,R20作为上拉电阻,确保三极管在P1.0引脚不为低电平时保持截止状态。 蜂鸣器的最大工作电流为30mA,由于51单片机引脚输出电流较小,不足1mA,不能够驱动蜂鸣器工作,需要利用三极管Q5形成一个控制电路。 蜂鸣器的正极与三极管Q5的集电极(c)相连,当P1.0引脚为高电平时,三极管的基极(b)和发射极(e)均为5V,三极管Q5截止,电流无法通过蜂鸣器,此时蜂鸣器关闭; P1.0为低电平时,三极管Q5工作在饱和区,电流从发射极流向集电极并通过蜂鸣器,此时蜂鸣器工作。
第六章 数码管
七段数码管是由组成8字形状的发光二极管,加上小数点,一共8段发光二极管构成,每一段可以分别用字母a、b、c、d、e、f、g、dp表示。
介绍完后看看我们用的:
那么显示数字如何对应段码?
8位段码 (a b c d e f g dp) | 显 示 字 符 | 8位段码 (a b c d e f g dp) | 显 示 字 符 |
0000 0011(0x03) | 0 | 0000 0001(0x01) | 8 |
1001 1111(0x9F) | 1 | 0000 1001(0x09) | 9 |
0010 0101(0x25) | 2 | 0001 0001(0x11) | A |
0000 1101(0x0D) | 3 | 1100 0001(0xC1) | b |
1001 1001(0x99) | 4 | 0110 0011(0x63) | C |
0100 1001(0x49) | 5 | 1000 0101(0x85) | d |
0100 0001(0x41) | 6 | 0110 0001(0x61) | E |
0001 1111(0x1F) | 7 | 0111 0001(0x71) | F |
课后题,按下key1键,每次数码管显示加一代码参考:
#include <STC89C5xRC.H>
void Delay1ms(unsigned int xms) //@11.0592MHz
{
while(xms--)
{
unsigned char i, j;
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
sbit G1=P2^3;//根据原理图来定义
sbit G2=P2^2;
sbit G3=P2^1;
sbit G4=P2^0;
sbit KEY1=P3^2;
void main()
{
static unsigned char s_arrNumber[]={0x03,0x9f,0x25,0x0d,0x99,0x49,041,0x1f,0x01,0x09};//0~9的数码管的表示
unsigned int count=0,Count=0;
while(1)
{
if(KEY1==0)
{
Delay1ms(200);
count++;
if(count>9){count=0;Count++;}
}
P0=s_arrNumber[count];
G2=0;
Delay1ms(5);
G2=1;
P0=s_arrNumber[Count];
G1=0;
Delay1ms(5);
G1=1;
if(Count==9 && count==9)
{
count=0;
Count=0;
}
}
}