文章目录
- 前言
- 一、基础定义和点灯
- 二、延时函数
- 三、独立按键
- 三、中断的配置和使用
- 外部中断法
- 捕获中断
- 总结
前言
hello 大家好这里是夏目学长的51单片机课堂,本篇博客是夏目学长观看B站up主学电超人的视频所写的一篇51单片机入门博客之51单片机点灯以及 独立按键 中断电灯关灯 以及比较难的 捕获中断 ,我自己在学习这节课程的时候觉得这节课非常适合学完B站up主江科大视频的同学,适合去进阶自己的知识,掌握的更加牢固。
本节的单片机主要是STC8G2K64S4单片机
一、基础定义和点灯
首先大家打开原理图去看51单片机的原理图 然后下面夏目学长就给大家注释好了LED灯的注释
下面就是讲解一下sbit
的意思:sbit
其实就是重新定义的意思,相当于C语言的typedef
这是我自己的理解,大家可以试着理解,但是不要信任我哈哈哈
这里举出一个电灯的例子:
我们在让红色灯亮的时候一般是用P0_5
去点灯,但是这里我用sbit
就可以用我定义好的名字去点灯
当我们不使用sbit
的时候:
#include "stc8g.h"
#include "intrins.h"
void main()
{
P0M0 = 0x00;//配置P0引脚为准双向口 --- > 这样才可以使得LED灯可以去点亮使用
P0M1 = 0x00;
while(1)
{
P0_5 = 0; //点亮红色LED
}
}
当我们使用sbit
的时候:
#include "stc8g.h"
#include "intrins.h"
sbit LED_R = P0^5;
void main()
{
P0M0 = 0x00;//配置P0引脚为准双向口 --- > 这样才可以使得LED灯可以去点亮使用
P0M1 = 0x00;
while(1)
{
LED_R = 0; //点亮红色LED
}
}
二、延时函数
延时函数其实很简单只需要会使用STC-ISP即可,他会帮助你生成你想要的延时时间,当然你也要注意我画圈圈的地方的选择,一定要看看自己的单片机是否和我一样,不然就要自己选择类型哦
为了通用性我们一般会封装一个可以延时任意时间的一个延时函数
紧接着我们就需要利用C语言函数封装 一个可以延时任意时间的函数
//粘贴STC-ISP帮助我们自动生成的代码
void Delay1ms(void) //@35MHz
{
unsigned char data i, j;
//_nop_();
//_nop_(); //无意义可以删了 除非追求极致的时间 --- > 也可以包一个头文件#include "intrins.h"
i = 46;
j = 113;
do
{
while (--j);
} while (--i);
}
//手写一个延时函数
void delay_ms(unsigned int n)
{
while(n -- )
{
Delay1ms();
}
}
是不是很简单?然后继续学习新的知识吧
这里学会了延时函数,我想继续给大家讲一个小知识就是消抖,原因很简单,就是你按下按键的时候,单片机它并不稳定,会有上下起伏最后达到目的,所以给一个延时函数,就可以把这一段不稳定的阶段给延时过去,增加稳定性
方法也很简单这里给一段代码:
#include "stc8g.h"
#include "intrins.h"
sbit LED_R = P0^5;
void Delay1ms(void) //@35MHz
{
unsigned char data i, j;
_nop_();
_nop_();
i = 46;
j = 113;
do
{
while (--j);
} while (--i);
}
//手写一个延时函数
void delay_ms(unsigned int n)
{
while(n -- )
{
Delay1ms();
}
}
void main()
{
P0M0 = 0x00;//配置P0引脚为准双向口 --- > 这样才可以使得LED灯可以去点亮使用
P0M1 = 0x00;
while(1)
{
delay_ms(25);//消抖作用
LED_R = 0; //点亮红色LED
delay_ms(300);
LED_R = 1;
delay_ms(300);
}
}
三、独立按键
这里学习方法和上面点亮LED灯一样就是先去看原理图然后确定按键位置,这里同样使用sbit
去重新定义
下面跟据这个原理图来使用一下独立按键来控制LED灯的亮灭情况。
代码如下:
#include "stc8g.h"
#include "intrins.h"
sbit LED_R = P0^5;
sbit LED_Y = P0^6;
sbit LED_G = P0^7;
sbit K3 = P3^5;
sbit K2 = P3^6;
sbit K1 = P3^7;
void Delay1ms(void) //@35MHz
{
unsigned char data i, j;
_nop_();
_nop_();
i = 46;
j = 113;
do
{
while (--j);
} while (--i);
}
//手写一个延时函数
void delay_ms(unsigned int n)
{
while(n -- )
{
Delay1ms();
}
}
void main()
{
P0M0 = 0x00; //配置P0引脚为准双向口 --- > 这样才可以使得LED灯可以去点亮使用
P0M1 = 0x00;
P3M0 = 0x00; //配置P3引脚为准双向口 --- > 这样才可以使得独立按键可以使用
P3M1 = 0x00;
while(1)
{
if(K1 == 0)
{
delay_ms(25);
while(K1 == 0);
LED_R = !LED_R;
}
if(K2 == 0)
{
delay_ms(25);
while(K2 == 0);
LED_Y = !LED_Y;
}
if(K3 == 0)
{
delay_ms(25);
while(K3 == 0);
LED_G = !LED_G;
}
}
}
演示视频:
51单片机独立按键
三、中断的配置和使用
外部中断法
中断的基础知识这里给大家贴一篇博客【51单片机】十分钟学会定时器&中断¹
此博客转载于博主:謓泽
所以这里只能让独立按键的K1 和 K2实现中断 K3咩办法实现
代码如下:
#include "stc8g.h"
#include "intrins.h"
sbit LED_R = P0^5;
sbit LED_Y = P0^6;
sbit LED_G = P0^7;
sbit K3 = P3^5;
sbit K2 = P3^6;
sbit K1 = P3^7;
void Delay1ms(void) //@35MHz
{
unsigned char data i, j;
_nop_();
_nop_();
i = 46;
j = 113;
do
{
while (--j);
} while (--i);
}
//手写一个延时函数
void delay_ms(unsigned int n)
{
while(n -- )
{
Delay1ms();
}
}
void INT2_Isr(void) interrupt 10
{
LED_R = 1;
}
void INT3_Isr(void) interrupt 11
{
LED_R = 0;
}
void main()
{
P0M0 = 0x00; //配置P0引脚为准双向口 --- > 这样才可以使得LED灯可以去点亮使用
P0M1 = 0x00;
P3M0 = 0x00; //配置P3引脚为准双向口 --- > 这样才可以使得独立按键可以使用
P3M1 = 0x00;
INTCLKO = 0x30; //打开INT2 INT3 外部中断
EA = 1; //打开总中断
while(1)
{
}
}
中断函数关键字:interrupt + 数字
数字选择哪一个需要去跟据手册的中断章节去选择。
这里烧入单片机后就可以按下K2灯亮按下K1灯灭
捕获中断
当我们有了外部中断的基础之后,就可以学习捕获中断了,这里先去看单片机的原理图
所以引脚P_SW1 第5位需要设置成为1,第六位设置成为0,但是这里要讲解一些C语言的知识,就是如果我只想第5位需要设置成为1,第六位设置成为0,那么就可以:
P_SW1 &= ~(1<<5);
P_SW1 |= (1<<4);
这种写法
所以这里跟据STC8G手册去配置这些寄存器,就可以了
#include "stc8g.h"
#include "intrins.h"
sbit LED_R = P0^5;
sbit LED_Y = P0^6;
sbit LED_G = P0^7;
sbit K3 = P3^5;
sbit K2 = P3^6;
sbit K1 = P3^7;
void PCA_Isr() interrupt 7
{
if(CCF0 == 1)
{
CCF0 = 0;
LED_G = !LED_G;
}
if(CCF1 == 1)
{
CCF1 = 0;
LED_Y = !LED_Y;
}
if(CCF2 == 1)
{
CCF2 = 0;
LED_R = !LED_R;
}
}
void main()
{
P0M0 = 0x00; //配置P0引脚为准双向口
P0M1 = 0x00;
P3M0 = 0x00; //配置P0引脚为准双向口
P3M1 = 0x00;
// INTCLKO = 0x30; //打开INT2 INT3 外部中断
// EA = 1; //打开总中断
P_SW1 &= ~(1<<5);
P_SW1 |= (1<<4);
CCON = 0x00;
CMOD = 0x08;
CCAPM0 = 0x11;
CCAPM1 = 0x11;
CCAPM2 = 0x11;
EA = 1;
while(1)
{
}
}
总结
本节我们主要学习了STC8G单片机的点灯 延时函数 独立按键 中断配置 以及 捕获中断和外部中断的方法,其实这些都不是很难,主要还是要学会读懂使用手册,会使用手册才能配置好寄存器,才能把这些知识给学会理解。
我现在就是有些感触就是,多看几遍,多写一篇博客,多一遍理解就多一些收获。