关于单片机定时器的问题,求解!
代码1;
延时1ms;
然后执行代码2;
延时1.5ms;
然后执行代码3;
延时1.7ms;
然后执行其他代码;
请问这样用单片机内部定时器怎么实现? 注:不用软件延时。
用定时器定时0.1秒,或者0.01秒,多循环几次不就行了,找公约数。
一般延时有两种写法,即阻塞和非阻塞两种。下面我提供些思路,你自己完善一下应该就可以了。
//=========================================================
// 延时的阻塞写法
//=========================================================
阻塞的延时就是,你调用延时函数之后,程序就卡在延时函数里,只有当延时时间到达
程序才能继续往下走。一般可以用软件的循环语句来写,当然也可以用定时器。如下面的两
个例子:
/*
软件延时--阻塞模式
*/
vloid delay(void)
{
//通过while,for等循环语句让cpu空转,从而达到延时。
}
/*
定时器延时--阻塞模式
*/
unsigned int g_ncount = 0;/*定义一个全局变量,用于计时*/
//定时器初始化
void init_timer(void)
{
//关键代码:写上定时一个适合的时间片,比如100us。
}
//定时器中断
void Isr_timer(void) interrupt 1
{
//关键代码:写上g_ncount --;
}
//延时函数
void delay(int dx)
{
g_ncount=dx;
while(g_ncount);
}
//=========================================================
// 延时的非阻塞写法
//=========================================================
非阻塞延时就是,在你调用延时函数后,cpu转而去做别的事情,当延时时间到达,cup回到
延时函数的下一行继续执行。这样做到好处是显而易见的,由于没有阻塞,不会因为你调用延时
而影响其他任务的执行,充分提高了cpu的效率。一般我们用状态机实现。
/*
定时器延时--非阻塞模式
*/
unsigned int g_states = 0; /义全局变量,用于保存状态*/
unsigned int g_ncount = 0;/*定义一个全局变量,用于计时*/
//定时器初始化
void init_timer(void)
{
//关键代码:写上定时一个适合的时间片,比如100us。
}
//定时器中断
void Isr_timer(void) interrupt 1
{
//关键代码:写上g_ncount --;
}
//延时的使用
switch(g_states)
{
case 0:
{
//添加代码1
....
g_ncount = 10;
g_states = 1; //切换到延时状态
}break;
case 1:
{
if(g_states == 0)
{
g_ncount = 0;l
g_sattes = 2;//跳转到代码段2
}
}break;
case 2:
{
}break;
..
}