先上代码!!!
#include <STC8h.H>
sbit Key = P3^4;
sbit Led14 = P6^4;
sbit Led17 = P6^7;
void Delay10ms() //@24.000MHz
{
unsigned char data i, j, k;
i = 2;
j = 56;
k = 172;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
P4 = 0;
Led14 = 1;
Led17 = 1;
while(1)
{
if(Key == 0)
{
Delay10ms();
if(Key == 1)
{
Delay10ms();
Led14 ^= 1;
Led17 ^= 1;
}
}
}
}
代码解释:
#include <STC8h.H>
这里引用的是8h8k的头文件
在代码中直接右键可以看到添加<stc8.h>的头文件,但是这里需要注意,如果我们直接点击生成的是#include <STC8.H>头文件,这个头文件在Keil编译中会报错找不到对应的头文件,我们需要的是在STC8后边加上一个H,这样Keil在编译中就不会找不到头文件而报错了
sbit Key = P3^4;
sbit Led14 = P6^4;
sbit Led17 = P6^7;
sbit
是一个关键字或指令,用于声明一个位(bit)变量。它通常用于嵌入式系统或微控制器编程中,用于控制硬件寄存器的某个特定位。在这里,我们使用 sbit
来声明一个位变量并设置其值
第一行意思:将P3端口的第4位声明为Key变量,并将其设置为1,P3^4就是控制的SW21按键
第二行意思:将P6端口的第4位声明为Led14变量,并将其设置为1,P6^4控制的就是LED14
第三行意思:将P6端口的第7位声明为Led17变量,并将其设置为1,P6^7控制的就是LED17
当然我们在这里点亮的是LED14和LED17
void Delay10ms() //@24.000MHz
{
unsigned char data i, j, k;
i = 2;
j = 56;
k = 172;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
这一段很简单,是STC烧录软件直接生成的,我们需要注意的是系统所对应的频率,我们这里使用的是24.000MHz。以及我们在选择8051指令集时要选择对应型号的STC-Y6。
至于我们为什么使用延时10ms,是因为在按键按下时会产生一段的抖动,如果我们不延时一段时间去消除这段时间产生的抖动的话,按键信号就会产生不稳定和误触发,当按键被按下或释放时,由于机械弹性和电气噪声等原因,会产生一系列的快速开闭动作,这些抖动可能会导致按键被误识别为多次按下或释放,从而引发错误的操作。我们一般都是用软件消抖,就是在编程时延时一段时间,来避免抖动,软件消抖的优点是不增加额外硬件成本,灵活性高,但可能会占用一定的CPU资源。
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
主函数中这段代码,是将P2口配置成准双向口,设置单片机(MCU)的端口模式寄存器。每个端口都有两个模式寄存器,P0M0、P1M0等表示端口0的模式寄存器0,P0M1、P1M1等表示端口0的模式寄存器1。这些寄存器的值被设置为0x00,意味着将端口的所有引脚配置为默认输入模式。
主要目的是初始化单片机的端口模式,将所有端口的引脚都设置为默认输入模式。这样可以防止在系统启动时,由于端口引脚的随机状态导致的意外行为。同时,这也是为了后续对端口进行特定操作(如输入、输出或特殊功能)做准备。
当然这段代码也不需要我们自己来写,STC烧录软件中的I/O口配置工具已经为我们配置好了,只需要将你的选择输入进去即可。
P4 = 0;
Led14 = 1;
Led17 = 1;
第一句话,将端口P4的所有引脚设置为逻辑低电平(0),在电路中,P4口接到了三极管是控制其开合的引脚,我们将它配置为低电平电路导通
第二句话,将变量Led14
的值设置为1,Led14控制LED14引脚
第三句话,将变量Led17
的值设置为1,Led17控制LED17引脚
我们可以看到LED正极接到了VCC上此时就代表着正极接入了高电平,只有负极产生低电平时才会导通使LED发光,我们先将Led14和Led17的值设置为1,代表着先将LED熄灭
while(1)
{
if(Key == 0)
{
Delay10ms();
if(Key == 1)
{
Delay10ms();
Led14 ^= 1;
Led17 ^= 1;
}
}
}
主函数中while(1)是死循环,有单片机基础的同学都知道,while(1)是主函数中必不可少的循环用来执行主程序。
代码首先检查按键(Key
)是否被按下(Key == 0
)。如果按键被按下,它会延迟10毫秒(Delay10ms()
)(延时的作用在于消抖),然后再次检查按键的状态。如果按键仍然被按下(Key == 1
),则再次延迟10毫秒。
Led14 ^= 1;:这行代码使用异或运算符(^)来切换Led14的值。如果Led14当前为0,它将变为1;如果Led14当前为1,它将变为0。这相当于切换了与Led14相关联的LED灯的状态。
Led17 ^= 1;:这行代码的作用与上一行类似,只是它切换了与Led17相关联的LED灯的状态。
这段代码的目的是在按键被按下时,交替地打开和关闭与Led14
和Led17
相关联的LED灯。