欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
大神能講一下這個單片機里程計數中斷程序原理嗎
[打印本頁]
作者:
ac133
時間:
2020-5-8 13:36
標題:
大神能講一下這個單片機里程計數中斷程序原理嗎
/*************************************************************
單片機中斷頭文件
實現功能:單片機中斷的控制控制
補充說明:
***************************************************************/
#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
作者:
man1234567
時間:
2020-5-8 15:00
這么詳細的注釋幾乎每句一注你是想請家教么
作者:
ly1972001
時間:
2020-5-8 15:06
key_z==0&&numss>200 //表示收到了兩次霍爾信號,且間隔大于3秒,則進行里程計數和相關處理。
if(mil<999) //如果里程計數值沒超過99.9KM
mil++; //則行駛里程+0.1km
numss=0; //重置兩次霍爾感應間隔時間
mil_f=1; //標記檢測到兩次霍爾信號
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1