单片机定时器程序
#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--);
}