?? 020.c
字號(hào):
//-------------------------------------------
//液面檢測(cè) 分四等級(jí) 生化儀 BIOBASE
//-------------------------------------------
//-------------------------------------------
//在用編程器的時(shí)候,要做一下配置操作
//配置字:使用內(nèi)部4MHZ晶振 看門狗使能
// 程序加密 其它關(guān)閉
//-------------------------------------------
//-------------------------------------------
//如:用 EasyPRO 80B 編程器
//選中 INTRC OSC/(I/O) ; WDTE enable
// /CP enable ; /CPD enable
//-------------------------------------------
//-------------------------------------------
//I use PIC12F675;
#include<pic12f6x.h>
//-------------------------------------------
//-------------------------------------------
//宏定義 數(shù)據(jù)類型的定義
#define u8 unsigned char
#define u16 unsigned int
//---------------------------------------------
//-------------------------------------------
//四個(gè)等級(jí)(0、 1 、2、 3) 的延時(shí)基數(shù)
//延時(shí)時(shí)間=延時(shí)基數(shù)*8.214ms
#define NUM0 0X02;
#define NUM1 0X02;
#define NUM2 0X02;
#define NUM3 0X02;
//---------------------------------------------
//---------------------------------------------
//四個(gè)等級(jí)的靈敏度參數(shù)
//靈敏范圍=靈敏度參數(shù)*2
#define POINT0 0X01;
#define POINT1 0X02;
#define POINT2 0X03;
#define POINT3 0X04;
//---------------------------------------------
//-------------------------------------------
//全局變量的定義
u8 TMR0_H = 0X00; //定時(shí)器0每中斷一次,TMR0_H++
u8 TMR0_H_TEMP = 0x00; //TMR0_H的 當(dāng)前備份
u8 TMR0_H_TEMP_LAST = 0x00; //TMR0_H的 上一次值的備份
u8 TMR0_TEMP = 0x00; //TMR0的當(dāng)前備份
u8 TMR0_TEMP_LAST = 0x00; //TMR0的上一次值的備份
u8 CLASS=0X00; //等級(jí)最終標(biāo)志
u8 NUM=0X00; //延時(shí)最終參數(shù)
u8 POINT=0X00; //靈敏度最終參數(shù)
u16 INT_TMR0=0X00; //當(dāng)前 定時(shí)器0在延時(shí)時(shí)間內(nèi)一共溢出的次數(shù)(由于比較大,故用 16位來表示 最大可達(dá) 十進(jìn)制65535)
u16 INT_TMR0_LAST=0X00; //上一次 定時(shí)器0在延時(shí)時(shí)間內(nèi)一共溢出的次數(shù)(由于比較大,故用 16位來表示 最大可達(dá) 十進(jìn)制65535)
//-------------------------------------------
//-------------------------------------------
void interrupt tmr0(void)//定時(shí)器0中斷函數(shù)
{
GIE = 0; //關(guān)中斷 避免一切可能干擾
if(T0IE&T0IF) //再次 檢驗(yàn)中斷標(biāo)志位
{
TMR0_H++; //完成自加
}
else // 若執(zhí)行這步,則程序跑飛,等待,直到被狗咬
{
while(1)
{
;
}
}
T0IF = 0; //軟件清零中斷標(biāo)志位
GIE = 1; //開中斷 釋放中斷權(quán)限
}
//-------------------------------------------
//-------------------------------------------
void init(void) //初始化
{
CMCON = 0X07; //關(guān)閉比較器
TRISIO = 0X2F; //除了GPIO4是輸出模式 其它的都用輸入模式
ANSEL = 0X02; //GPIO1 此腳不用,故設(shè)為模擬輸入 其它的設(shè)為數(shù)字I/O方式
OPTION = 0XFA; //禁止各口的內(nèi)部上拉,使能GPIO2的檢測(cè)脈沖信號(hào)功能(下降沿觸發(fā));預(yù)分頻器給開門狗 分頻 1:4
T0IE = 1; //使能定時(shí)器0中斷
OSCCAL = 0X10; //修正一下晶振,(其實(shí)該代碼沒什么用,先加著)
GPIO = 0X2F; //除了GPIO4 其它的初始值都是1
GIE = 1; //開全局中斷
}
//-------------------------------------------
//-------------------------------------------
//等級(jí)越大,越不靈敏
void class(void) //確定 等級(jí) 延時(shí)參數(shù) 靈敏度參數(shù)
{
if(GPIO0==1 && GPIO5==1) //不插短路棒 等級(jí):0 延時(shí)參數(shù):NUM0 靈敏度參數(shù):POINT0
{
CLASS=0X00;
NUM=NUM0;
POINT=POINT0;
}
if(GPIO0==1 && GPIO5==0)//在1處插了一個(gè)短路棒 等級(jí):1 延時(shí)參數(shù):NUM1 靈敏度參數(shù):POINT1
{
CLASS=0X01;
NUM=NUM1;
POINT=POINT1;
}
if(GPIO0==0 && GPIO5==1)//在2處插了一個(gè)短路棒 等級(jí):2 延時(shí)參數(shù):NUM2 靈敏度參數(shù):POINT2
{
CLASS=0X02;
NUM=NUM2;
POINT=POINT2;
}
if(GPIO0==0 && GPIO5==0)//在1、2處插了一個(gè)短路棒 等級(jí):3 延時(shí)參數(shù):NUM3 靈敏度參數(shù):POINT3
{
CLASS=0X03;
NUM=NUM3;
POINT=POINT3;
}
//確保每次循環(huán)中的延時(shí)準(zhǔn)確
TMR0_H = 0X00; //清0
TMR0 = 0X00; //清0
}
//-------------------------------------------
//-------------------------------------------
//延時(shí)函數(shù) 形式參數(shù)為 i
//內(nèi)部喂狗了
void delay_gj(u8 i) // 當(dāng) i=1時(shí) 8.8ms
{
u8 j,k;
for(;i>0;i--)
for(j=41;j>0;j--)
for(k=49;k>0;k--)
asm("clrwdt");
}
//-------------------------------------------
//-------------------------------------------
void temp_baohu(void) //保護(hù)一下延時(shí)后的關(guān)于脈沖的參數(shù)
{
GIE = 0; //關(guān)中斷 一直到本次循環(huán)完,不希望有中斷的打擾,以使本循環(huán)在最短的時(shí)間內(nèi)完成
TMR0_H_TEMP = TMR0_H;
TMR0_TEMP = TMR0;
if(TMR0_TEMP == 0) //由于關(guān)了中斷,在次做了一下類似進(jìn)位的處理,防止由于定時(shí)器溢出引起的255個(gè)脈沖的丟失
{
TMR0_H_TEMP = TMR0_H+1;
}
}
//-------------------------------------------
//-------------------------------------------
void doclass(void) // 當(dāng)前脈沖數(shù)與上次脈沖數(shù)進(jìn)行比較,在靈敏度范圍內(nèi)則 小LED燈亮,否則滅
{
//把8位計(jì)算轉(zhuǎn)換成16位計(jì)算方便(不用考慮負(fù)數(shù)和類似進(jìn)位的問題)
INT_TMR0=(u16)TMR0_H_TEMP*0XFF+(u16)TMR0_TEMP;
INT_TMR0_LAST=(u16)TMR0_H_TEMP_LAST*0XFF+(u16)TMR0_TEMP_LAST;
if( INT_TMR0 <=(INT_TMR0_LAST+(u16)POINT) && INT_TMR0 >=(INT_TMR0_LAST-(u16)POINT) )
{
GPIO4=1;
}
else
{
GPIO4=0;
}
}
//-------------------------------------------
//-------------------------------------------
void temp_rebulid(void)//脈沖判斷完成,整理一下各個(gè)參數(shù),準(zhǔn)備下一次循環(huán)
{
TMR0_H_TEMP_LAST = TMR0_H_TEMP;
TMR0_TEMP_LAST = TMR0_TEMP;
TMR0_H_TEMP = 0x00;
TMR0_TEMP = 0x00;
CLASS=0X00;
NUM=0X00;
POINT=0X00;
T0IF = 0; //由于在之前關(guān)了中斷,所以要清一下中斷標(biāo)志。
GIE = 1; //開全局中斷使能
}
//-------------------------------------------
//-------------------------------------------
//主函數(shù)
void main(void)
{
//***********************************
//delay_gj(1) ; //調(diào)試用語句
//***********************************
init();
while(1)
{
class(); //定下等級(jí),然后定下與等級(jí)相關(guān)的參數(shù),最后對(duì)TMR0_H 、TMR0_清零
delay_gj(NUM); //延時(shí)
temp_baohu(); //保護(hù)用于脈沖計(jì)算的參數(shù)
doclass(); //進(jìn)行脈沖計(jì)算并做出LED亮滅的判斷
temp_rebulid(); //重新整理各個(gè)參數(shù),準(zhǔn)備下一次循環(huán)
}
}
//------------------------------------------------
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -