📄 pump.#3
字号:
/***********************************************************************************************
模块名:pump.h
创建人:王恩刚
************************************************************************************************/
/**********************************************头文件声明***************************************/
#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 //斩波驱动参考电压设定值
#define DAC1_DATA 0x0C00 //比较器参考电压设定值
#define Delay_STime 0x09C4 //检测到气泡报警的时间延迟(短)
#define Delay_LTime 0xF424 //检测到气泡报警的时间延迟(长)
#define Bubble_NUM 0x004B //累计气泡为150个
/*******************************************I/O端口对应输出声明*********************************/
sbit SDA=P0^0; //SMBUS设置
sbit SCL=P0^1; //用作T3定时器的自动重载触发源
sbit CEX0=P0^2; //PCA第一个比较、捕捉模块
sbit T1=P0^3; //定时器T1计数源输入端,对小气泡进行计数
sbit INT1=P0^4; //键盘中断
sbit T2EX=P0^5; //由内部计数器2对气泡检测脉冲进行计数
sbit CNVSTR=P0^6; //时钟输出
sbit SM_RST=P0^7; //L297复位控制位
sbit Balarm_flag=P1^0; //气泡报警标志位,为1时正常,为0时报警
sbit Heat_flag=P1^1; //加热标志位
//sbit SHIFT_DATA=P1^2; //移位寄存器串行数据输入位,H时为1,L时为0
sbit DI2PIN=P1^2; //LCD2时钟输入引脚
sbit Lpower_LED=P1^3; //低电压报警
//sbit SHIFT_CLK=P1^3; //移位寄存器时钟输入
sbit CLK2PIN=P1^4; //LCD2数据输入引脚
//sbit SHIFT_CLR=P1^4; //移位寄存器清零端
sbit CLKPIN = P1^5; //用户自定义CLK对应引脚
sbit T1IN=P1^6; //定时器T1的输入
sbit State_LED=P1^7; //状态标志位
sbit DIPIN = P2^0; //用户自定义DI对应引脚
sbit SM_CLK1=P2^2; //步进电机时钟位
sbit SM_EN=P2^3; //L297使能位
sbit SM_CW=P2^4; //L297方向控制位
sbit SM_MODE=P2^5; //L297环形分配器分配方式控制位
/*******************************************全局变量定义****************************************/
uchar temp[4]={0,1,0,0}; //LCD显示数字的十进制形式
uchar temp2[4]={0,5,0,0}; //LCD2显示数字的十进制形式
uchar Point_Flag; //小数点标志位
uchar data l_data[5]; //用户自定义LCD缓冲区
uchar code lcd_data[10]={0x88,0xbb,0xc1,0x91,0xb2,0x94,0x84,0xb9,0x80,0xb0}; //0~9对应的显示代码
uchar code_h; //行扫描值
uchar code_l; //列扫描值
uchar keycode=0x00; //最终键值
uint k=0; //LCD显示段位置序号
uint kk=0; //LCD2显示段位置序号
uint BUFFER; //步进电机转速控制
uint Buffer_NUM; //T0循环次数
uint PWM_Width; //定时器0溢出周期控制
uint Drop_Num; //设定的液滴数
ulint Flux_Pulse; //设定的流速对应的脉冲数
ulint All_Pulse; //需要产生的全部脉冲数
float Drop_NStep; //一滴所对应的步进电机的步数
bit Fluxdrop_Flag; //流量和滴速单位标志位,为0单位是流量,为1时单位是滴速
bit Speed_Set; //流速设置标志位,为0时设置保存,为1时允许设置
bit Hold_Flag; //键盘锁定标志位,为1时键盘锁定,为0时允许键盘动作
bit SR_Flag; // 运行/停止标志位,为0时停止,为1时运行
bit PK_Flag; //排空标志位,为0停止排空操作,为1时开始排空操作
bit Gross_Flag; //输液量设置标志,为1时允许设置,为0时保存设置
/******************************************函数声明********************************************/
void SYSCLK_Init(void); //系统时钟初始化
void IO_Init(void); //I/O端口设置初始化
void ISR_Init(void); //系统中断设置初始化
void Global_Init(void); //全局变量初始化
void Bubble_alarm(void); //气泡检测报警
void delay( uint t); //软件延迟,(102.647t+2.3646)us
void nop(uint t); //软件短延迟函数
void pk(void); //输液前的排空操作
void lcdwbit(bit n); //LCD位传输函数
void lcdwd(uchar data1); //LCD字节传输函数
void lcdwd1(); //LCD4段数据传输函数
void l_set(); //各段显示数据设置
void display(); //显示设置数据
void noplay(); //空白显示
void lcd2wbit(bit n); //LCD2位传输函数
void lcd2wd(uchar data1); //LCD2字节传输函数
void lcd2wd1(); //LCD2的4段数据传输函数
void l2_set(); //LCD2各段显示数据设置
void display2(); //LCD2显示设置数据
void noplay2(); //LCD2空白显示
void SM_Set(void); //步进电机工作状态设置
void T0_Set(void); //定时器T0设置
void T0_ISR(void); //定时器T0中断服务函数
void SM_SR(void); //步进电机运行停止控制函数
void DAC0_Set(void); //步进电机参考电压设置
void DAC1_Set(void); //比较器参考电压设置
void data_inv(void); //流量参数变换
void pulse_inv(void); //输液量参数变换
void ADC_Set(void); //ADC窗口比较器设置
void ADC_ISR(void); //ADC窗口比较器中断服务函数
void T1_Set(void); //定时器T1参数设置
void T1_ISR(void); //定时器T1中断服务函数
void T2_Set(void); //定时器T2参数设置
void T2_ISR(void); //定时器T2中断服务函数
void T3_Set(void); //定时器T3参数设置
void T3_ISR(void); //定时器T3中断服务函数
void PCA_ADC(void); //PCA高速输出方式启动ADC
void keyinterrupt(void); //INT1即键盘中断服务函数
void main(void); //主函数
/***************************************函数定义***********************************************/
/**********************************************************************************************
函数:void SYSCLK_Init(void)
说明:系统时钟初始化,选择外部12M晶振,关闭看门狗。
***********************************************************************************************/
void SYSCLK_Init(void)
{
int i;
WDTCN=0x07; //最大时间延迟
WDTCN=0xDE;
_nop_();
WDTCN=0xAD; //禁止看门狗中断
OSCXCN=0x77; //外部时钟寄存器设置
for(i=0;i<256;i++) ; // 至少等待1ms
while(!(OSCXCN&0x80)) ; //等待晶振稳定,
OSCICN=0x88; // 采用外部晶振作为时钟源
WDTCN=0xFF; //锁定看门狗禁止功能禁止,看门狗在程序中一直有效
WDTCN=0xA5; //喂狗
}
/**********************************************************************************************
函数:void IO_Init()
说明:I/O端口设置初始化,内部资源和IO端口交叉开关设置;输入和5V输出采用开漏输出,3.3V输出采用
推挽输出,允许全局弱上拉
***********************************************************************************************/
void IO_Init()
{
XBR0 = 0x09; // 交叉开关设置
XBR1 = 0x58;
XBR2 = 0x41;
PRT0CF = 0x04; // 端口输出方式寄存器设置
PRT1CF = 0xA3;
PRT2CF = 0x01;
PRT3CF = 0x00;
}
/**********************************************************************************************
函数:void ISR_Init(void)
说明:系统中断设置初始化
***********************************************************************************************/
void ISR_Init(void)
{
IT1=1; //设置外部中断1为下降沿触发
EA=1; //开全局中断
EX1=1; //打开外部中断1
ET0=1; //定时器0开中断
ET1=1; //定时器1开中断
PT0=1; //置定时器0中断为高优先级
PT1=1; //置定时器1中断为高优先级
EIP1=0x04; //置ADC0窗口比较器中断为高优先级
//IE=0xAE; //或对IE中断允许寄存器进行设置
EIE1=0x04; //允许ADC0窗口比较器中断
EIE2=0x01; //定时器3开中断
}
/**********************************************************************************************
函数: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=0;
Gross_Flag=0;
}
/**********************************************************************************************
函数:void Bubble_alarm(void)
说明:气泡检测报警、处理
***********************************************************************************************/
void Bubble_alarm(void)
{ Balarm_flag=0;
SR_Flag=0;
SM_SR();
}
/**********************************************************************************************
函数:void delay( uint t)
说明:延时子程序,延迟时间[(12.144*TIMER1+17.365)*TIMER2+28.375]/f,当t=16M时,为(76.9853t+1.7
734)us,当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++)
;
}
/**********************************************************************************************
函数:void nop(uint t)
说明:软件短时间精确延时子程序,相当于t个空操作
***********************************************************************************************/
void nop(uint t)
{ uint i;
for(i=0;i<t;i++)
_nop_();
}
/**********************************************************************************************
函数:void pk(void)
说明:输液前的排空操作,电机快速转动,迅速排出气泡
***********************************************************************************************/
void pk(void)
{
if(PK_Flag==1)
{SR_Flag=1;
SM_SR();
}
else
{SR_Flag=0;
SM_SR();
}
}
/**********************************************************************************************
函数:void lcdwbit(bit n)
说明:LCD位传输函数
***********************************************************************************************/
void lcdwbit(bit n)
{ DIPIN = n;
CLKPIN = 1;
CLKPIN = 0;
CLKPIN = 1;
}
/**********************************************************************************************
函数:void lcdwd(uchar data1)
说明:LCD字节传输函数
***********************************************************************************************/
void lcdwd(uchar data1)
{ uchar i;
for(i=0;i<8;i++)
{ if((data1&0x01)==0x01)
lcdwbit(1);
else
lcdwbit(0);
data1>>=1;
}
}
/**********************************************************************************************
函数:void lcdwd1(void)
说明:LCD4段数据传输函数
***********************************************************************************************/
void lcdwd1(void)
{ uchar i;
for(i=0;i<5;i++)
{lcdwd(l_data[i]);
} delay(1);}
/**********************************************************************************************
函数:void l_set(void)
说明:各段显示数据设置,若存在小数点,则相应位的显示数据改变
***********************************************************************************************/
void l_set(void)
{uchar i;
l_data[0]=0xff;
if(Fluxdrop_Flag) //判断是流量还是滴数模式
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;
}
/**********************************************************************************************
函数:void display(void)
说明:显示设置数据
***********************************************************************************************/
void display(void)
{l_set();
lcdwd1();
delay(Time_50ms);
WDTCN=0xA5;
delay(Time_50ms);
WDTCN=0xA5;
delay(Time_50ms);
WDTCN=0xA5;
delay(Time_50ms);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -