[mw_shl_code=c,true]//程序目的使用定时器进行准确延时,使LED闪烁。 流程;延时每次都会进入中断关闭计数器,在下一次进入中断时再打开计数器。通过改变计数器初值改变时间延迟。
//仿真现象;LED灯不闪烁,程序按照顺序进行,每次都会进入中断,但定时器不定时???
#include"stm8s103k3.h"
_Bool LED1 @PC_ODR:2;
void t1_delay_us(unsigned t_us);
unsigned int n=0;
void TIM1_Init(unsigned us);
void GPIO_Init(void);
main()
{
_asm("sim");
GPIO_Init();//初始化GPIO
while (1)
{
LED1=1;//灯亮
t1_delay_us(50000);//延时
LED1=0; //灯灭
t1_delay_us(50000);//延时
}
}
@far @interrupt void TIM1_OVER_Int(void)
{
TIM1_SR1 = 0x00;//中断标志位清零
n=1;//进入中断判断位
TIM1_CR1&=0XFE;//关计算器
}
void GPIO_Init(void)
{
PC_DDR = 0x04;
PC_CR1 = 0x06;
PC_CR2 = 0x02;
}
void TIM1_Init(unsigned us)
{
TIM1_PSCRH = 0;
TIM1_PSCRL = 19;
TIM1_ARRH=(unsigned char)(us>>8);//自动重载
TIM1_ARRL=(unsigned char)us;
TIM1_IER=0X01;
TIM1_CNTRH=(unsigned char)(us>>8);//赋初值
TIM1_CNTRL=(unsigned char)us;
_asm("rim");//开总中断
TIM1_CR1 |=0x01;//开计数器
}
void t1_delay_us(unsigned int t_us)
{
TIM1_Init(t_us);
while(n!=1);//判断是否进入中断,如果进入n清零,方便下一一次判断。
n=0;
} [/mw_shl_code]
求助定时器准确延时函数t1_delay_us(unsigned t_us)函数!!!本人菜鸟,有可能程序思路出错。如果t1_delay_us(unsigned t_us)可行,想问一下定时误差多大??? |