欧美极品高清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