#define MOTOR_ON() PB3=0
#define MOTOR_OFF() PB3=1
#define SYNC PB0 //零点检测
#define HEAT_ON() PORTAbits.PA6=0
#define HEAT_OFF() PORTAbits.PA6=1
#define uint unsigned int
#define uchar unsigned char
#define Half_Cycle 100
//马达结构体初始化
struct
{
uchar MOT_ZeroCroFlag :1; //过0标志位
uchar MOT_FLAG :1; //马达工作标志位
uchar :6;
uchar MOT_cnt; //马达计数
}MOT={0,0,0,0};
//硬件初始化
void HARD_INIT()
{
IOSTB = 0xF1; //PB1 PB2 PB3输出
//输出IO应用全关
MOTOR_OFF();
MOT.MOT_FLAG = 0;
//定时器0 1US 溢出一次要50us
TMR0 = 0XCE; //206
T0MD = C_PS0_Div4;
PCON1 = C_TMR0_En; //打开定时器0
INTE |= C_INT_TMR0;
//定时器1初始值为1000;
TMRH = C_TMR1_Data_b9 | C_TMR1_Data_b8;
TMR1 = 0xe8;
T1CR1 = C_TMR1_En | C_TMR1_Reload; //打开定时器 自动重装
T1CR2 = C_PS1_Div4; //四分频
INTE |= C_INT_TMR1; //使能定时器1中断
}
void Delay_ms(uint delay_time) //延迟函数
{
flag.time_delay_flag = 1;
time_num = delay_time;
while(time_num ); //等待标志位置0退出循环
flag.time_delay_flag = 0;
}
void Delay_50us(uchar delay_us)
{
flag.time_delay_flag = 1;
time_num = delay_us ;
while(time_num); //等待标志位置0退出循环
flag.time_delay_flag = 0;
}
//--------------- Global Definition ----------------------------------------
//--------------------------------------------------------------------------
//uint time_ms = 0;
//外部中断初始化
void INT0_Init()
{
INTEDG = C_INT0_En |C_INT0_FallingEdge ; //下降沿触发 外部中断0
INTE |= 0x04; //使能INT0中断
}
//定时器0初始化
void Time0_Init()
{
//定时器0 初始值155 4分频 4M/4 = 1M = 1US 溢出一次要50us
TMR0 = 0XCE; //206
T0MD = C_PS0_Div4;
PCON1 = C_TMR0_En; //打开定时器0
INTE |= C_INT_TMR0;
}
void Timer4_Init()
{
T4CR1 = 0x00;
TM4RH = 0x00;
TMR4 = 0x64; //赋初值0x64=100,下数到0产生下溢中断的时间为(100-0)*1us = 100us
T4CR1 = C_TMR4_Reload | C_TMR4_En;
T4CR2 = C_TMR4_ClkSrc_Inst | C_PS4_Div4; //4分频
INTE2bits.T4IE = 1; //打开定时器4
}
//定时器1初始化
void Time1_Init()
{
//定时器1初始值为1000;
TMRH = C_TMR1_Data_b9 | C_TMR1_Data_b8;
TMR1 = 0xe8;
T1CR1 = C_TMR1_En | C_TMR1_Reload; //打开定时器 自动重装
T1CR2 = C_PS1_Div4; //四分频
INTE |= C_INT_TMR1; //使能定时器1中断
}
void Motor_StartSoftlyCallBack(void)
{
if(MOT.MOT_ZeroCroFlag)
{
if(MOT.MOT_cnt < Half_Cycle) //第一次过零点出现,进入负半周期操作(<=10ms)
{
//想要控制马达功率,只需要修改下面值即可,周期为20ms
if(MOT.MOT_cnt == 5)MOTOR_ON(); //开启脉冲信号 //30
if(MOT.MOT_cnt == 95)
{
MOTOR_OFF(); //在过零点前关闭脉冲信号
}
}
else //第二次过零点出现,进入正半周期操作(>10ms & <= 20ms)
{
if(MOT.MOT_cnt == 105)MOTOR_ON(); //开启脉冲信号 //130
if(MOT.MOT_cnt == 195)
{
MOTOR_OFF(); //在过零点前关闭脉冲信号
INTE2bits.T4IE = 0; //关闭定时器4
MOT.MOT_cnt = 0;
MOT.MOT_ZeroCroFlag = 0;
}
}
}
}
void Wait_SyncSignal()//等待同步信号
{
while(SYNC == 0);
//CLRWDT();
while(SYNC == 1);
//CLRWDT();
}
//--------------- Main function --------------------------------------------
//--------------------------------------------------------------------------
void main(void)
{
Time0_Init();
Time1_Init();
INT0_Init();*/
ENI(); //打开中断总开关
while(1)
{
//红外感应到马达工作
if(MOT.MOT_FLAG) //马达工作
{
Mot_Dri();
}
}
}
//--------------------------------------------------------------------------
//1s处理
void time_1s_handle()
{
time_100ms = 0;
time_1s++;
if(MOT.MOT_FLAG) //马达仍在工作
{
if((--time_work_t) == 0) //没障碍后 三秒停止工作
MOT.MOT_FLAG = 0;
}
}
void isr(void) __interrupt(0)
{
//定时器0
if(INTFbits.T0IF)
{
TMR0 = 0XCE;
if(LED_Flash)
LED_MODE_CH();
if(flag.time_delay_flag)
{
time_num--;
}
INTFbits.T0IF = 0;
}
//定时器1
if(INTFbits.T1IF)
{
time_1ms++;
if(flag.time_delay_ms_flag)
{
time_num--;
}
if(time_1ms == 10)
{
time_10ms_handle();
if(time_10ms == 10)
{
time_100ms_handle();
if(time_100ms == 10)
{
time_1s_handle();
//每隔十秒工作三秒
/*
if(time_1s == 10)
{
MOT.MOT_FLAG? MOT.MOT_FLAG = 0:else MOT.MOT_FLAG = 1;
time_1s = 0;
}
*/
}
}
}
INTFbits.T1IF = 0;
}
if(INTFbits.INT0IF)
{
if( MOT.MOT_FLAG )
{
MOT.MOT_ZeroCroFlag = 1; //过0标志位
MOT.MOT_cnt = 0;
Timer4_Init();
}
INTFbits.INT0IF = 0;
}
if(INTE2bits.T4IF)
{
INTE2bits.T4IF = 0;
if(MOT.MOT_ZeroCroFlag)MOT.MOT_cnt++;
if(MOT.MOT_cnt > 200)MOT.MOT_cnt = 0;
if(flag.Heat_flag)
HEAT_ON();
else
HEAT_OFF();
Motor_StartSoftlyCallBack(); //motor start
}
}
//---------------------------------------------------------