标题: 单片机控制LED请问延时除了累减嵌套循环,还有什么好方法没? [打印本页]

作者: singrain    时间: 2019-8-11 20:23
标题: 单片机控制LED请问延时除了累减嵌套循环,还有什么好方法没?
我想做个点亮led灯1秒,暗10秒,循环10次程序停止,网上找了一些程序拼凑而成,我是新手还没入门呢,x的10次循环不知道怎么退出,延时循环一直用累减循环,会不会浪费cpu(mcu)资源、减少寿命,浪费电池电量。还有网上查的1s=1000000us,实测是255000us。
下面的程序,x的10次循环怎么退出啊,想运行10次就让单片机休息,停止工作,怕一直工作下去累坏了,后面加了return 0程序出错,while循环还不会写。

#include<reg52.h>

sbit LED0=P1^0;
void Delay_1s();
void Delay_10s();
unsigned int i,j,k;

void delay_1s()
{
   for(i=95;i>0;i--)
   for(j=26;j>0;j--)
   for(k=46;k>0;k--);
}

void delay_10s()
{
   unsigned int i,j,k;
   for(i=73;i>0;i--)
   for(j=249;j>0;j--)
   for(k=63;k>0;k--);
}

void main (void)
{
    int x;
    for (x=1; x<=10; x++)
  {
  LED0=0;
  Delay_1s();
  LED0=1;
  Delay_10s();
  }

}


作者: 51hei团团    时间: 2019-8-12 02:01
定时器有空闲的话可以用定时器 不过程序麻烦点
作者: wulin    时间: 2019-8-12 05:56
想按精确时间循环10次程序停止需要使用定时器。
MCU是累不死的,让MCU处于休眠状态节约电池电量是可行的。
此类简单程序在论坛很好找。
作者: yzwzfyz    时间: 2019-8-12 12:04
你所能理解的方式都是最笨最糟糕的方法。
沙发、板櫈的说法是正解。
作者: 很多的小地方    时间: 2019-8-12 17:39
用定时器,比如一秒产生一次定时器中断,在中断中让LED灯亮,再定义两个全局变量,LED_cnt,count_cnt。LED_cnt是为了让灯亮一秒暗10秒,cnt用来循环10次退出。
例子:
void TIM3_UPD_OVF_IRQHandler (void)//定时器3中断服务函数
{
        static LED_cnt = 0,count_cnt = 0;
        if(!LED_cnt)
        {
                LED = 1;//亮灯
                count_cnt ++;//计数一次
        }
        else LED = 0;//关灯
        LED_cnt ++;
        if(LED_cnt == 10) LED_cnt = 0;
        if(0,count_cnt == 10) TIM3_SR1 = 0x00;//关定时器
}




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1