|
/*************************************************************
單片機中斷頭文件
實現(xiàn)功能:單片機中斷的控制控制
補充說明:
***************************************************************/
#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計數(shù)變量
uint T1_num; //定時器1計數(shù)變量
uint ii=0; //用于控制電機PWM輸出
extern uint Wait; //等待時間
extern uint mil; //行駛里程
extern bit strat_f; //初始界面顯示標(biāo)志,=0顯示初始界面,=1可能計價、設(shè)置、總價顯示
extern bit start; //開始計價標(biāo)志,=0非計價模式,=1計價模式
bit f; //回到初始界面標(biāo)志,=0非首次回到初始界面,=1首次回到初始界面
uchar vs=5; //轉(zhuǎn)速等級,4~9;
uint numss; //記錄兩次霍爾感應(yīng)的間隔
bit mil_f=0; //=1,檢測到霍爾信號標(biāo)志
bit wait_f=1; //=0,等待1S標(biāo)志
/********************************************************
函數(shù)名稱:void delayms(uint ms)
函數(shù)作用:毫秒延時函數(shù)
參數(shù)說明:
********************************************************/
void delayms(uint ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
/*********************************************************
函數(shù)名稱:void T0_init()
函數(shù)作用:定時器0初始化函數(shù)
參數(shù)說明:
*********************************************************/
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; //關(guān)閉定時器0
ET1=1; //定時器T1中斷允許
TH1=(65536-1500)/256; //定時器T1的高8位賦初值
TL1=(65536-1500)%256; //定時器T1的低8位賦初值
TR1=0; //關(guān)閉定時器1
}
/*********************************************************
函數(shù)名稱:void Int0_init()
函數(shù)作用:外部中斷0初始化函數(shù)
參數(shù)說明:
*********************************************************/
void Int0_init()
{
EA=1; //開放總中斷
IT0=1; //下降沿觸發(fā)
EX0=0; //關(guān)閉外部中斷0
}
/*********************************************************
函數(shù)名稱:void T0_interrupt(void) interrupt 1 using 0
函數(shù)作用:定時器0中斷處理函數(shù)
參數(shù)說明:定時50ms中斷一次
*********************************************************/
void T0_interrupt(void) interrupt 1 using 0
{
TH0=(65536-50000)/256; //定時器T0的高8位重新賦初值
TL0=(65536-50000)%256; //定時器T0的低8位重新賦初值
T0_num++; //計數(shù)變量+1
if(T0_num==20) //定時20*50ms=1s
{
T0_num=0; //重置計數(shù)變量
if(Wait<5999)
Wait++; //等待時間+1s
wait_f=1; //標(biāo)記1S完成
}
}
/*********************************************************
函數(shù)名稱:void T1_interrupt(void) interrupt 3
函數(shù)作用:定時器1中斷處理函數(shù)
參數(shù)說明:定時15ms中斷一次
轉(zhuǎn)速等級:轉(zhuǎn)速等級vs越大,一個PWM周期內(nèi)輸出低電平時間越長,
轉(zhuǎn)速越快;vs變小,一個PWM周期內(nèi)輸出低電平時間減
短,轉(zhuǎn)速變慢。
*********************************************************/
void T1_interrupt(void) interrupt 3
{
TH1=(65536-1500)/256; //定時器T1的高8位重新賦初值
TL1=(65536-1500)%256; //定時器T1的低8位重新賦初值
if(start==0) //處于非計價模式
{
T1_num++; //計數(shù)變量+1
if(T1_num==13000) //定時13000*15ms=19.5s
{
T1_num=0; //重置計數(shù)變量
strat_f=0; //恢復(fù)到初始界面
f=1; //標(biāo)記首次恢復(fù)到初始界面
TR1=0; //關(guān)閉定時器1
}
}
else //計價模式下
{ //PWM控制電機轉(zhuǎn)速
if(ii>vs) //計數(shù)變量ii大于轉(zhuǎn)速等級
moto=1; //輸出高電平,電機停止
else
moto=0; //輸出低電平,電機轉(zhuǎn)動
ii++; //計數(shù)變量+1
if(ii>9) //計數(shù)變量【大于9】
ii=0; //重置計數(shù)變量
}
numss++; //兩次霍爾感應(yīng)間隔時間計數(shù)+1
}
/*********************************************************
函數(shù)名稱:void init0(void) interrupt 0
函數(shù)作用:外部中斷0中斷處理函數(shù)
參數(shù)說明:
*********************************************************/
void init0(void) interrupt 0
{
if(key_z==0&&numss>200)//再次確認(rèn)霍爾感應(yīng),并且距上一次感應(yīng)的時間足夠長,如果過短認(rèn)為是波動放棄處理
{
if(mil<999)
mil++; //行駛里程+0.1km
numss=0; //重置兩次霍爾感應(yīng)間隔時間
mil_f=1; //標(biāo)記檢測到霍爾信號
}
}
#endif
|
|