2-点亮LED灯

1.前导

添加STC芯片库

因为keil5中没有对应STC89C52RC芯片的型号,在网上搜了一下发现,可以用stc-isp那个软件来添加STC芯片库

1.点击添加型号和头文件到Keil中

image-20230523234113174

2.选择安装了keil5的目录

image-20230523234212611

这样就添加完成了

3.此时,重启keil5,再创建项目时就有STC芯片库了

image-20230523234417467

创建项目步骤:

1.点击project,创建新项目

image-20230523235314564

2.选择合适的文件位置以及文件名进行保存

image-20230523235352954

3.选择对应的单片机型号即可(OK后面弹出来的那个窗口可以点否)

image-20230523235446084

4.右键点击Source Group 1,选择Add new item这个选项

image-20230523234712045

5.选择C语言文件,命名为main

image-20230523234818470

6.可以修改字体和大小(当然可以直接用ctrl+鼠标滚轮)

image-20230523235126360

2.LED介绍

  • 中文名:发光二极管

  • 外文名:Light Emitting Diode

  • 简称:LED

  • 用途:照明、广告灯、指引灯、屏幕

如何区分正负极:

长脚为正,短脚为负;内电极较小为正极,较大为负极

image-20230524000011460

image-20230524000050944

3.开发板LED介绍

电阻标号含义:102=10×10^2=1000Ω 1001=100×10^1=1000Ω

image-20230524000838200

串联电阻用来限流,因为直接接电源会烧毁LED二极管;若左边p20也为高电平,则LED不亮;若左边为低电平,则LED亮

点亮LED原理:

image-20230524004503481

4.点亮LED

视频中是用二进制最后一位来控制最右边那个LED灯的亮和灭,而新买的板子是STC89C52RC,需要用二进制的最前面一位来控制最右边的LED灯的亮面,就是二进制的最左边那位控制的是LED最右边的灯

#include <STC89C5xRC.H>//通过右键点击插入头文件

void main()
{
	P2=0X7F;	//0111 1111,C语言中要用16进制来表示2进制
    //P2指的是一个寄存器,在头文件中有描述,头文件通过在第一行点击右键进行插入
	//P2=0X55;	//0101 0101,让个灯一个亮一个灭
	while(1)	//通过死循环来使程序终止
	{
		
	}
}

这里要记得生成hex文件

image-20230525225558099

然后打开stc-isp软件执行该程序

image-20230525230349979

1.选择对应板子

2.要选择那个USB的串口,如果没有的话可能是win10,win11没有驱动的原因,去网上找一下stc-isp的usb驱动下载即可

3.打开之前在keil5中生成的hex文件

4.点击下载编程,然后再重启板子,就可以点亮LED灯了

IMG_20230525_230745

5.LED闪烁

可以新建一个工程来进行实验

思路就是让LED灯先亮然后再熄灭,因为单片机执行速度很快,所以只执行这两条语句我们肉眼就无法观察到,所以要给它设置延时程序,我们可以用STC-ISP软件来帮我们生成这个程序

image-20230525233958338

然后复制粘贴到程序中就可以

#include <STC89C5xRC.H>
#include <INTRINS.H>

void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();//nop函数在#include <INTRINS.H>这个头文件中,我们自己也可以打开这个文件去看里面的函数
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	while(1)
	{
		P2=0X55;//LED亮
		Delay500ms();
		P2=0XFF;//LED灭
		Delay500ms();
	}
}

6.LED流水灯

#include <STC89C5xRC.H>
#include <intrins.h>

void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	while(1)
	{
		P2=0X7F;  //0111 1111
		Delay500ms();
		P2=0XBF;  //1011 1111
		Delay500ms();
		P2=0XDF;  //1101 1111
		Delay500ms();
		P2=0XEF;  //1110 1111
		Delay500ms();
		P2=0XF7;  //1111 0111
		Delay500ms();
		P2=0XFB;  //1111 1011
		Delay500ms();
		P2=0XFD;  //1111 1101
		Delay500ms();
		P2=0XFE;  //1111 1110
		Delay500ms();
	}
}

自己设置间隔时间:首先用STC生成一个1ms的延时程序,然后再传入参数,用while循环来把1ms的内容循环多次,就可以达到延时xms的效果

#include <STC89C5xRC.H>
#include <intrins.h>
void Delay1ms(unsigned x)		//@11.0592MHz
{
	while(x)
	{
		unsigned char i, j;
	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	x--;
	}
	
}
void main()
{
	while(1)
	{
		P2=0X7F;  //0111 1111
		Delay1ms(1000);
		P2=0XBF;  //1011 1111
		Delay1ms(1000);
		P2=0XDF;  //1101 1111
		Delay1ms(1000);
		P2=0XEF;  //1110 1111
		Delay1ms(200);
		P2=0XF7;  //1111 0111
		Delay1ms(200);
		P2=0XFB;  //1111 1011
		Delay1ms(200);
		P2=0XFD;  //1111 1101
		Delay1ms(200);
		P2=0XFE;  //1111 1110
		Delay1ms(200);
	}
}

参考

B站江协科技
https://www.bilibili.com/video/BV1Mb411e7re?p=1

posted @ 2023-05-30 23:16  Jinx8823  阅读(130)  评论(0编辑  收藏  举报