初级会员

- 积分
- 100
- 金钱
- 100
- 注册时间
- 2019-4-24
- 在线时间
- 16 小时
|

楼主 |
发表于 2019-8-29 10:14:49
|
显示全部楼层
void Timer1_Init(void)
{
TCCR1A |=(1<<COM1B1)|(1<<WGM11)|(1<<WGM10); //0B00100011 OC1A作I/O用,OC1B输出PWM
TCCR1B |=(1<<ICNC1)|(1<<ICES1)|(1<<WGM13)|(1<<WGM12)|(1<<CS10); //0B11011001 噪声抑制,上升沿输入捕捉,快速PWM,1分频
//TIMSK |=(1<<TICIE1);
OCR1A = 0xffff; //TOP=TCNT1值,TM1从0计数到TOP
OCR1B = Min_PWM_D; //占空比=0
}
int main(void)
{
Port_Init(); //端口初始化
Timer0_Init(); //TMR0初始化
Timer1_Init(); //TMR1初始化
//
uSF.S_Flag = 0; //清状态共用体标志
uTSF.T_SET_Flag=0; //清时间设置共用体标志
//
Interrupt_Init(); //中断初始化
while (1)
{
//
if(uSF.bit.TC1_End_f==1)
{
uDISP.speed=Vx/T_Num; //转速=转速系数/T_Num (T_Num:脉冲数)
uSF.bit.TC1_End_f=0; //清IC1捕捉完成标志
PORTB ^=(1<<LED_Fwd);
}
if(uSF.bit.T_500mS_f==1) //500mS时间到
{
TIMSK |=(1<<TICIE1); //开IC1输入捕捉中断
uSF.bit.T_500mS_f=0; //清500mS时间到标志
}
}
}
/***********中断程序************************/
//外部中断0
/*ISR(INT0_vect)
{
eeprom_CiShu_data_write (); //掉电时“次数”数据写入(上电时读出)
}*/
//timer0 溢出中断(设置20mS中断一次,能使LCD更新等操作正常进行)
ISR(TIMER0_OVF_vect)
{
TCNT0 = T0_INIT; //T0初值
T0_count++;
if(T0_count>=25)
{
mS_count++; //500mS+1
uSF.bit.T_500mS_f=1; //置500mS定时到标志
T0_count=0;
if(mS_count>=2)
{
second++; //秒+1
re_sec++; //秒记录+1
mS_count=0;
uSF.S_Flag ^=0b00000001; //等秒取反
if(uSF.bit.T_XR_f) ////////////////////////////////////////
{
PORTB |=(1<<LED_Fwd); //正转LED亮///////////////////////////////////
}
else
{
PORTB &=(0<<LED_Fwd); //正转LED亮///////////////////////////////////
}
}
}
//LCD_Set_Flash(); //设置闪烁
//LCD_Display_Update(); //LCD上8*16数字更新
}
//timer1 溢出中断(溢出次数记录)
ISR(TIMER1_OVF_vect)
{
T1_count++; //TM1中断计数+1
/*if(uSF.bit.T_XR_f) ////////////////////////////////////////
PORTB |=(1<<LED_Rev); //正转LED亮///////////////////////////////////
else PORTB &=(0<<LED_Rev);*/
}
//IC1 输入捕获中断(测量周期脉冲数)
ISR(TIMER1_CAPT_vect)
{
static uint IC1Temp1 = 0; //第一个IC1捕捉值
static uint IC1Temp2 = 0; //第二个IC1捕捉值
if(uSF.bit.IC1_1st_f == 0) //IC1首次捕捉?
{
IC1Temp1 = ICR1; //存第1次事件
T1_count=0; //清TM1中断计数
uSF.bit.IC1_1st_f =1; //置IC1首次捕捉标志
}
else
{ //第二次事件
TIMSK &=(0<<TICIE1); //IC1输入捕捉中断禁止
IC1Temp2 = ICR1; //存第2次事件
T_Num = (IC1Temp2-IC1Temp1) + T1_count*65536;
uSF.bit.IC1_1st_f =0; //清IC1首次捕捉标志
uSF.bit.TC1_End_f=1; //置IC1捕捉完成标志
}
}
|
|