51单片机学习资料整合大全(和我一起入门51单片机)

相信大多数的朋友学习单片机都是从51单片机开始的,51的学习教程也很多。可是这些教程也太乱了,关键部分总是一带而过,而浪费了大量的篇幅讲一些大家都知道的东西,让学习者失去兴趣。

本文以一个学习者的角度,根据自己的亲历来写这篇51单片机的入门文章,主要将一些实用的东西。去掉那些纯理论的,真正让人人都能看懂,都能学会,都能感兴趣。

本人也是单片机的门外汉,此文旨在抛砖引玉,只适用于单片机门外汉小白,高手请直接无视,谢谢!

  1. 点亮第一个LED

要是LED点亮,就要使LED流过约2-10mA的电流,如图1 ,就是要让单片机的P1^0输出一个低电平。

51单片机学习资料整合大全(和我一起入门51单片机)(1)

51单片机学习资料整合大全(和我一起入门51单片机)(2)

好,开始写程序。

# include <reg52.h> //头文件,必须调用,以井号开头

sbit D1=P1^0; //给与LED负极相连的叫取个名字,这里注意要以分号结尾

void main() //主函数,任何c语言程序必须有,而且只能有一个,注意双括号结尾

{ //主函数内容必须在大括号里

D1=0; //让P0^1输出低电平

} //大括号结尾

好了,就这么简单,其实真正就一句话,其它的都是C语言的一个基本框架结构。D1=0.太简单了吧?生产一个HEX文件烧录到你的单片机里看一下吧?

你也可以的吧,现在你就可以说:“我也可以玩单片机啦!”,有兴趣,有信心了吧?

OK, Let’s go on!

二,让我们简单的程序再规范点吧

好,有了兴趣和信心就好办了,接着来!

上面写的那个简单的程序可以工作了吧?好,你已经成功了第一步了。可难道就这么简单?就一句D1=0就好了。也可以说,就这么简单的。可是这样的程序虽然可以工作,但是给内行的人一看就知道是个菜鸟写的,因为它并不完整。单片机执行了D1=0之后他要干什么呢?没人给它指令!事实上,就算没有给它指令它会跳到最前面的一条指令继续执行的,我们只有一条指令,所以他会一直执行。好了,为了规范,还是正式一些吧。

# include <reg52.h>

sbit D1=P1^0;

void main()

{

D1=0;

While(1); //就加上这么一句

}

简单讲一下while语句。

语句格式:while(表达式)

{ 内部语句();

}

解释一下,while其实也是一个判断语句,先判断括号里的表达式是不是真的,然后再执行内部语句。那么什么样是真的呢?不等于0就是真的!如果等于0了,就会跳出语句。内部语句如果是空的可以不写,大括号也就可以省了,但是分号一定要记得写哟!我们分析一下我们上面的这句while(1)吧。

我们写的while(1);事实上可以写为

While(1)

{ ()

};但是内部语句都是空的,所以可以写成:while(1);

先判断表达式,表达式是1.1不是0,所以是真,执行内部语句,内部语句为空,不要执行什么。因为1永远是1,不可能为0的,所以就不会跳出。因此就会一直执行此语句。

# include <reg52.h>

sbit D1=P1^0;

void main()

{

D1=0;

while(1); }

所以上面的程序就会让LED一直点亮着。好了,点亮LED的程序就讲到这里了,大家应该都明白了吧!

三.让LED闪起来

LED成功点亮了,是不是很兴奋?玩了一会儿有没有觉得好单调哟,LED一直亮着好没意思!那么好吧,follow me !让我们的LED闪动起来!

分析:闪动,就是让LED先亮起来,再熄灭,在亮起来。如此反复就形成了闪动了。

首先让LED亮起来!这个大家会了吧?好,成功一半了。那么再把它熄灭吧。怎么才能让LED熄灭呢?聪明的你一定会想到,LED亮起来是让LED负极为低电位,那么熄灭一定是高电位了。程序里亮起来是写D1=0,那么熄灭应该是写D1=1吧?完全正确!那么我没写一个看看!

# include <reg52.h> //头文件,必须调用,以井号开头

sbit D1=P1^0; //给与LED负极相连的叫取个名字,这里注意要以分号结尾

void main() //主函数,任何c语言程序必须有,而且只能有一个,注意双括号结尾

{ //主函数内容必须在大括号里

D1=0; //让P0^1输出低电平

D1=1; //让P0^1输出高电平

while(1);

} //大括号结尾

写好了,是这样吧?先D1=0,LED亮起来,再LED=1,熄灭LED.好像是这样,生产HEX文件烧录到单片机看看吧。

咦?!怎么了?怎么还一样啊!失败了,为什么这样?

分析原因:为什么呢?我们知道,人的眼睛看东西的时候也会有一个响应时间的,如果过快的话会看到的和实际的是有区别的,这就好比看电影,电影其实就是一幅幅的图画构成的,按照一定的速度播放我们就觉得是很流畅的动作,而不是一幅幅的图画。如果速度过慢的话我们看到的就是一幅幅的图画,那么过快呢,像快进的画面,再快呢,那么我们将看到的是一片模糊什么也看不到。

