写出此主题主要是因为本人之前被学校教的编程方式残害,所以思量很久,还是想发出此贴,共和大家一起讨论话不多少,直接进入正题。
拿一个最简单得例子,在学校我们写的最简单得51单片机的程序肯定都是点亮一个LED了,那么让LED闪烁可用用的都是亮一下LED,然后延时一下,然后在灭LED,然后再延时,循环往复,达到延时的功能。
程序如下:
void delay(uint m) //延时程序
{
uint i,j;
for(i=110;i>0;i--)
for(j=m;j>0;j--);
}
void main()
{
while(1);
{
LED = 0;
delay(500);
LED = 1;
delay(500);
}
}
这里对于单个模块来说是没有问题的,但是一旦几个模块组合在一起,时间就不对了,然后延时还会影响到其他程序的运行,所以,在主循环里。我们应当尽量去减少使用延时的情况。需要延时我们应当采用主循环计数的方式去实现,那么在这里,我们就应当设定一个基准,也就是主循环应当多久跑一次呢?有人会问:主循环的时间我们还能设定?在这里其实我们说的是,主循环在跑,但是真正我们执行的功能函数时间我们是可以设定的,话不多说先看程序:
void main()
{
TMOD=0x01;//定时器工作在方式
TH0=(65536-50000)/256;//初值是15536,定时50ms
TL0=(65536-50000)%256;
TR0=1;//开始计数
TF0 = 0;//溢出标志清零
while(1)//主循环
{
if(TF0)//50ms到了
{
TF0 = 0;//清零
TH0=(65536-50000)/256;//重新赋初值
TL0=(65536-50000)%256;
V_TempData++;//计数加加
if(V_TempData >= 10)//500ms到了
{
V_TempData = 0;//清零
P_LEDPort ^= 1; //异或取反
}
}
}
}
在这里,我们简单的描述了一下,将功能函数设定为50ms跑一次,那么跑十次,就是500ms了,此时再将LED的状态反转一下,就可以达到闪烁的小伙了,这里只用到了一个功能,如果增加一个功能,比如让蜂鸣器响1秒钟然后灭一秒,就只需要增加一个计数就好了,然后和上面的LED一样操作就好了,但是如果使用延时,这是不是就会麻烦很多呢?
整个工程和仿真就放在下面附件吧!
楼主初次写此类文章,不到之处请谅解!!
还请大家有意见评论处指出来讨论下!!哈哈哈
全部资料51hei下载地址:
2_定时器0查询法使LED闪烁.zip
(70.38 KB, 下载次数: 3)
|