STC11F60XE单片机定时器/计数器2用于计数模式,计数P1.0口发出的脉冲,求C程序,高手帮帮忙

我用STC11F60XE单片机的独立波特率发生器在P1.0口输出脉冲信号,控制伺服电机,用T0计数并触发中断使脉冲数固定,可中断后再想启动P1.0口发脉冲就有点问题了,动作会有点乱,而且我的T0还有其它用处。想改用T2计数,要能停能开,或者你有其它的好办法也行。求高手帮忙解决,问题解决后加分。
main()
{
BRT = (256 - 10);//设定独立波特率发生器频率
WAKE_CLKO= (WAKE_CLKO | 0x07);//允许T0,T1,独立波特率发生器输出时钟
AUXR = (AUXR | 0x10);//启动独立波特率发生器
TMOD = 0x05;
TH0 = 0x3C;
TL0 = 0xB0;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1)
{
if(y == 0)
{
input_delay();
if(y == 0)
{
TH0 = 0x3C;
TL0 = 0xB0;
TR0 = 1;
AUXR = (AUXR | 0x10);
}
}
}

}
count() interrupt 1
{
AUXR = 0;
TR0 = 0;
P1 = 0xFF;//这一步不能使P1^0口拉高!奇怪
}

第1个回答  2012-06-18
以下修改说明:1、将T0由计数器改为定时器,2、由按键切换T0的启停。3、STC11F60XE没有T2所以无法使用T2,由于有独立波特率发生器作为串口的波特率,T1可以解放出来,你可以使用T1
main()
{
unsigned char keycode;
BRT = (256 - 10);//设定独立波特率发生器频率
WAKE_CLKO= (WAKE_CLKO | 0x07);//允许T0,T1,独立波特率发生器输出时钟
AUXR = (AUXR | 0x10);//启动独立波特率发生器
TMOD = 0x01; //改为定时模式
TH0 = 0x3C;
TL0 = 0xB0;
EA = 1;
ET0 = 1;
TR0 = 1;
keycode=0x0;
while(1)
{
if(y == 0)
{
input_delay();
if(y == 0) //按键切换启停
{
keycode=~keycode;
if(keycode)TR0 = 0;
else TR0 = 1;
}
}
}

}
count() interrupt 1
{
TR0 = 0;
TH0 = 0x3C;
TL0 = 0xB0;
TR0 = 1;
P1^0 = ~P1^0;
}追问

BRT = (256 - 10);
WAKE_CLKO= (WAKE_CLKO | 0x07);
AUXR = (AUXR | 0x10);//启动独立波特率发生器
前面都已经使用独立波特率发生器了,再去中断中更改P1状态……
P1^0 = ~P1^0;
好像不太对吧,我在中断中试过 “P1 = 0xFF;//这一步不能使P1^0口拉高!奇怪” 改不了的

我也用过定时器发脉冲,可要是想让脉冲频率高就要不停的中断,弄的CPU都不能做其它事了。
于是想了这个办法,可又没办法控制发出脉冲的数量了

追答

去掉这句:WAKE_CLKO= (WAKE_CLKO | 0x07);//允许T0,T1,独立波特率发生器输出时钟
没有必要用其输出

第2个回答  2012-06-18
中断中你还需要把WAKE_CLKO寄存器配置一下,关闭P1.0的CLKOUT2功能,还原到正常的IO模式,才能保证P1=0XFF有效本回答被提问者和网友采纳
相似回答