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

📄 acus.c

📁 一个针灸治疗仪源代码,包括记时,显示AD采样程序,开发环境keil.使用的芯片PLC89C935
💻 C
📖 第 1 页 / 共 3 页
字号:
 /*********************************************************
*名称:watchdog()
*功能:喂狗函数
*入口参数:no
*出口参数:无
*********************************************************/
void  watchdog(void)		
{  
   EA=0;
 
  WFEED1=0xA5;			     //执行清零第一部份
  WFEED2=0x5A;               //执行清零第二部分  
  EA=1; 
  }
 /*********************************************************
*名称:WriteDisp()
*功能:显示函数
*入口参数:disp显示的数据,led显示位置
*出口参数:无
*********************************************************/
  void  WriteDisp(uchar led,uchar  disp) 
  {	
    switch  (disp)
	       {case 0	:
		     dispbuff[led]=LED0;
			 break;
			case 1	:
		     dispbuff[led]=LED1;
			 break;
            case 2	:
		     dispbuff[led]=LED2;
			 break;
            case 3	:
		     dispbuff[led]=LED3;
			 break;
            case 4	:
		     dispbuff[led]=LED4;
			 break;
            case 5	:
		     dispbuff[led]=LED5;
			 break;
            case 6	:
		     dispbuff[led]=LED6;
			 break;
            case 7	:
		     dispbuff[led]=LED7;
			 break;
			case 8	:
		     dispbuff[led]=LED8;
			 break;
            case 9	:
		     dispbuff[led]=LED9;
			break;
		   default :  dispbuff[led]=LEDE;  break;
		    }
   
   
    }  
 
 /*********************************************************
*名称:Disp()
*功能:显示函数
*入口参数:no
*出口参数:无
*********************************************************/
void  Disp(uchar *i)		
{ uchar j=0;
   	 while(j<=3)
      { switch (j)
	    { case 0:
             { 
			   P2=*(i);
			   P10=1;
			   P11=0;
			   P04=0;
			   P05=0;
               os_wait(K_TMO,1,0);
			   watchdog();	 
			   j++;
			   break;
              }
  	      case 1:
              {
			   P2=*(i+1);
			   P10=0;
			   P11=1;
			   P04=0;
			   P05=0;
               os_wait(K_TMO,1,0);
			   watchdog();	
			   j++;
			   break;
               }
	      case 2:
             { P2=*(i+2);
			   P10=0;
			   P11=0;
			   P04=1;
			   P05=0;
               os_wait(K_TMO,1,0);
			   watchdog();	
			   j++;
			   break;
              }
          case 3:
              {P2=*(i+3);
			    
			   P10=0;
			   P11=0;
			   P04=0;
			   P05=1;
               os_wait(K_TMO,1,0);
			   watchdog();	
			   j=0;
			   break;
               }
          default:
		      {j&=4;
			   break;
      		   }
    	}
       
   }
 }       
/*********************************************************
*名称:ADinit()
*功能:A/D转换器初始化
*入口参数:no	
*出口参数:无
*********************************************************/

void   AD_init(void)
{ 	P0M1=0x0b;		        //P00,P01,设置为仅为输入状态,P02,设置为双向
                            //P06,P07,P03,P04,P05,设置为推挽。
	P0M2=0xf0;
	//------------------------
	ADINS=0x52;		    //0101 0010, 选择ad0l和 ad10 ad12
	ADMODA=0x11;		//0001 0001, 选择转换工作模式:固定通道单次转换模式
	ADMODB=0x00; 		//500Khz < ADC CLK < 3.3Mhz,,
   //------------------------
   p = id_buff;
  	ReadID();           //读18B20ID
  	Config18b20();      //18b20初始化 */     

}
/*********************************************************
*名称:MeilanFilter()
*功能:中值滤波
*入口参数:channel 通道选择
*出口参数:result  转换结果
*********************************************************/
/*uchar MeilanFilter(uchar channel)
{uchar i,j,k,addata;
 uchar xdata temp[5];
  for(k=0;k<=5;k++)
	 { addata=AD_start(channel);
	    for(j=0;j<=5;j++)
	      {if(addata>temp[j])
	         {for(i=5;i>j;i--)
		      temp[i]=temp[i-1]	;
			  temp[j]=addata;
			   watchdog();
			  break;
	         }
			else{}
	      }
      }
	return(temp[3]);
}

/*********************************************************
*名称:ADstart()
*功能:A/D转换器启动
*入口参数:channel 通道选择
*出口参数:result  转换结果
*********************************************************/
 uchar AD_start(uchar channel)
 {	uchar  result;
   	switch (channel	)
	   {case  0x01 :
	 	{ADCON0=0x05;		    //ad01温度设定采样
		                        //选择转换触发模式;并立即启动
		 result=AD0DAT1;		//将AD转换获得的数据存入result
		 ADCON0&=0xF7;			//清除中断完成标志
		 break;
		 }
	    case  0x02	:
	 	{ADCON1=0x05;		    //ad10温度传感器采样
		                        //选择转换触发模式;并立即启动
		 result=AD1DAT0;		//将AD转换获得的数据存入result
		 ADCON0&=0xF7;			//清除中断完成标志
		 break;
		 }
		 case  0x03	 :	
		 {ADCON1=0x05;		    //ad12温度传感器采样
		                        //选择转换触发模式;并立即启动
		 result=AD1DAT2;		//将AD转换获得的数据存入result
		 ADCON1&=0xF7;			//清除中断完成标志
		 break;
		 }
        }
   return  result ;
  }
/*********************************************************
*名称:CCU_init(void)
*功能:CCU初始化
*入口参数:无
*出口参数:无
*********************************************************/
void CCU_init(void)
{
	OCB=1;			// 设置P1.6为PWM输出

	TPCR2H=0x00;	// 设置 CCU 预分频控制器:
	TPCR2L=0x63;	// divide by 100 (99+1)
					
	TCR21=0x07;		// Prescaler for Phase Locked Loop:
					// Input frequency must be in range of 0.5-1Mhz
					// InpFrq=PCLK/(PLLDIV+1)=(CCLK/2)/(PLLDIV+1)
					// using the internal RC oscillator: CCLK=7.373MHz 
					// 		PLLDiv=6, 6+1=7      => 0.526 MHz
					// using Crystal 11.0592 MHz => 0.789 MHz

	CCCRB=0x01;		// non-inverted PWM output on channel B B通道非反相输出PWM	
	
	
	TCR20|=0x80;		// Start PLL, OutputMode: stop
	OCB=1;			    // wait a machine cycle
	while(PLLEN ==0);// wait until PLL locked

	TOR2H=0xff;		// Reload Value 0x00FF=255	装载映像寄存器
	TOR2L=0x7f;		// -> PWM period			PWM周期
	TCR21|=0x80;	// update reload value	    使映像寄存器在下次CCU溢出时自动更新

	OCRBH=0x00;		// initialize Duty-Cycle channel A 0x0100 => 50%
	OCRBL=0x3f;			
	TCR21|=0x80;	// update duty cycle

	
	TCR20=0x86;		// Set output mode: asymmetrical PWM非对称模式
	HLTEN=1;
    HLTRN=1;
}
/*********************************************************
*名称:PWM_start(void)
*功能:脉冲控制开始
*入口参数:无
*出口参数:无
*********************************************************/		
void PWM_start(uint freq,uchar mod) 
	{
				TOR2H= HIGH(freq)	;		// Reload Value 0x00FF=255	装载映像寄存器
	            TOR2L= LOW(freq)	;		// -> PWM period			PWM周期
	           	OCRBH= HIGH(freq)/mod	;
				OCRBL= LOW(freq)/mod;        //占空比为50%
			    TCR21|=0x80;	           // update reload value	    使映像寄存器在下次CCU溢出时自动更新	
				watchdog();
	} 

