DOS下面关于精确延时1ms的函数(理论上可以非常精确延时到10微妙级别)
2009-01-13 15:02
741 查看
在微软的MSC7.0以及MSVC1.52下面都没有Borland C++的精确延时函数:delay(经过测试可以非常精确的延时到1ms)
同时看了一下计时器的相关内容,自己写了一个精确延时函数,但不敢保证在所有的电脑上都可以精确延时
源代码:
/***
*void xdelay(unsigned int ms)
*
*Purpose:
* Make an exactly millisecond delay
*
*Entry:
* unsigned int ms - The delay time (millisecond)
*
*Exit:
* void
*
*Exceptions:
* Note:
* .This function was created by Denny at Jun/26/2008
* .Dongguan Siliten Electronics CO., LTD.
* .The timer frequency is 1193180Hz
* .The timer counter is 16bits, so only elapsed 55ms for/
* counter a circle.
*
*******************************************************************************/
void xdelay(unsigned int ms)
{
unsigned int base_counter;
unsigned int circle;
unsigned int counter;
unsigned int last_counter;
unsigned long end;
unsigned long cur;
disable();
//outportb(0x43, 0x30);
base_counter = inportb(0x40);
base_counter += inportb(0x40)<<8;
enable();
circle = 0;
last_counter = 0;
end = (unsigned long)ms*1193;
cur = 0;
while (end > cur)
{
disable();
counter = inportb(0x40);
counter += inportb(0x40)<<8;
enable();
counter = base_counter - counter;
if (counter-last_counter > 50) // Illegal data
{
last_counter = counter;
continue;
}
if ( (counter < last_counter) && (last_counter > 65000) && (counter < (65536-65000)) )
circle++;
cur = ((unsigned long)circle<<16) + counter;
//printf("base:%u|cir:%u|cnt:%u|last:%u|end:%lu|cur:%lu/n", base_counter, circle, counter, last_counter, end, cur);
last_counter = counter;
}
}
下面是测试程序:
ClrScr();
for (i = 0; i < 5; i++)
{
printf("delay(1000):%d/r/n", i);
for (j = 0; j < 1; j++)
delay(1000);
}
for (i = 0; i < 5; i++)
{
printf("delay(100):%d/r/n", i);
for (j = 0; j < 10; j++)
delay(100);
}
for (i = 0; i < 5; i++)
{
printf("delay(10):%d/r/n", i);
for (j = 0; j < 100; j++)
delay(10);
}
for (i = 0; i < 5; i++)
{
printf("delay(1):%d/r/n", i);
for (j = 0; j < 1000; j++)
delay(1);
}
同时看了一下计时器的相关内容,自己写了一个精确延时函数,但不敢保证在所有的电脑上都可以精确延时
源代码:
/***
*void xdelay(unsigned int ms)
*
*Purpose:
* Make an exactly millisecond delay
*
*Entry:
* unsigned int ms - The delay time (millisecond)
*
*Exit:
* void
*
*Exceptions:
* Note:
* .This function was created by Denny at Jun/26/2008
* .Dongguan Siliten Electronics CO., LTD.
* .The timer frequency is 1193180Hz
* .The timer counter is 16bits, so only elapsed 55ms for/
* counter a circle.
*
*******************************************************************************/
void xdelay(unsigned int ms)
{
unsigned int base_counter;
unsigned int circle;
unsigned int counter;
unsigned int last_counter;
unsigned long end;
unsigned long cur;
disable();
//outportb(0x43, 0x30);
base_counter = inportb(0x40);
base_counter += inportb(0x40)<<8;
enable();
circle = 0;
last_counter = 0;
end = (unsigned long)ms*1193;
cur = 0;
while (end > cur)
{
disable();
counter = inportb(0x40);
counter += inportb(0x40)<<8;
enable();
counter = base_counter - counter;
if (counter-last_counter > 50) // Illegal data
{
last_counter = counter;
continue;
}
if ( (counter < last_counter) && (last_counter > 65000) && (counter < (65536-65000)) )
circle++;
cur = ((unsigned long)circle<<16) + counter;
//printf("base:%u|cir:%u|cnt:%u|last:%u|end:%lu|cur:%lu/n", base_counter, circle, counter, last_counter, end, cur);
last_counter = counter;
}
}
下面是测试程序:
ClrScr();
for (i = 0; i < 5; i++)
{
printf("delay(1000):%d/r/n", i);
for (j = 0; j < 1; j++)
delay(1000);
}
for (i = 0; i < 5; i++)
{
printf("delay(100):%d/r/n", i);
for (j = 0; j < 10; j++)
delay(100);
}
for (i = 0; i < 5; i++)
{
printf("delay(10):%d/r/n", i);
for (j = 0; j < 100; j++)
delay(10);
}
for (i = 0; i < 5; i++)
{
printf("delay(1):%d/r/n", i);
for (j = 0; j < 1000; j++)
delay(1);
}
相关文章推荐
- 逆向BC3.1的程序后得到DOS下面关于精确延时1ms的函数(理论上可以非常精确延时到10微妙级别)
- [C/C++] 可以在DOS 下面设置延时的文件源码
- 开辟一个二维数组,有10*8个元素,用随机数填充,按照下面的方法用函数实现查找一个数是否存在
- c++计算程序运行时间的函数,怎么才能精确到微妙级呢?
- 20140627-STM8L101F3P6关于微秒级延时函数不同写法的波形
- STM32精确延迟1us和1ms的函数
- 51单片机非精确延时函数
- 关于函数指针和指针函数的理论知识
- 关于unity自带延时函数
- avr-gcc中关于delay延时函数的应用(原发于2007-11-16)
- 一、 找出函数中存在的问题。以下题目均在Lab05项目中完成。2、 找出项目中存在的缺陷,并给出解决的方案(至少3个,不包含下面那个举例)。 说明:这里所说的缺陷不一定都是错误,而是明显需要改进的地方。 如:不可以无限输入密码,容易被暴力破解,存在安全隐患。
- 关于PHP-Zend framework2 框架 学习过程。 阅前须知: ZF2中的配置文件是可以静态文件配置来注册和通过相关函数动态注册。 1.EventManager(事件驱动),关于事件驱动,在ZF2相关资料没有详细说明,可以参考ANDROID的事件驱动,MFC的消息响应/事件驱动。
- 认识PHP代码标识 想在页面中编写PHP代码非常容易,如下面代码: <?php echo "想学习php吗?来慕课网吧"; ?> 就像你可以编写JavaScript脚本语言需要写在<scri
- 关于C++中操作符重载的疑问 :四个运算符=, ->, [], ()不可以重载为全局函数(友员函数)
- STM32中通过普通延时函数来精确延时
- 关于51精确延时及keil仿真延时时间
- 关于vs 2005的一个O2级别函数调用的一个编译器优化(我是汇编小白)
- 51单片机非精确延时函数
- 精确延时函数DelayTime .
- 关于linux中的延时函数