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

📄 subroutine.c

📁 微波治疗仪的源程序
💻 C
字号:
#include <subroutine.h>
#include "x5045.h"
#include "CH451.h"
#include <INCLUDES.h>

void abnormal(void)
{
	CF=1;JDQ=1;ET1=0;TR1=0;
	timer1s=2;TR0=0; 
	Set_TL1=0x00;Set_TH1=0xe9;
	TL1=0x00;TH1=0xe9;
	if(status==zlstart)status=zlprepare;
	else if(status==llstart)status=llprepare;
	else status=zlprepare;
	timenow=timeold;
}

void hextobcd(uchar hexs,uchar aa)
{	                                            //hexs为输入的单字节16进制数,aa为功能
    unsigned char temp[2];
    unsigned char va;
    unsigned char i;
		va = 10;					//最大数级10位
		for(i=1;i;i--) {
			temp[i] = 0;			//目标数组清零
			while ((hexs>=va)&&(va>9)) {
				hexs -= va;		    //减除数
				temp[i]++;			//商位加1
			}
			va /= 10;			  	//除数除10,指向低一位
		}
		temp[0]=hexs;				//最后个位数
	if(aa==2)
		{stg_buff[0]=temp[0];
     	 stg_buff[1]=temp[1];
		}

	else if(aa==1)
		{disp_buff[0]=temp[0];
     	disp_buff[1]=temp[1];
		}
}
void Ini_sys(void)//初始化
{
	EA=0;     //关中断
	ET0=0;    //禁止定时器0溢出中断
	ET1=0;    //允许定时器1溢出中断,溢出延时触发
	TR1=0;    //定时器1关
	TR0=0;    //定时器0关
	EX0=1;    //允许外部中断0
	EX1=1;    //允许外部中断1
	PT1=0;    //定时器1溢出中断优先
	PT0=0;
	PX0=1;
	PX1=0;
	IT0=1;    //边沿触发
	IT1=1;    //电平触发
	//----------uart & timer2 initial
	SCON = 0x50;					  // uart in mode 1 (8 bit), REN=1
  T2CON &= 0xF0;          // EXEN2=0; TR2=0; C/T2#=0; CP/RL2#=0;
  T2CON |= 0x30;          // RCLK = 1; TCLK=1;
  TH2=0xFF;               // init value
  TL2=0xFD;               // init value
  RCAP2H=0xFF;            // reload value, 115200 Bds at 11.059MHz
  RCAP2L=0xFD;            // reload value, 115200 Bds at 11.059MHz
	ES = 1; 						   // Enable serial interrupt
  TR2 = 0;                // Timer 2 run
  //-------------------
	TMOD=0x15;            //T1延时触发器,方式1; T0计数方式
	Set_TL1=0x00;
	Set_TH1=0xe9;
	TL1=0x00;TH1=0xe9;    //延时触发器初值
	TL0=0x00;TH0=0x00;    //脉冲宽度测量
	buzzer=0;             //关蜂鸣器
	CF=1;JDQ=1;           //关闭所有输出
	status=zlprepare;
	write_status(0x00);   //wachdog 1.4s
	clr_wchdog();         //喂狗
  //-------------------
	status=0x01;      //status machine start status
	disp_buff[2],stg_buff[2];
	setsection=0;                  //设置分段0,1,2,3
	set_power=0;                       //功率
	timeold=0,timenow=0,sec=59;    //时间
	timeover=0;        //时间到
	settime[0]=0xff;settime[1]=0xff;
	coef[0]=0x0a;coef[1]=0x0a;coef[2]=0x0a;coef[3]=0x0a;
	timer1s=2;
	delay=0;
	//-------------------
	ch451_init();            //调用初始化
  ch451_write(0x403);      //开键盘显示
  ch451_write(0x500);      //设置默认显示方式

	ch451_write(CH451_DIG0|0x3f);
	ch451_write(CH451_DIG1|0x3f);
	ch451_write(CH451_DIG2|0x00);
	ch451_write(CH451_DIG3|0x3f);
	ch451_write(CH451_DIG4|0x3f);
	ch451_write(CH451_DIG5|zlprepare);
	EA=1;        //开中断
}

void disptimpower(void)     //显示时间和功率
{
	hextobcd(set_power,1);
	hextobcd(timenow,2);
//	hextobcd(addisp,1);

	ch451_write(CH451_DIG0|digit[disp_buff[1]]);
	ch451_write(CH451_DIG1|digit[disp_buff[0]]);
//	ch451_write(CH451_DIG2|digit[adtimenumber]);
	ch451_write(CH451_DIG3|digit[stg_buff[1]]);
	ch451_write(CH451_DIG4|digit[stg_buff[0]]);
	if(status==llstart){
		if(sec%2==0)ch451_write(CH451_DIG5|status|0x01);
		else ch451_write(CH451_DIG5|status);
	}
	else ch451_write(CH451_DIG5|status);
}
void dispset(void)  //显示设置值
{
	ch451_write(CH451_DIG0|0x71);
	ch451_write(CH451_DIG1|digit[setsection]);
	hextobcd(coef[setsection],2);      //显示系数设置
	ch451_write(CH451_DIG3|digit[stg_buff[1]]|0x80);//小数点
	ch451_write(CH451_DIG4|digit[stg_buff[0]]);
	ch451_write(CH451_DIG5|status);
}
void delayms(uchar ms){					//在12P下延时ms毫秒
   uchar i,j,k;
   for(i=0;i<ms;i++)
     for(j=0;j<10;j++)
       for(k=0;k<90;k++);
}
void beep(uchar m,uchar n)    //m次n声(0.2s)0.5s,
{
	uchar i,j=0;
	for(j=0;j<m;j++){           //m次0.5s
		for(i=0;i<n;i++){         //n声(0.2s)
			delay=40;
			buzzer=1;
			while(delay);
			buzzer=0;
			delay=40;
			while(delay);
		}
		delay=80;
		while(delay);
	}
}

void statusmachin(void)  //status machine
{
	//status machine start
	switch(status){
		case zlprepare:
		case llprepare:{TR0=0;CF=1;JDQ=1;TL1=0x00;TH1=0xe9;}break;  //关计数器,关输出
		case zlstart:{
			if(timer1s>=1)timer1s--;
			else{
				timer1s=2;
				if(timenow>=1)timenow--;
				else {abnormal();timeover=1;}
			}
			if(set_power==0)status=zlprepare;
		}
		break;
		case llstart:{
			if(timer1s>=1)timer1s--;
			else{
				timer1s=2;
				if(timenow>=1){
					if(sec==0){sec=59;timenow--;}
					else sec--;
				}
				else {abnormal();timeover=1;}    //status change
			}
			if(set_power==0)status=llprepare;
		}
		break;
		case set:{
//			if(settime[0]<0x0b&&settime[0]>0){
//				ch451_write(CH451_DIG2|digit[settime[0]]);
//				if(settime[1]>=1)settime[1]--;
//				else {
//					if(settime[0]>=1){settime[0]--;settime[1]=100;}
//					else {status=set;settime[0]=0;}
//				}
//			}
//			else{	}
		}break;
		default:{status=zlprepare;abnormal();}//关闭所有输出
	}
	//status machine end

}
/*
void read_parameter_flag(void)
{
EA=0;
	if(read_byte(0x020)==0xaa)
		parameter_already_flag=1;
	else
		parameter_already_flag=0;
EA=1;
}
void write_parameter_flag(void)
{
EA=0;
	write_byte(0x020,0xaa);
EA=1;
}
*/

void read_parameter(void)
{
EA=0;
		coef[0]=read_byte(0x000);
		coef[1]=read_byte(0x008);
		coef[2]=read_byte(0x010);
		coef[3]=read_byte(0x018);
EA=1;
}

void save_parameter(void)
{
EA=0;
		write_byte(0x000,coef[0]);
		write_byte(0x008,coef[1]);
		write_byte(0x010,coef[2]);
		write_byte(0x018,coef[3]);
EA=1;
}

⌨️ 快捷键说明

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