?? pump.c
字號:
/***********************************************************************************************
模塊名:pump.h
創(chuàng)建人:王恩剛
************************************************************************************************/
/**********************************************頭文件聲明***************************************/
#pragma src
#include "C8051F000.h"
#include <intrins.h>
/********************************************變量類型縮略定義***********************************/
#define uint unsigned int //縮略定義
#define uchar unsigned char
#define ulint unsigned long
/***********************************************常量定義****************************************/
#define Time_1ms 6 //時間常量(12M) 6x-x/8
#define Time_5ms 30
#define Time_10ms 59
#define Time_15ms 88
#define Time_20ms 118
#define Time_50ms 294
#define Time_80ms 470
#define Time_100ms 588
#define Time_200ms 1175
#define DAC0_DATA 0x01BC //斬波驅(qū)動參考電壓設(shè)定值
#define DAC1_DATA 0x0C00 //比較器參考電壓設(shè)定值
#define Delay_STime 0x09C4 //檢測到氣泡報警的時間延遲(短)
#define Delay_LTime 0xF424 //檢測到氣泡報警的時間延遲(長)
#define Bubble_NUM 0x0001 //累計氣泡為150個
/*******************************************I/O端口對應(yīng)輸出聲明*********************************/
sbit SDA=P0^0; //SMBUS設(shè)置
sbit SCL=P0^1; //用作T3定時器的自動重載觸發(fā)源
sbit CEX0=P0^2; //PCA第一個比較、捕捉模塊
sbit T1=P0^3; //定時器T1計數(shù)源輸入端,對小氣泡進行計數(shù)
sbit INT1=P0^4; //鍵盤中斷
sbit T2EX=P0^5; //由內(nèi)部計數(shù)器2對氣泡檢測脈沖進行計數(shù)
sbit CNVSTR=P0^6; //時鐘輸出
sbit SM_RST=P0^7; //L297復(fù)位控制位
sbit Balarm_flag=P1^0; //氣泡報警標(biāo)志位,為1時正常,為0時報警
sbit Heat_flag=P1^1; //加熱標(biāo)志位
//sbit SHIFT_DATA=P1^2; //移位寄存器串行數(shù)據(jù)輸入位,H時為1,L時為0
sbit DI2PIN=P1^2; //LCD2時鐘輸入引腳
sbit Lpower_LED=P1^3; //低電壓報警
//sbit SHIFT_CLK=P1^3; //移位寄存器時鐘輸入
sbit CLK2PIN=P1^4; //LCD2數(shù)據(jù)輸入引腳
//sbit SHIFT_CLR=P1^4; //移位寄存器清零端
sbit CLKPIN = P1^5; //用戶自定義CLK對應(yīng)引腳
sbit T1IN=P1^6; //定時器T1的輸入
sbit State_LED=P1^7; //狀態(tài)標(biāo)志位
sbit DIPIN = P2^0; //用戶自定義DI對應(yīng)引腳
sbit SM_CLK1=P2^2; //步進電機時鐘位
sbit SM_EN=P2^3; //L297使能位
sbit SM_CW=P2^4; //L297方向控制位
sbit SM_MODE=P2^5; //L297環(huán)形分配器分配方式控制位
/*******************************************全局變量定義****************************************/
uchar temp[4]; //LCD顯示數(shù)字緩存
uchar temp2[4]; //LCD2顯示數(shù)字緩存
uchar code temp_code[4]={0,1,0,0}; //LCD顯示數(shù)字的十進制形式
uchar code temp2_code[4]={0,5,0,0}; //LCD2顯示數(shù)字的十進制形式
uchar Point_Flag; //小數(shù)點標(biāo)志位
uchar data l_data[5]; //用戶自定義LCD緩沖區(qū)
uchar lcd_data[10]; //0~9對應(yīng)的顯示代碼緩存;
uchar code lcd_data_code[10]={0x88,0xbb,0xc1,0x91,0xb2,0x94,0x84,0xb9,0x80,0xb0}; //0~9對應(yīng)的顯示代碼;
uchar code_h; //行掃描值
uchar code_l; //列掃描值
uchar keycode=0x00; //最終鍵值
uint k=0; //LCD顯示段位置序號
uint kk=0; //LCD2顯示段位置序號
uint BUFFER; //步進電機轉(zhuǎn)速控制
uint Buffer_NUM; //T0循環(huán)次數(shù)
uint PWM_Width; //定時器0溢出周期控制
uint Drop_Num; //設(shè)定的液滴數(shù)
ulint Flux_Pulse; //設(shè)定的流速對應(yīng)的脈沖數(shù)
ulint All_Pulse; //需要產(chǎn)生的全部脈沖數(shù)
float Drop_NStep; //一滴所對應(yīng)的步進電機的步數(shù)
bit Fluxdrop_Flag; //流量和滴速單位標(biāo)志位,為0單位是流量,為1時單位是滴速
bit Speed_Set; //流速設(shè)置標(biāo)志位,為0時設(shè)置保存,為1時允許設(shè)置
bit Hold_Flag; //鍵盤鎖定標(biāo)志位,為1時鍵盤鎖定,為0時允許鍵盤動作
bit SR_Flag; // 運行/停止標(biāo)志位,為0時停止,為1時運行
bit PK_Flag; //排空標(biāo)志位,為0停止排空操作,為1時開始排空操作
bit Gross_Flag; //輸液量設(shè)置標(biāo)志,為1時允許設(shè)置,為0時保存設(shè)置
/******************************************函數(shù)聲明********************************************/
void SYSCLK_Init(void); //系統(tǒng)時鐘初始化
void IO_Init(void); //I/O端口設(shè)置初始化
void ISR_Init(void); //系統(tǒng)中斷設(shè)置初始化
void Global_Init(void); //全局變量初始化
void Bubble_alarm(void); //氣泡檢測報警
void delay( uint t); //軟件延遲,(102.647t+2.3646)us
void nop(uint t); //軟件短延遲函數(shù)
void pk(void); //輸液前的排空操作
void lcdwbit(bit n); //LCD位傳輸函數(shù)
void lcdwd(uchar data1); //LCD字節(jié)傳輸函數(shù)
void lcdwd1(); //LCD4段數(shù)據(jù)傳輸函數(shù)
void l_set(); //各段顯示數(shù)據(jù)設(shè)置
void display(); //顯示設(shè)置數(shù)據(jù)
void noplay(); //空白顯示
void lcd2wbit(bit n); //LCD2位傳輸函數(shù)
void lcd2wd(uchar data1); //LCD2字節(jié)傳輸函數(shù)
void lcd2wd1(); //LCD2的4段數(shù)據(jù)傳輸函數(shù)
void l2_set(); //LCD2各段顯示數(shù)據(jù)設(shè)置
void display2(); //LCD2顯示設(shè)置數(shù)據(jù)
void noplay2(); //LCD2空白顯示
void SM_Set(void); //步進電機工作狀態(tài)設(shè)置
void T0_Set(void); //定時器T0設(shè)置
void T0_ISR(void); //定時器T0中斷服務(wù)函數(shù)
void SM_SR(void); //步進電機運行停止控制函數(shù)
void DAC0_Set(void); //步進電機參考電壓設(shè)置
void DAC1_Set(void); //比較器參考電壓設(shè)置
void data_inv(void); //流量參數(shù)變換
void pulse_inv(void); //輸液量參數(shù)變換
void ADC_Set(void); //ADC窗口比較器設(shè)置
void ADC_ISR(void); //ADC窗口比較器中斷服務(wù)函數(shù)
void T1_Set(void); //定時器T1參數(shù)設(shè)置
void T1_ISR(void); //定時器T1中斷服務(wù)函數(shù)
void T2_Set(void); //定時器T2參數(shù)設(shè)置
void T2_ISR(void); //定時器T2中斷服務(wù)函數(shù)
void T3_Set(void); //定時器T3參數(shù)設(shè)置
void T3_ISR(void); //定時器T3中斷服務(wù)函數(shù)
void PCA_ADC(void); //PCA高速輸出方式啟動ADC
void keyinterrupt(void); //INT1即鍵盤中斷服務(wù)函數(shù)
void main(void); //主函數(shù)
/***************************************函數(shù)定義***********************************************/
/**********************************************************************************************
函數(shù):void SYSCLK_Init(void)
說明:系統(tǒng)時鐘初始化,選擇外部12M晶振,關(guān)閉看門狗。
***********************************************************************************************/
void SYSCLK_Init(void)
{
int i;
WDTCN=0x07; //最大時間延遲
WDTCN=0xDE;
_nop_();
WDTCN=0xAD; //禁止看門狗中斷
OSCXCN=0x77; //外部時鐘寄存器設(shè)置
for(i=0;i<256;i++) ; // 至少等待1ms
while(!(OSCXCN&0x80)) ; //等待晶振穩(wěn)定,
OSCICN=0x88; // 采用外部晶振作為時鐘源
WDTCN=0xFF; //鎖定看門狗禁止功能禁止,看門狗在程序中一直有效
WDTCN=0xA5; //喂狗
}
/**********************************************************************************************
函數(shù):void IO_Init()
說明:I/O端口設(shè)置初始化,內(nèi)部資源和IO端口交叉開關(guān)設(shè)置;輸入和5V輸出采用開漏輸出,3.3V輸出采用
推挽輸出,允許全局弱上拉
***********************************************************************************************/
void IO_Init()
{
XBR0 = 0x09; // 交叉開關(guān)設(shè)置
XBR1 = 0x58;
XBR2 = 0x41;
PRT0CF = 0x04; // 端口輸出方式寄存器設(shè)置
PRT1CF = 0xA3;
PRT2CF = 0x01;
PRT3CF = 0x00;
}
/**********************************************************************************************
函數(shù):void ISR_Init(void)
說明:系統(tǒng)中斷設(shè)置初始化
***********************************************************************************************/
void ISR_Init(void)
{
IT1=1; //設(shè)置外部中斷1為下降沿觸發(fā)
EA=1; //開全局中斷
EX1=1; //打開外部中斷1
ET0=1; //定時器0開中斷
ET1=1; //定時器1開中斷
PT0=1; //置定時器0中斷為高優(yōu)先級
PT1=1; //置定時器1中斷為高優(yōu)先級
EIP1=0x04; //置ADC0窗口比較器中斷為高優(yōu)先級
//IE=0xAE; //或?qū)E中斷允許寄存器進行設(shè)置
EIE1=0x04; //允許ADC0窗口比較器中斷
EIE2=0x01; //定時器3開中斷
}
/**********************************************************************************************
函數(shù):void Global_Init(void)
說明:全局變量初始化
***********************************************************************************************/
void Global_Init(void)
{ P3=0x0F;
Heat_flag=1;
Fluxdrop_Flag=1;
Speed_Set=0;
Lpower_LED=1;
Hold_Flag=0;
SR_Flag=0;
Point_Flag=0x02;
BUFFER=0;
Buffer_NUM=1;
PWM_Width=0x07D0;
Drop_NStep=50.0;
SM_CLK1=0;
SM_RST=0;
SM_EN=0;
T1IN=1;
Balarm_flag=1;
PK_Flag=0;
State_LED=1;
Gross_Flag=0;
}
/**********************************************************************************************
函數(shù):void Bubble_alarm(void)
說明:氣泡檢測報警、處理
***********************************************************************************************/
void Bubble_alarm(void)
{ Balarm_flag=0;
SR_Flag=0;
SM_SR();
}
/**********************************************************************************************
函數(shù):void delay( uint t)
說明:延時子程序,延遲時間[(12.144*TIMER1+17.365)*TIMER2+28.375]/f,當(dāng)t=16M時,為(76.9853t+1.7
734)us,當(dāng)t=12M時,為(102.647t+2.3646)us
***********************************************************************************************/
void delay( uint t)
{ uint i,j;
for(i=0;i<t;i++)
for(j=0;j<100;j++)
;
}
/**********************************************************************************************
函數(shù):void nop(uint t)
說明:軟件短時間精確延時子程序,相當(dāng)于t個空操作
***********************************************************************************************/
void nop(uint t)
{ uint i;
for(i=0;i<t;i++)
_nop_();
}
/**********************************************************************************************
函數(shù):void pk(void)
說明:輸液前的排空操作,電機快速轉(zhuǎn)動,迅速排出氣泡
***********************************************************************************************/
void pk(void)
{
if(PK_Flag==1)
{SR_Flag=1;
SM_SR();
}
else
{SR_Flag=0;
SM_SR();
}
}
/**********************************************************************************************
函數(shù):void lcdwbit(bit n)
說明:LCD位傳輸函數(shù)
***********************************************************************************************/
void lcdwbit(bit n)
{ DIPIN = n;
CLKPIN = 1;
CLKPIN = 0;
CLKPIN = 1;
}
/**********************************************************************************************
函數(shù):void lcdwd(uchar data1)
說明:LCD字節(jié)傳輸函數(shù)
***********************************************************************************************/
void lcdwd(uchar data1)
{ uchar i;
for(i=0;i<8;i++)
{ if((data1&0x01)==0x01)
lcdwbit(1);
else
lcdwbit(0);
data1>>=1;
}
}
/**********************************************************************************************
函數(shù):void lcdwd1(void)
說明:LCD4段數(shù)據(jù)傳輸函數(shù)
***********************************************************************************************/
void lcdwd1(void)
{ uchar i;
for(i=0;i<5;i++)
{lcdwd(l_data[i]);
} delay(1);}
/**********************************************************************************************
函數(shù):void l_set(void)
說明:各段顯示數(shù)據(jù)設(shè)置,若存在小數(shù)點,則相應(yīng)位的顯示數(shù)據(jù)改變
***********************************************************************************************/
void l_set(void)
{uchar i;
l_data[0]=0xff;
if(Fluxdrop_Flag) //判斷是流量還是滴數(shù)模式
Point_Flag=0xff;
else
Point_Flag=2;
for(i=1;i<5;i++)
{l_data[i]=lcd_data[temp[i-1]];
}
if(Point_Flag!=0xff)
l_data[(Point_Flag+1)]=l_data[(Point_Flag+1)]&0x7F;
}
/**********************************************************************************************
函數(shù):void display(void)
說明:顯示設(shè)置數(shù)據(jù)
***********************************************************************************************/
void display(void)
{l_set();
lcdwd1();
delay(Time_50ms);
WDTCN=0xA5;
delay(Time_50ms);
WDTCN=0xA5;
delay(Time_50ms);
WDTCN=0xA5;
delay(Time_50ms);
WDTCN=0xA5;
}
/**********************************************************************************************
函數(shù):void noplay(void)
說明:為實現(xiàn)閃爍,需要一段時間空白顯示
***********************************************************************************************/
void noplay(void)
{uchar i;
for(i=1;i<6;i++)
l_data[i]=0xff;
lcdwd1();
delay(Time_50ms);
WDTCN=0xA5;
delay(Time_50ms);
WDTCN=0xA5;
delay(Time_50ms);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -