⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pump.#3

📁 毕业设计做的东西的硬件程序
💻 #3
📖 第 1 页 / 共 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 + -