/*********************************************************
*名称:CPU_init(void)
*功能:CPU初始化
*入口参数:无
*出口参数:无
*********************************************************/	
void CPU_init(void)
{   uchar deca,first;
    P1M1 = 0x1c;				// P12,P13,P14,P15,输入P10,P11,P16,P17输出
	P1M2 = 0xc3;
	P2M1 = 0x00;				//全为输出
	P2M2 = 0xFF;
	
    ALAME=0;
    timeled=0;
    templed=0;
    CCU_init();
	AD_init();
	ACC=WDCON;
    ACC|=0x04;
    WDL=0x08;                  //装入8位倒计数的新值
    EA=0;
	WDCON=ACC;			       //设置WD_RUN=1
	WFEED1=0xA5;			   //执行清零第一部份
	WFEED2=0x5A;               //执行清零第二部分  
	TRIM|=0xc0;
    EA=1; 
    TimeLimit=	EEPROMread(TIMEADDR);
    if(TimeLimit>0&&TimeLimit<=60)
      { end.hour=TimeLimit/60+ctime.hour;   //记录结束时间
	    end.min= TimeLimit%60+ctime.min;
	    end.sec= 0;
	    deca =TimeLimit/10;
	    first=TimeLimit%10;
	    WriteDisp(0,deca);
	    WriteDisp(1,first);	
		os_create_task (TIMECON);
		if(P13==0)
        {TempLimit=EEPROMread(TEMPADDR);
		 if(TempLimit>0)
		    os_create_task(TEMPCON);
		 else TempLimit=0;
		 }
		} 	       //开始诊病任务
    else TimeLimit=0;}
 /**************************************************
*原型:void PushNews(void)
*功能:将消息压入堆栈
*说明:但是没有将其置为有效
*参数:无
*返回:无
**************************************************/
void PushNews(void) {
    uchar ch,i;
    ch=NewsStr[0];
    ch++;
	i=(P1|0xf3);
	NewsStr[ch]=_cror_ (i,2);
}
/**************************************************
*原型:uchar PopNews(void)
*功能:弹出最老消息
*说明:采用依次前移,如果队列大应采用有效算法
*参数:无
*返回:无
**************************************************/
uchar PopNews(void) {
    uchar ch,i;
    ch=NewsStr[1];
    for(i=1;i<2;i++) {
        NewsStr[i]=NewsStr[i+1];
    }
    NewsStr[3]=0;
    NewsStr[0]--;
    return ch;
}

/**************************************************
*原型:void DealNews(void)
*功能:对按键的处理模块
*说明:无
*参数:无
*返回:无
**************************************************/

uchar DealNews(void) {
uchar NewsBuff;
   		 if(NewsStr[0])
		        {
				  NewsBuff=PopNews();
                 
                 }
         else{
		        NewsBuff=0x00;
                 
			    }
	return NewsBuff; 
}
/**************************************************
*原型:uchar kb_hit(void)
*功能:确定有键按下
*说明:无
*参数:无
*返回:有键按下返回1,否则返回0
**************************************************/
uchar kb_hit(void)
{
      //P1&=0xf3;
        if((P1|0xfb)==0xfb) return(0);
        return(1);
}

/**************************************************
*原型:void ScanKey(void)
*功能:扫描键盘模块
*说明:采用任务模式进行扫描,不循环等待,有效按键压入键盘队列,
*参数:无
*返回:无
**************************************************/
void ScanKey(void) 
{
        watchdog();	
    
         if(kb_hit()) 
            { os_wait(K_TMO,2,0);           
          if(kb_hit())
		      {KeyOk=1;
               PushNews();		   //有键按下
			   }            
			   	
			 }
          
		   if(!kb_hit()&&KeyOk) 		  //是否松开

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -