你是用的uvision吧?我用的uvision4,把程序编好运行,然后进行调试(在此要设置两个断点就是一个在Delay延时函数之前,一个断点设在延时之后),然后你会在左边register栏会看见一个 sec:000014182 这个就是软件运行到断点处所用时间,然后再运行一次(这次就是运行完延时函数所用时间)。你把两次的时间做差值就是延时函数延时时间。再附图两张。
这个延时关键看使用的晶振多大,比如12M晶振for(j=0;j<120;j++);大概延时1毫秒,110592M晶振那么for(j=0;j<110;j++);延时1毫秒,你这里的for(j=0;j<100;j++);延时1毫秒的话,晶振应该是10M,不太常见哟,特别是在单片机方面。
delay(u16 i)
{
while(i--); //这里就是当i减1不为0时一直做减1运算,知道i为0跳出循环。
}
想当于:
delay(u16 i)
{
while(i--)
{
;
}
}
你要搞懂中断的含义,如果你想中断延时 有个方法可以使用下
当中断产生的时候,进入中断服务函数处理中断程序时,你可以延时你想要延时的时间。处理完毕再回到原程序,这样就达到了延时的目的,不过这是画蛇添足。
如果你是想一段时候后让MCU做什么事,那就是定时用法了,与延时没什么关系。
中断服务函数越简单越好
void main()
{
if(s19==0) //判断按键是否按下,s19是个开关
delay(10); //等待再次判断,以防误 *** 作,去抖
if(s19==0)
{P1=0x7f; }
}
这个这样写不行呀,这样只会执行一次呀。延时没有问题
void main()
{
while(1)
{
if(s19==0) //判断按键是否按下,s19是个开关
{
delay(10); //等待再次判断,以防误 *** 作,去抖
if(s19==0)
{P1=0x7f; }
}
}
}
楼主呀, {P1=0x7f; }这个里面要有多的延时呀,没有的话自然没有了呀。你换成:
{P1=0x7f;delay(100); }肯定有的啦。
其实这个你自己可以单步调试出来得呀。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)