急!!!!! 跟踪一下WM_TIMER消息,注意返回值,你会发现变速齿轮的秘密 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Windows的定时器最大分辨率是55毫秒,即每秒钟最多有18次激活定时器。你要0.1毫秒就来一下,那是,......不可能的——哭也没用 void Ddelay(unsigned long n) // 延时函数,n单位:us{unsigned long Told;unsigned long nn,old_Clock, new_Clock, low, high, v_8253;unsigned long old_8253, new_8253, int_Time; nn =(unsigned long)((float)n*1000/840); // nn单位: 840ns */_outp(0x43,0x00); // 锁定8253计数值low = _inp(0x40); // 读取8253计数值high = _inp(0x40);v_8253 = low + 256 * high;old_8253 = v_8253;old_Clock=clock();Told=old_Clock;int_Time=0;while(int_Time < nn){_outp(0x43,0x00);low = _inp(0x40);high = _inp(0x40);v_8253 = low + 256 * high;new_8253 = v_8253;new_Clock=clock();if(old_8253< new_8253 && new_Clock-Told< 55) int_Time=(old_8253-new_8253)+((new_Clock-old_Clock)/55+1)*65536lu; else int_Time=(old_8253-new_8253)+ ((new_Clock-old_Clock)/55) * 65536lu; Told=new_Clock;}}若步进电机工作频率为400HZ,则发送num个脉冲的程序段如下:send_pio=0x00; // 初始化待发送的数据_outp(0x360,0x8a); // 初始化8255for(i=0;i< num;i++){ send_pio & = 0xfd; //d0位为脉冲输出位 _outp(0x366,send_pio); // 输出低电平 Ddelay(1250); // 延时半个周期 send_pio | = 0x01; _outp(0x366,send_pio); // 输出高电平 Ddelay(1250); // 延时半个周期另利用该方法可以求出某段程序代码精确的执行时间。程序段如下:unsigned t1,t2,t3,T1,T2,T;_outp(0x43,0x00); // 锁定8253计数值t1=_inp(0x40)+256*_inp(0x40); // 读取8253计数值T1=clock(); …… // 待计时的程序段_outp(0x43,0x00);t2=_inp(0x40)+256*_inp(0x40);T2=clock();if(t1< t2 && T2-Told >55) t3=t1-t2+(T2-T1+1)*65536; else t3=t1-t2+(T2-T1)*65536; T=840*t3; // T即为程序的执行时间 急!如何在代码中设置shockwaveflash控件的背景为透明 驱动中如何访问PCI设备的资源? 如果数据太小怎么办? 编辑完CListCtrl的一列后,按TAB键到下一列继续编辑,如何实现? 一个类的成员里有Data Members与函数有什么区别? 急救命啊,C++ Primer问题 谁提供我一些有关PKI认证的资料,我立即给分。 大家帮忙看看这段程序怎么要出错呢?在线等待,解决立即给分! 位图显示问题,急!!!高手请Help me!!! 可以给一个static加入响应函数吗? 有个mpeg的解压函数库,谁能帮我看看怎么用? 比较急得菜鸟问题,请指教。
Windows的定时器最大分辨率是55毫秒,即每秒钟最多有18次激活定时器。你要0.1毫秒就来一下,那是,......不可能的——哭也没用
{
unsigned long Told;
unsigned long nn,old_Clock, new_Clock, low, high, v_8253;
unsigned long old_8253, new_8253, int_Time; nn =(unsigned long)((float)n*1000/840); // nn单位: 840ns */
_outp(0x43,0x00); // 锁定8253计数值
low = _inp(0x40); // 读取8253计数值
high = _inp(0x40);
v_8253 = low + 256 * high;
old_8253 = v_8253;
old_Clock=clock();
Told=old_Clock;
int_Time=0;
while(int_Time < nn)
{
_outp(0x43,0x00);
low = _inp(0x40);
high = _inp(0x40);
v_8253 = low + 256 * high;
new_8253 = v_8253;
new_Clock=clock();
if(old_8253< new_8253 && new_Clock-Told< 55)
int_Time=(old_8253-new_8253)+
((new_Clock-old_Clock)/55+1)*65536lu;
else
int_Time=(old_8253-new_8253)+
((new_Clock-old_Clock)/55) * 65536lu;
Told=new_Clock;
}
}
若步进电机工作频率为400HZ,则发送num个脉冲的程序段如下:
send_pio=0x00; // 初始化待发送的数据
_outp(0x360,0x8a); // 初始化8255
for(i=0;i< num;i++){
send_pio & = 0xfd; //d0位为脉冲输出位
_outp(0x366,send_pio); // 输出低电平
Ddelay(1250); // 延时半个周期
send_pio | = 0x01;
_outp(0x366,send_pio); // 输出高电平
Ddelay(1250); // 延时半个周期
另利用该方法可以求出某段程序代码精确的执行时间。程序段如下:
unsigned t1,t2,t3,T1,T2,T;
_outp(0x43,0x00); // 锁定8253计数值
t1=_inp(0x40)+256*_inp(0x40); // 读取8253计数值
T1=clock();
…… // 待计时的程序段
_outp(0x43,0x00);
t2=_inp(0x40)+256*_inp(0x40);
T2=clock();
if(t1< t2 && T2-Told >55)
t3=t1-t2+(T2-T1+1)*65536;
else t3=t1-t2+(T2-T1)*65536;
T=840*t3; // T即为程序的执行时间