目录
前言
做这个博客的目的是为了记录自己在学习51单片机的过程中所学到的知识点以及遇到的问题以便日后方便回顾。如果有同学一不小心看到这篇博客,希望也能够帮助到你。
软件安装以及前期准备工作
软件我选择安装的是keil4以及STC-ISP。下面的网盘中有软件的安装包以及破解(如果不破解在使用keil4的时候会有诸多限制,比如只能编写2k的代码)安装教程,里面还有其他的资料比如开发板的资料等等,如果有需要可以自行查询。百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间https://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的兴奋感是难以言表的,希望我能够一直学下去并坚持发布文章,加油!