• 51单片机的hello world之点灯



    前言

    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
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    当我们使用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
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    二、延时函数

    延时函数其实很简单只需要会使用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();
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    是不是很简单?然后继续学习新的知识吧

    这里学会了延时函数,我想继续给大家讲一个小知识就是消抖,原因很简单,就是你按下按键的时候,单片机它并不稳定,会有上下起伏最后达到目的,所以给一个延时函数,就可以把这一段不稳定的阶段给延时过去,增加稳定性

    方法也很简单这里给一段代码:

    #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);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    三、独立按键

    这里学习方法和上面点亮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;
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    演示视频:

    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)
    	{
    	
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    中断函数关键字: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)
    	{
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    总结

    本节我们主要学习了STC8G单片机的点灯 延时函数 独立按键 中断配置 以及 捕获中断和外部中断的方法,其实这些都不是很难,主要还是要学会读懂使用手册,会使用手册才能配置好寄存器,才能把这些知识给学会理解。
    我现在就是有些感触就是,多看几遍,多写一篇博客,多一遍理解就多一些收获。

  • 相关阅读:
    算法岗面经:2023届腾讯算法岗暑期实习一面面经
    Win10/Win11下部署Django项目到Apache2.4的方法
    数据同步工具—Sqoop
    考研数据结构大题整合_组二(TJP组)
    MindSpore:本地编译无法找到python
    【ARM Coresight 系列文章19 -- Performance Monitoring Unit(性能监测单元)
    Docker安装Nacos-Server(单机模式)
    SpringMVC转发和重定向
    PCL 点云转深度图像
    storage和正则表达式
  • 原文地址:https://blog.csdn.net/congfen214/article/details/134009980