51单片机学习记录——LED模块入门学习

目录

前言

软件安装以及前期准备工作

今日任务一:点亮一个LED

今日任务二:D1LED的闪烁

今日任务三:LED流水灯

流水灯标准版

流水灯plus版

今日所遇到的问题

今天的最后

        


前言

        做这个博客的目的是为了记录自己在学习51单片机的过程中所学到的知识点以及遇到的问题以便日后方便回顾。如果有同学一不小心看到这篇博客,希望也能够帮助到你。

软件安装以及前期准备工作

        软件我选择安装的是keil4以及STC-ISP。下面的网盘中有软件的安装包以及破解(如果不破解在使用keil4的时候会有诸多限制,比如只能编写2k的代码)安装教程,里面还有其他的资料比如开发板的资料等等,如果有需要可以自行查询。百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间icon-default.png?t=N7T8https://pan.baidu.com/s/1Yuijxrnbw-2yLFWX64grlw?pwd=1234%C2%A0

       在keil4的破解过程中,最好不要运行杀毒软件,如果没有运行任何杀毒软件,但是Windows自带的安全东西可能会把破解软件视为病毒,会自行删除文件。这个时候可以按照如下方式解决这个问题:

1.首先在状态栏中打开Windows安全中心

2.然后单击病毒和威胁防护

       

3.进入病毒和威胁防护界面之后点击保护历史记录

4.最后还原被Windows安全中心所阻止的破解程序,再重新运行好了。注意:在破解的时候keil4以及破解软件都需要以管理员身份运行,否则会破解失败!!!最好把声音也关了,真的会被吓一跳,破解软件还有背景音乐,那个音乐真的像是病毒,哈哈哈哈哈。

         我买的学习开发板的MCU的型号为STC89C52RC,这个型号不同于江科大视频中的STC89C52,如果型号不对,在程序下载的时候会出现问题,这个我们后续再讲。

        将板子与电脑通过USB连接的时候记得安装驱动,不然电脑识别不了板子会将其视为其他设备,驱动在上面的网盘文件里有,傻瓜式无脑按照教程安装就好了,如果安装驱动成功,在打开设备管理器后(右键点击此电脑→属性→设备管理器(这里就不贴图了,绝对不是因为我懒))会像下图一样显示:

        到此,前期的准备工作就结束了,现在正式开始学习五一单片机!!! 

今日任务一:点亮一个LED

        现在我们终于可以正常使用keil4来进军学习单片机了,那如何开始创建一个项目呢?这里有大佬已经总结好了keil4的使用,这里我就借用一下:

Keil uVision4的基本使用-CSDN博客文章浏览阅读1w次,点赞14次,收藏96次。Keil uVision4的基本使用_keil uvision4https://blog.csdn.net/m0_68319844/article/details/130156394        好,现在我们已经创建好了.c文件,在写代码之前,我们得了解一下单片机是如何控制LED模块的。LED模块是有一个名叫p2的八位寄存机来控制的,每一位控制一个LED。由LED模块的开发原理图可知,在寄存器为低电平的时候是有效的,所以如果p2的某一位为0时就能够点亮对应的LED。

        了解完LED模块的原理之后就可以编写代码了,由以上可知只需要控制p2寄存器的值就可以控制LED的亮灭了,由C语言写出来代码如下所示:

#include <REGX52.H>

void main()
{
	P2=0xFE; //1111 1110
}

此头文件为AT89X2的寄存器的定义等等否则程序将会运行失败。程序写完后需要设置一下自动生成程序下载的文件,其操作如图所示:

         接下来就可以运行文件并下载了:

1.先运行文件,点击左上角的build按钮;

2.接下来连接好板子并打开STC-ISP软件准备下载程序先选择好单片机的型号,如果连接好了板子会自动选择好串口号,接着打开生成的.hex文件,此文件会存在于创建项目的文件夹内,最后下载到板子上面就行,别忘记开启板子哦!

这样第一个LED就点亮啦!!!

