要采集两路高低电平信号(差分方波信号,每个电平1ms,同为低电平时认为截止),用51单片机,我用的方法是在一路电平信号下降沿触发中断,进入中断后,延时200us采集第一个低电平,然后赋初值给定时器,使定时器计时1ms中断,每次中断采一次数据,如果出现两路信号采集都是0的情况则计时中断终止。我写的程序如下: void Data_PC(void)
interrupt
0 {
Delay();
a=Data_m_PC;// Data_m_PC是要采集的信号D_
b=Data_a_PC;// Data_a_PC是要采集的信号D+,把采集的信号给变量a,b
Data_m_Device=a;
Data_a_Device=b;// Data_m_Device, Data_a_Device为采样的信号输出
ET0=1;
TMOD=0x01;
TL0=time_1ms;
TH0=time_1ms>>8;
TR0=1;//定时器赋值,并开启
} void timer0_isr() interrupt 1
//定时器0 {
uchar endpoint;
a=Data_m_PC;
b=Data_a_PC;
endpoint=a|b;
Data_m_Device=a;
Data_a_Device=b;//第一次采样后,每1ms再采样,数据传给Device ,同上
if(!endpoint)
{ TR0=0;
}//判定截止
TL0=time_1ms;
TH0=time_1ms>>8;//采一次后再赋初值,重新定时1ms,直到采到截止
} void main() {
Port_Init(); //初使化
EA=1;
//打开总中断
EX0=1; //允许外部0中断
IT0=1; //INT0为边沿触发
/*while(1)
{
}
*/
} 上面的程序在单片机上跑时,信号源给的是2ms的方波周期信号,理论上讲,输出的也应该是这样的方波信号。但输出管脚却不是这样的信号,为不连续的方波,时有时无,且占空比也不是输入的那样。一个理解是有中断进入后,因为程序执行时间的关系,可能造成采样错误,但我晶振12MHz,指令周期1us,不知道是不是有影响;另外一个理解就是我采用的是中断嵌套,是不是在这一块出问题了,造成采不到所有数据? 跪求大侠详解,急! |