标题: 关于单片机延时程序的问题 [打印本页]

作者: 溧阳科燕    时间: 2017-12-29 16:36
标题: 关于单片机延时程序的问题
#include<reg51.h>        //库文件
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int  //宏定义无符号整型


/********************************************************************
                            I/O定义
*********************************************************************/
sbit DOUT=P1^3;
sbit YOUT=P1^4;
sbit LED1=P3^7;
/********************************************************************
                            延时函数
*********************************************************************/
void delay()//延时程序
{
uchar m,n,s;
for(m=20;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
/********************************************************************
                            主函数
*********************************************************************/
void main()
{
        while(1)   //无限循环
        {
         if((DOUT==1&&YOUT==1))//当DO输出低电平时
         {
            delay();//延时抗干扰
                if((DOUT==1&&YOUT==1))//确定 DO口输出低电平
            {
                   LED1=1;   //这个地方我想添加一个延时的程序 有大神知道怎么添加吗? 延时6个小时左右
                                 
                }
          else
              {
                               LED1=0;

                }
         }
        }
}   


作者: luoluoluo136    时间: 2017-12-29 17:24
把需求说得清楚点~你要延时十天八天都是可以的。定时器计数,然后判断时间就可以了。
作者: wananzi    时间: 2017-12-29 20:48
通过定时器做延时是很好的
作者: 溧阳科燕    时间: 2017-12-30 07:42
luoluoluo136 发表于 2017-12-29 17:24
把需求说得清楚点~你要延时十天八天都是可以的。定时器计数,然后判断时间就可以了。

就是DOUT YOUT都为1的时候 LED1一直点亮六小时 如果中途DOUT YOUT有一个为0的时候就退出循环 LED1熄灭 直到 DOUT YOUT 再次都为1  
作者: david888    时间: 2017-12-30 08:49
是可以用定时器做延时,多长时间都 可以的
作者: 立里    时间: 2017-12-30 09:36
#include<reg51.h>        //库文件 #define uchar unsigned char//宏定义无符号字符型 #define uint unsigned int  //宏定义无符号整型   /********************************************************************                             I/O定义 *********************************************************************/ sbit DOUT=P1^3; sbit YOUT=P1^4; sbit LED1=P3^7; uint16   Timecount; /********************************************************************                             延时函数 *********************************************************************/ void delay()//延时程序 {     uchar m,n,s;     for(m=20;m>0;m--)     for(n=20;n>0;n--)     for(s=248;s>0;s--); } /********************************************************************                             主函数 *********************************************************************/ void main() {     Timer0_init();     //开启定时器0产生1s的中断     while(1)   //无限循环     {         if((DOUT==1&&YOUT==1))//当DO输出低电平时         {             delay();//延时抗干扰             if((DOUT==1&&YOUT==1))//确定 DO口输出低电平             {                 LED1=1;   //这个地方我想添加一个延时的程序 有大神知道怎么添加吗? 延时6个小时左右                 Timecoun = 0;                 while(Timecoun < 3600);             }             else             {                 LED1=0;             }         }     } } void timeint(void) interrupt 1 {     Timecount++; }
作者: 小淘淘饿了    时间: 2017-12-30 09:51
加个定时器
作者: 立里    时间: 2017-12-30 12:02
#include<reg52.h>        //库文件
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int  //宏定义无符号整型

#define DELAYTIME     (200)

typedef enum{false=0, true = 1}  bool;
/********************************************************************
                            I/O定义
*********************************************************************/
sbit DOUT=P1^3;
sbit YOUT=P1^4;
sbit LED1=P3^7;
unsigned short   Timecount;
bool   LedOffflag;
bool   KeyFlag;
/********************************************************************
                            延时函数
*********************************************************************/
void delay()//延时程序
{
    uchar m,n,s;
    for(m=20;m>0;m--)
    for(n=20;n>0;n--)
    for(s=248;s>0;s--);
}
/********************************************************************
                            主函数
*********************************************************************/
void Timer0_init()
{
    EA   = 1;
    ET0  = 1;
    TR0  = 1;
    TMOD = 0x01; //定时器0 计数模式 定时器1模式1
    TH0  = 0x0C;
    TL0  = 0xB0;
}

bool GetKey(void)
{
    if((DOUT==1&&YOUT==1))
         return true;
    else return false;
}


void main()
{
    Timer0_init();     //开启定时器0产生1s的中断
    while(1)   //无限循环
    {
        KeyFlag = GetKey();
        
        if(KeyFlag)
        {
            LED1 = 1;
            Timecount = 0;
            LedOffflag = false;
        }
        else if(LedOffflag)
        {
            LED1 = 0;
        }
    }
}
void timeint(void) interrupt 1
{
    TH0 = 0x00;
    TL0 = 0xB0;
    Timecount++;
    if(Timecount >= DELAYTIME)
    {
        Timecount = DELAYTIME;
        LedOffflag = true;
    }
}
这是重新写的程序,需要延时多长时间,就修改宏DELAYTIME的值。
作者: 溧阳科燕    时间: 2018-1-5 14:42
立里 发表于 2017-12-30 12:02
#include        //库文件
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int ...

我的单片机是STC12C5204PWM的 外部晶振 12MHZ 照着你的程序烧录后 只要一通电 LED就亮着 不管1.3 1.4是高电平还是低电平

作者: dayehetiantian    时间: 2018-1-5 15:47
可以设置定时中断,定时6个小时的
作者: 56121    时间: 2018-1-5 17:23
用通用定时器
作者: cede64    时间: 2018-1-5 17:51
void delay(uint time)        //延时函数
{
        uint x,y;
        for(x=time;x>0;x--)
        for(y=110;y>0;y--);
作者: chengdeshi    时间: 2018-1-6 08:28
死循环前面加个
TMOD=0x01;
EA=ET0=TR0=1;

主函数后面加一个

time0() interrupt 1
{
     TL0=(65536-50000)%0X100;
     TH0=(65536-50000)/0X100;
     c++;
     if(c>=1200){
               c=0;
               if(t>0)t--;
      }
}
注意主函数那要定义uint c=0,t;
只要在你要延时的地方加一个t=6;就可以了

作者: chengdeshi    时间: 2018-1-6 08:31
[qq]1965546844[/qq]

作者: zjb879653946    时间: 2018-1-7 08:53
延时可以用定时器,自己写的延时delay函数时间不太准确
作者: 无量寿经    时间: 2018-1-7 11:54
这里讲解已经非常详细完整了
http://www.51hei.com/bbs/dpj-78271-1.html

作者: 甲壳虫1号    时间: 2018-1-7 14:29
dayehetiantian 发表于 2018-1-5 15:47
可以设置定时中断,定时6个小时的

定时器定时延迟比较准确
作者: 卖梨的小红帽    时间: 2018-1-7 23:16
#include<reg51.h>        //库文件 #define uchar unsigned char//宏定义无符号字符型 #define uint unsigned int  //宏定义无符号整型   /********************************************************************                             I/O定义 *********************************************************************/ sbit DOUT=P1^3; sbit YOUT=P1^4; sbit LED1=P3^7; /********************************************************************                             延时函数 *********************************************************************/ void delay()//延时程序 { uchar m,n,s; for(m=20;m>0;m--) for(n=20;n>0;n--) for(s=248;s>0;s--); } /********************************************************************                             主函数 *********************************************************************/ void main() {         while(1)   //无限循环         {          if((DOUT==1&&YOUT==1))//当DO输出低电平时          {             delay();//延时抗干扰                 if((DOUT==1&&YOUT==1))//确定 DO口输出低电平             {                    LED1=1;   //这个地方我想添加一个延时的程序 有大神知道怎么添加吗? 延时6个小时左右                                                   }           else               {                                LED1=0;                  }          }         } }   




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