微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机定时器程序

单片机定时器程序

时间:10-02 整理:3721RD 点击:
如下程序是单片机控制继电器(低电平触发)定时程序,如果我需要21小时继电器接通,然后3小时断开,再21小时继电器接通,然后3小时断开, 如此24小时循环下去,7天停下来,以下程序是否正确?谢谢!
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit JDQ=P2^0;
void delayms(uint);
uint num; //无符号整数型范围0-65535
uchar fen, xiaoshi, r;//无符号字符型范围0-255
void main()
{  JDQ=0;
   TMOD=0x01;
   TH0=(65536-45872)/256; // 11.0592MHz,50ms步长
   TL0=(65536-45872)%256;
   EA=1;
   ET0=1;                                          
   TR0=1;

while(1)
{         
    if(num==1200) //1分钟时间到
    {
     num=0;
     fen++;
        if(fen==60)        //1小时时间到
        {
         fen=0;
         xiaoshi++;
            if(xiaoshi==24)        //1天时间到
            {
                         JDQ=~JDQ;//一天循环,继电器恢复到低电平触发工作
             xiaoshi=0;
             r++;
            }
        }

      
    }
}
if(xiaoshi==21)
   JDQ=~JDQ;//继电器高电平停止工作
if(r==7)
   while(1)
   {
   delayms(5000);
   JDQ=1;
   }
}

void TO_time() interrupt 1
{
    TH0=(65536-45872)/256;
    TL0=(65536-45872)%256;
    num++;

}
void delayms(uint xms)
{
    uint i,j;
     for(i=xms;i>0;i--)
        for(j=0;j>110;j--);
}

你这个程序有严重的问题,在一个主程序里出现了两个死循环!第二个while(1)下面的句子MCU什么时间会跑这个程序呢?

WHY NOT? 第二个WHILE是在第一个WHILE里面的。

这个是修改以后的程序,两个while是嵌套的。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit JDQ=P2^0;
void delayms(uint);
uint num; //无符号整数型范围0-65535
uchar fen, xiaoshi, r;//无符号字符型范围0-255
void main()
{  JDQ=0;
   TMOD=0x01;
   TH0=(65536-45872)/256; // 11.0592MHz,50ms步长
   TL0=(65536-45872)%256;
   EA=1;
   ET0=1;                                          
   TR0=1;

while(1)
{         
    if(num==1200) //1分钟时间到
    {
     num=0;
     fen++;
        if(fen==60)        //1小时时间到
        {
         fen=0;
         xiaoshi++;
            if(xiaoshi==24)        //1天时间到
            {
                         JDQ=~JDQ;//一天循环,继电器恢复到低电平触发工作
             xiaoshi=0;
             r++;
            }
        }

    }
if(xiaoshi==21)
   JDQ=~JDQ;//继电器高电平停止工作
if(r==7)
   while(1)
   {
   delayms(5000);
   JDQ=1;
   }
}
}

void TO_time() interrupt 1
{
    TH0=(65536-45872)/256;
    TL0=(65536-45872)%256;
    num++;

}
void delayms(uint xms)
{
    uint i,j;
     for(i=xms;i>0;i--)
        for(j=0;j>110;j--);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top