今日任务二:D1LED的闪烁

        其任务是控制D1LED的闪烁,那在可以先点亮D1再关闭D1,意思就是先给P2赋值0xFF,再给P2赋值0xFE并将其放在while死循环里面不就好了吗?代码如下:

#include <REGX52.H>
void main()
{

	while(1)
	{
		P2=0xFE;
		P2=0xFF;
	}
}

将代码下载到板子上面会发现D1一直都有点亮,但是没用看到关闭的现象,这是因为板子的频率比较高,所以代码的执行速度很快,人眼分辨不出来,所以需要在点亮和关闭之间加上时间间隔。stc-isp上面有对应的工具,可以帮助我们写好延时函数,其操作方式如下:打开stc-isp软件,并点击右上角的三角符号找到软件延时生成器 ,选择好系统评率以及定时长度,就会自动生成c语言函数代码,将代码复制过去就行。

在延时函数中存在_nop_()函数,其头文件为#include <INTRINS.H>

最终代码如下所示:

#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms()		//@11.0592MHz设置为500ms的延迟
{
	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=0xFE;
		Delay500ms();
		P2=0xFF;
		Delay500ms();
	}
}

 运行程序后将.hex文件下载到板子上就可以了,这里就不插入视频了,因为插入不了。

今日任务三:LED流水灯

        其任务需求就是让LED灯以此点亮。

流水灯标准版

         有上面闪烁LED的基础应该很快就能想到该如何写c代码,只需要调整一下P2的值就可以了,下面直接贴代码。

#include <REGX52.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=0xFE;//1111 1110
		Delay500ms();
		P2=0xFD;//1111 1101
		Delay500ms();
		P2=0xFB;//1111 1011
		Delay500ms();
		P2=0xF7;//1111 0111
		Delay500ms();
		P2=0xEF;//1110 1111
		Delay500ms();
		P2=0xDF;//1101 1111
		Delay500ms();
		P2=0xBF;//1011 1111
		Delay500ms();
		P2=0x7F;//0111 1111
		Delay500ms();

	}
}

        但是假如每个LED灯的间隔不一样该怎么办呢?每次都去stc-isp上面复制代码也挺麻烦的 ,下面介绍流水灯plus版本。       

流水灯plus版

        puls版本的思路就是修改间隔为1ms的函数,给其函数传一个参数以表示所需要的时间,利用while循环自减以控制间隔时间,这样如果想要修改时间间隔只需要修改函数的参数就可以了。其代码如下所示:

void Delay1ms(unsigned int xms)		//@11.0592MHz xms为传入的参数
{
	unsigned char i, j;
	while(xms)//循环xms次,表示间隔xms毫秒
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;	
	}

}

最后将函数添加到主函数中,设置自己所需要的毫秒数即可,如果需要微妙,就需要基于1us的时间间隔函数去修改了,总体代码如下所示:

#include <REGX52.H>
#include <INTRINS.H>

void Delay1ms(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms)
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;	
	}

}


void main()
{
   while(1)
	{
		P2=0xFE;//1111 1110
		Delay1ms(500);
		P2=0xFD;//1111 1101
		Delay1ms(500);
		P2=0xFB;//1111 1011
		Delay1ms(500);
		P2=0xF7;//1111 0111
		Delay1ms(500);
		P2=0xEF;//1110 1111
		Delay1ms(100);
		P2=0xDF;//1101 1111
		Delay1ms(100);
		P2=0xBF;//1011 1111
		Delay1ms(100);
		P2=0x7F;//0111 1111
		Delay1ms(100);
	}
}

其中主函数中设置的时间不一样,下载到开发板上面会很明显地感觉到先慢后快,这样修改了之后节约了代码量,也让程序更直观。 

今日所遇到的问题

1.在破解keil4的时候没用以管理员权限去运行,导致破解失败;

2.在开发板下载的时候没有选择对单片机的型号,导致stc-isp一直在检测目标单片机,没有达到预期的效果。

今天的最后

        今天是第一天接触单片机,我真的觉得好新奇,好有趣,点亮第一个LED的兴奋感是难以言表的,希望我能够一直学下去并坚持发布文章,加油!

        

  • 45
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值