/*************************************************************
单片机中断头文件
实现功能:单片机中断的控制控制
补充说明:
***************************************************************/
#ifndef _INTERRUPT_H_
#define _INTERRUPT_H_
#include<reg52.h>
#include<LCD1602.h>
#define uchar unsigned char
#define uint unsigned int
/**********************引脚定义************************/
sbit key_z=P3^2; //霍尔输入引脚
sbit moto =P3^7; //电机控制引脚
/**********************变量定义************************/
uchar T0_num; //定时器0计数变量
uint T1_num; //定时器1计数变量
uint ii=0; //用于控制电机PWM输出
extern uint Wait; //等待时间
extern uint mil; //行驶里程
extern bit strat_f; //初始界面显示标志,=0显示初始界面,=1可能计价、设置、总价显示
extern bit start; //开始计价标志,=0非计价模式,=1计价模式
bit f; //回到初始界面标志,=0非首次回到初始界面,=1首次回到初始界面
uchar vs=5; //转速等级,4~9;
uint numss; //记录两次霍尔感应的间隔
bit mil_f=0; //=1,检测到霍尔信号标志
bit wait_f=1; //=0,等待1S标志
/********************************************************
函数名称:void delayms(uint ms)
函数作用:毫秒延时函数
参数说明:
********************************************************/
void delayms(uint ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
/*********************************************************
函数名称:void T0_init()
函数作用:定时器0初始化函数
参数说明:
*********************************************************/
void T0_init()
{
EA=1; //开总中断
ET0=1; //定时器T0中断允许
TMOD=0x11; //使用定时器T0、T1的模式1
TH0=(65536-50000)/256; //定时器T0的高8位赋初值
TL0=(65536-50000)%256; //定时器T0的低8位赋初值
TR0=0; //关闭定时器0
ET1=1; //定时器T1中断允许
TH1=(65536-1500)/256; //定时器T1的高8位赋初值
TL1=(65536-1500)%256; //定时器T1的低8位赋初值
TR1=0; //关闭定时器1
}
/*********************************************************
函数名称:void Int0_init()
函数作用:外部中断0初始化函数
参数说明:
*********************************************************/
void Int0_init()
{
EA=1; //开放总中断
IT0=1; //下降沿触发
EX0=0; //关闭外部中断0
}
/*********************************************************
函数名称:void T0_interrupt(void) interrupt 1 using 0
函数作用:定时器0中断处理函数
参数说明:定时50ms中断一次
*********************************************************/
void T0_interrupt(void) interrupt 1 using 0
{
TH0=(65536-50000)/256; //定时器T0的高8位重新赋初值
TL0=(65536-50000)%256; //定时器T0的低8位重新赋初值
T0_num++; //计数变量+1
if(T0_num==20) //定时20*50ms=1s
{
T0_num=0; //重置计数变量
if(Wait<5999)
Wait++; //等待时间+1s
wait_f=1; //标记1S完成
}
}
/*********************************************************
函数名称:void T1_interrupt(void) interrupt 3
函数作用:定时器1中断处理函数
参数说明:定时15ms中断一次
转速等级:转速等级vs越大,一个PWM周期内输出低电平时间越长,
转速越快;vs变小,一个PWM周期内输出低电平时间减
短,转速变慢。
*********************************************************/
void T1_interrupt(void) interrupt 3
{
TH1=(65536-1500)/256; //定时器T1的高8位重新赋初值
TL1=(65536-1500)%256; //定时器T1的低8位重新赋初值
if(start==0) //处于非计价模式
{
T1_num++; //计数变量+1
if(T1_num==13000) //定时13000*15ms=19.5s
{
T1_num=0; //重置计数变量
strat_f=0; //恢复到初始界面
f=1; //标记首次恢复到初始界面
TR1=0; //关闭定时器1
}
}
else //计价模式下
{ //PWM控制电机转速
if(ii>vs) //计数变量ii大于转速等级
moto=1; //输出高电平,电机停止
else
moto=0; //输出低电平,电机转动
ii++; //计数变量+1
if(ii>9) //计数变量【大于9】
ii=0; //重置计数变量
}
numss++; //两次霍尔感应间隔时间计数+1
}
/*********************************************************
函数名称:void init0(void) interrupt 0
函数作用:外部中断0中断处理函数
参数说明:
*********************************************************/
void init0(void) interrupt 0
{
if(key_z==0&&numss>200)//再次确认霍尔感应,并且距上一次感应的时间足够长,如果过短认为是波动放弃处理
{
if(mil<999)
mil++; //行驶里程+0.1km
numss=0; //重置两次霍尔感应间隔时间
mil_f=1; //标记检测到霍尔信号
}
}
#endif
|