同理,我们的LED的亮与灭也要有一定的时间,那样我们才能看到它是在闪动的。那么是多长的时间呢?说真的,这个我还真不知道,我们就先随便写一个时间看看呗!

好,知道了原因了。那么动手继续写程序。

这里就要用到了一个延时了,我们先用一个最简单的延时来做吧。

For 语句 格式: for(表达式1;表达式2;表达式3)

{语句()

}

解释一下,先求解表达式1,再求解表达式2,判断一下,如果表达式2是真的就执行语句,再执行表达式3 。如果表达式2 是假的,则跳出语句,不再执行表达式3了。

我们开始试着写看看。先照搬语句格式

for(a;a>0;a--)

{语句()

}

咦?那个a是什么?

哦,解释一下,这里是定义了一个变量。既然定义了一个变量a,那么我们一定首先要申明一下的,不然单片机也不知道的,不过它不会这样问我,它不知道的话就直接罢工了。好那么我就先告诉它一声吧。“喂,单片机,我马上要用到一个变量,我给它取名字叫a”

unsigned char a; //喂,单片机,我马上要用到一个变量,我给它取名字叫a

for(a;a>0;a--)

{语句()

}

这样对了吗?呵呵,还不行的,还没给变量赋值呢!再重写

unsigned char a; //喂,单片机,我马上要用到一个变量,我给它取名字叫a

for(a=100;a>0;a--)//给变量a赋值了

{语句()

}

这下一个差不多了,那么语句写什么呢?

语句嘛,就是要看你想让它做什么了。我们这里就是要它一直亮灭亮灭的循环。

哦,我知道了,那不就可以用钱买讲过的while(1);不就可以了?

OK,没错,咱们就这么干!

unsigned char a; //喂,单片机,我马上要用到一个变量,我给它取名字叫a!

for(a=100;a>0;a--)//给变量a赋值了

{while(1);

}

对了,现在我们写一个完整的看看。

# include <reg52.h> //头文件,必须调用,以井号开头

sbit D1=P1^0; //给与LED负极相连的叫取个名字,这里注意要以分号结尾

unsigned char a; //喂,单片机,我马上要用到一个变量,我给它取名字叫a

void main() //主函数,任何c语言程序必须有,而且只能有一个,注意双括号结尾

{ //主函数内容必须在大括号里

D1=0; //让P0^1输出低电平

For(a=100;a>0;a--)//给变量a赋值了

D1=1; //让P0^1输出高电平

For(a=100;a>0;a--)//给变量a赋值了

{while(1);

}

}

可以了吗?

好了,生成HEX文件下载到单片机看看效果!

哦!好像还不行呀!

嗯。。。 。。。哦,应该是时间还是太短了。

那我们把100改成1000不就可以了吗?

哦!这样的思路是对的,但是不可以直接改的,因为char形的最大是255,超过255它就不认识了。我们来用for嵌套吧。就是用2个for语句。这样的话我们就要定义2个变量了。写成这样:

unsigned char a,b ; //喂,单片机,我马上要用到2个变量,我给它取名字叫a和b

for(a=100;a>0;a--)//给变量a赋值了 注意,这个语句后面不加分号

for (b=100;b>0:b--);//给变量b赋值了

好了,我们完整写一遍吧!

# include <reg52.h> //头文件,必须调用,以井号开头

sbit D1=P1^0; //给与LED负极相连的叫取个名字,这里注意要以分号结尾

unsigned char a,b; //喂,单片机,我马上要用到2个变量,我给它取名字叫a和b

void main() //主函数,任何c语言程序必须有,而且只能有一个,注意双括号结尾

{ while(1) //主函数内容必须在大括号里

{

D1=0; //让P0^1输出低电平

for(a=200;a>0;a--)//给变量a赋值了,判断100>0是真的,执行a自减

for(b=200;b>0;b--);//给变量b赋值了,判断100>0是真的,执行b自减

D1=1;

for(a=200;a>0;a--)//给变量a赋值了,判断100>0是真的,执行a自减

for(b=200;b>0;b--);//给变量b赋值了,判断100>0是真的,执行b自减

};

}OK了,现在下载到单片机吧!

至此我们已经熟练掌握了用单片机控制1个LED了。

下面再精简一下程序。

# include <reg52.h> //头文件,必须调用,以井号开头

#define uchar unsigned char

void delay(uint ms)//延时函数

{

uchar a,b,c;

for(a=200;a>0;a--)//给变量a赋值了,判断100>0是真的,执行a自减

for(b=200;b>0;b--);//给变量b赋值了,判断100>0是真的,执行b自减

}

sbit D1=P1^0; //给与LED负极相连的叫取个名字,这里注意要以分号结尾

void main() //主函数,任何c语言程序必须有,而且只能有一个,注意双括号结尾

{ while(1) //主函数内容必须在大括号里

{

D1=0; //让P0^1输出低电平

delay();

D1=1;

delay();

};

}

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页