和我一起入门51单片机
相信大多数的朋友学习单片机都是从51单片机开始的,51的学习教程也很多。可是这些教程也太乱了,关键部分总是一带而过,而浪费了大量的篇幅讲一些大家都知道的东西,让学习者失去兴趣。
本文以一个学习者的角度,根据自己的亲历来写这篇51单片机的入门文章,主要将一些实用的东西。去掉那些纯理论的,真正让人人都能看懂,都能学会,都能感兴趣。
本人也是单片机的门外汉,此文旨在抛砖引玉,只适用于单片机门外汉小白,高手请直接无视,谢谢!
点亮第一个LED
要是LED点亮,就要使LED流过约2-10mA的电流,如图1 ,就是要让单片机的P1^0输出一个低电平。
好,开始写程序。
# 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();
};
}
查看评论 回复