单片机 > 单片机程序设计 > 详情

51单片机入门led闪烁程序

发布时间:2021-12-08 发布时间:
|

简介:51单片机入门led闪烁程序 这一节简单讲下proteus仿真软件的使用,关键在于需要的元器件的代号,比如电阻是resistor,电容是capacitor等等,不过不用刻意去记,用得多了自然就记住了,碰到新的元器件就网上查找。 上图中的例子是单片机的最小系统以及LED灯,......


这一节简单讲下proteus仿真软件的使用,关键在于需要的元器件的代号,比如电阻是resistor,电容是capacitor等等,不过不用刻意去记,用得多了自然就记住了,碰到新的元器件就网上查找。

上图中的例子是单片机的最小系统以及LED灯,左侧栏里显示了这一原理图的元器件列表,如果要添加某元器件,那么就单击“P”,就会弹出选择元器件的对话框,包含了proteus自带的所有元器件,这个时候就需要输入元器件的代号进行查找,或者明确知道元器件的类别,直接一级一级搜都是可

这一节要使LED进行闪烁,可想而知LED的闪烁需要P0.0电平高低以一定频率变换,频率越快那么LED闪烁频率也越快。知道了这一点,相应C代码就很容易了。


#include


sbit led = P0^0;


void delayxms(unsigned int xms);


void main()


while(1)


led = 0; //LED发光


delayxms(1000); //延时1s


led =1; //LED熄灭


delayxms(1000); //延时1s


void delayxms(unsigned int xms) //延时函数


unsigned int i,j;


for(i=xms;i>0;i--) //通过for循环嵌套,实现xms延时


for(j=110;j>0;j--);


这一段C代码相比第一节,多了一个带参子函数delayxms,每次赋值xms的不同,那么该函数实现的延时时间也就不同,如本例中实现1s延时,那么xms就赋值1000。在编写单片机程序时要养成好的编程习惯,在实际项目中函数会有很多个,而且常见的都是多个头文件和源文件分开。因此在写程序的时候,我们可以这样理解,就是程序有两大部分,一部分是变量和函数的声明区,就是告诉单片机我这段程序里要用到什么变量和函数;第二部分就是功能实现,也就是声明的函数的具体实现代码。本例中的C代码,在包含了头文件之后,声明了led和delayxms函数,告诉单片机接下来的代码中操作led实际上就是操作P0.0,delayxms函数的参数类型是无符号整型且无返回值。为什么delayxms函数就能实现xms的延时呢?这里要说明下单片机的时钟周期。


时钟周期


时钟周期是单片机周期中的最小单位,定义为时钟频率的倒数,如本例中时钟频率是11.0592MHz,那么时钟周期就是其倒数。一个机器周期等于12个时钟周期,约等于1.09us。在一个时钟周期内,单片机完成最基本的一个动作,就相当于人的心脏跳动。显然单片机的时钟频率越高,单片机工作速度就越快,当然这局限于单片机的硬件设计,高级的单片机如飞思卡尔,STM32等带有倍频功能。单片机中的C代码,每执行一次都是需要时间的。通过KEIL软件仿真中的断点功能,我们可以计算出代码执行所需的时间,这就是为什么delayxms函数这么写的原因,当然还能做得更加精确,那就是运用单片机的内置模块定时器,我们放到第三节课来讲。


另外这段C代码中出现while循环和for循环,本质上是一样的,两者循环都是满足一定条件时循环继续,而条件不满足时则跳出循环。首先说下main函数中的while循环,while循环理解起来非常直观,当条件为真(非零)时循环就进行,因为单片机中的代码是顺序执行的,如果没有这个while(1)的死循环,那么实现的效果就是LED发光和熄灭一次,不能进行第二次的发光,因为程序已经执行完毕。对于延时函数中的for循环,for循环中的第一部分是控制变量的初始值,第二部分是控制变量要满足的条件,第三部分是执行一次循环后对控制变量的操作。如本例中首先i=xms满足i>0的条件,那么就进入for循环,之后对i变量减1,如果还满足i>0的条件,那么循环继续,就是这么简单。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
PIC单片机基础知识之二