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