请看程序,定时间隔10秒钟让led亮1秒钟
本帖最后由 sunoracle 于 2012-7-20 09:57 编辑晶振是11.0592的,LED灯珠是低电平触发的。下面有段程序不会写,烦请看看,指点一二。 或者请写出其他方法...
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit P2_0 = P2^0;
uint i;
uint T_count = 0;
void led() interrupt 1
{
if (++T_count == 200 )//200个50ms,也就是10秒
{
P2_0 = 0;// LED点亮
T_count = 0;
}
//?????????此处如何让P2_0在持续1秒之后,变为P2_0=1,使得led灯灭
}
void main()
{
TMOD = 0x01;
TH0 = 0x4C; //50ms
TL0 = 0x00;
IE = 0x82;
TR0 = 1;
while(1);
} 【2楼】
T1_count=1 second;这句怎么写啊 sbit P2_0 = P2^0;
uint i;
uint T_count = 0;
void led() interrupt 1
{
++T_count;
if(T_count>20)
P2_0=1;
if (T_count == 200 )//200个50ms,也就是10秒
{
P2_0 = 0;// LED点亮
T_count = 0;
}
}
void main()
{
TMOD = 0x01;
TH0 = 0x4C; //50ms
TL0 = 0x00;
IE = 0x82;
TR0 = 1;
while(1);
} EA没开能运行吗? 使用状态机!
当led点亮时,加一句flag=1.
if(flag==1)
{
if (++T_count == 20 )//20个50ms,也就是1秒
{
P2_0 = 1;// LED熄灭
T_count = 0;
}
} typedefunsigned charuint8;
typedefunsigned int uint16;
#include <reg52.h>
#defineCPU_FOSC11059200UL //11.0592MHz
#define_TIME0 50000 //50000us
#define_TL0 ((65536-_TIME0*(CPU_FOSC/200)/60000)%256)
#define_TH0 ((65536-_TIME0*(CPU_FOSC/200)/60000)/256)
sbit LED = P2^0;
uint8 count;
void Time0() interrupt 1
{
TL0 = _TL0;
TH0 = _TH0;
if (++count == 200) //200个50ms,也就是10秒
{
LED = 0; // LED点亮
}
else if (count >= 220) //P2_0在持续1秒之后,变为P2_0=1,使得led灯灭
{
LED = 1;
count = 0;
}
}
void main()
{
count = 0;
TMOD = 0x01;
TH0 = _TH0;
TL0 = _TL0;
EA= 1;
ET0 = 1;
TR0 = 1;
while (1);
} 做个标记互锁 本帖最后由 zenghui 于 2012-7-20 11:24 编辑
7楼的代码中
if (++count == 200) //200个50ms,也就是10秒
{
LED = 0; // LED点亮
}
else if (count >= 220) //P2_0在持续1秒之后,变为P2_0=1,使得led灯灭
{
LED = 1;
count = 0;
}
我觉得改为
if ((count++)< 200) LED = 1; //200个50ms,也就是10秒LED灯灭
else if ((count++)< 220) LED = 0;//LED点亮
else {LED = 1;count = 0;}
更加严谨一些 本帖最后由 slzm40 于 2012-7-20 14:12 编辑
sbit P2_0 = P2^0;
uint i;
uint T_count = 0;
bit flag;
uint T_count_1s=0;
void led() interrupt 1
{
TH0 = 0x4C; //50ms
TL0 = 0x00;
if(flag)//10S到,灯已亮
{
if( ++T_count_1s==20) //20个50ms,也就是1秒到
{
P2_0 = 1;// LED灭
T_count=0;
T_count_1s=0;
flag=0;
}
}
elseif(++T_count == 200 )//200个50ms,也就是10秒
{
P2_0 = 0;// LED点亮
flag=1;
}
//
}
void main()
{
TMOD = 0x01;
TH0 = 0x4C; //50ms
TL0 = 0x00;
IE = 0x82;
TR0 = 1;
while(1);
}
我不建议程序放中断里。感觉就是不习惯。 1、中断里没有重装TH0和TL0,导致时间不准。
2、EA没有打开,当然不能进中断。
C不感冒 7L和9L的方法都可以做的,清晰明了...{:lol:} oid led() interrupt 1
{
if (++T_count == 1 ) P2_0 = 0;// LED点亮
if( ++T_count == 200) P2_0 = 1;// LED熄灭
if( ++T_count == 220) T_count = 0;
} lryxr2507 发表于 2012-7-20 15:33 static/image/common/back.gif
每次进中断 T_count 自加3次 了 oid led() interrupt 1
{
T_count++;
if (T_count == 1 ) P2_0 = 0;// LED点亮
if( T_count == 200) P2_0 = 1;// LED熄灭
if( T_count == 220) T_count = 0;
} 你可以在定时器中断里面加一个自定义的变量,比如I++,,控制LED的程序卸写在主程序里面,在主程序里面判断I小于20时为1,在再在IF里面判断是否小于220,如果是置零,ELSE I=0 ,一直循环就可以实现了 你可以这样想:
设置一个延时1s的子程序
然后调用10次,即延时了10s
再调用1次,即点亮1s
.......
页:
[1]