单片机计数器问题

书上说单片机定时计数器工作在计数模式时对外部脉冲计数 满了就溢出产生中断 可是我实际调试的时候不太对 请大家帮忙看一下程序
我的想法是T0工作在定时模式定时1ms T1工作在计数模式每1ms加1 一共计1000个数 正好是1秒 然后P0口和P2口的流水灯挨个亮
#include <reg52.h>
#include <intrins.h>
unsigned char shift=0xfe;
sbit TT1=P3^5;
void time0(void)interrupt 1
{
TT1=1;
_nop_();
_nop_();
TT1=0;
TL0=0xf0;
TH0=0xd8;
}
void time1(void)interrupt 3
{
shift<<=1;
shift|=0x01;
TL1=0xf0;
TH1=0xd8;
}
void main()
{
TT1=0;
P0=0xff;
P2=0xff;
TMOD=0x51;
TL0=0xf0;
TH0=0xd8;
TL1=0xf0;
TH1=0xd8;
ET0=1;
ET1=1;
EA=1;
TR0=1;
TR1=1;
while(1)
{
P0=shift;
P2=shift;
if(shift==0xff)
{
shift=0xfe;
}
}
}
计数器不是计满才进入中断程序么 所以应该是计够1000次shift才改变一次吧
你给我提的建议我也想过 不过我就是想使用下计数器的功能呀

void time0(void)interrupt 1
{
TT1=1;
_nop_();
_nop_();
TT1=0;
TL0=0xf0;
TH0=0xd8; //这条指令后最好再加个TR0=1;
}
你下面这段程序的意思是每进入一次中断,shift就改变一次,那1S之内要进来一千次,那shift就改变一千次,你觉得是不是有问题?
我觉得你可以定义一个变量为1000,和一个标志,每次进来变量值减1,当减到0的时候,把标志置位,然后主程序内通过标志来决定干什么。
void time1(void)interrupt 3
{
shift<<=1;
shift|=0x01;
TL1=0xf0;
TH1=0xd8;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-09-23
我的想法是T0工作在定时模式定时1ms T1工作在计数模式每1ms加1 一共计1000个数 正好是1秒 然后P0口和P2口的流水灯挨个亮
--------------------------
你的想法、做法都对。
只是你忽略了一个问题:流水灯,水流的太快,人眼看不出来。
第2个回答  2020-05-12
计数器和定时器的工作原理都是加一。。
如果你想要用计数器的话。在TMOD里设置一下就行了。
如果你想显示下降沿的次数。你可以读计数器里面的值。。。
第3个回答  2019-06-20
一般来说计数功能用外部中断做,你是想做频率计吗。用两个变量,一个在外部中断函数中自加,一个在计时器中断中把那个自加的数值取出保存并把自加的变量清零,这样就计算出了计时器设定时间内的脉冲数了。可以把保存后的那个数通过数码管显示出来。
第4个回答  2019-06-26
当T/C=1时工作在外部事件计数方式,这种状态下从外部引脚T0和T1上输入脉冲作为计数脉冲,当外部输入电平发生负跳变时加1,像你说的如果计数过程中撤去外部信号,由于寄存器有保持功能,理论上TH/TL寄存器将会保持所计到的数值而不会清零。
第5个回答  2009-09-22
写汇编我能帮你分析http://hushouwei.1.blog.163.com/
相似回答