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

📄 zly.c

📁 电热治疗仪
💻 C
字号:
#include <AT89X51.H>//6MHz
#define uchar unsigned char
#define uint unsigned int
#define reset() {WDT=0x1e;WDT=0xe1;}//看门狗复位宏定义
sfr WDT=0xa6;			//定义看门狗寄存器
uchar code DATA_7SEG[10]={0x3f,0x06,0x5b,0x4f,0x66,
                    0x6d,0x7d,0x07,0x7f,0x6f};/*0~9的数码管段码*/
//============================================================
uchar data deda;   	/*100mS计数单元*/ 
uchar data sec;		//计时秒
uchar data min;		//计时分
char data set_min;	//设定分
uchar data cnt_5s;
uchar data ram_flag;
char data powout_flag;
bit work_status;
bit flag_500ms;
bit bz_flag=0;		//蜂鸣标志
bit startflag_5s; 		//5S标志
bit start_flag;
bit pout_flag;
//===========================================================
sbit h_pow_out=P2^7;		//驱动H
sbit m_pow_out=P2^6;		//驱动M
sbit l_pow_out=P2^5;		//驱动L
sbit g_x1=P2^2;		//个位显示
sbit g_x2=P2^3;
sbit s_x1=P2^0;		//十位显示
sbit s_x2=P2^1;
sbit r_led=P3^1;	
sbit g_led=P3^0;	
sbit on_off_key=P3^2;	
sbit timeinc_key=P3^3;	
sbit timedec_key=P3^4;
sbit pow_sel_key=P3^5;
sbit run_stop_key=P3^6;
sbit bz_out=P2^4;	
//==================================================
void init(void)
{
sec=min=set_min=0;
cnt_5s=0;
powout_flag=0;
work_status=0;
flag_500ms=0;
bz_flag=0;	
startflag_5s=0; 
start_flag=0;
pout_flag=0;
}
/*=========定时器T0初始化======*/
void init_timer0()
{
TMOD=0x11;//T0、T1方式1
TH0=-(50235/256);//100mS初值
TL0=-(50235%256);
ET0=1;TR0=1;	//T0开中断,启动T0
}
//======================================================
/*延时k*1mS子函数*/
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++){reset()
for(j=0;j<60;j++)
{;}}
}
/*定时器T1初始化*/
void init_timer1()
{
TH1=-(2500/256); //5mS初值
TL1=-(2500%256);
ET1=1; TR1=1; //T1开中断,启动T1
}
//======================================================
/*100mS定时中断服务子函数*/
void timer0(void) interrupt 1 using 1
{
TH0=-(50235/256);// 重装定时初值
TL0=-(50235%256);
deda++;			//计时单元递加
if(startflag_5s)cnt_5s++;//启动5秒计时
if(deda>=10){sec++;deda=0;}// 秒加1
if(cnt_5s>=50){pout_flag=1;cnt_5s=50;}//5秒到,输出标志置位,
//同时5秒计时值固定为5秒
if(sec>=60){set_min--;sec=0;}//60秒到,设定分递减
if(set_min<=0)set_min=0;// 最小为0
if((set_min==0)&&(work_status==0)){startflag_5s=0;}// 若设定分为0且工作状态为0,
//5秒启动标志复位
else {startflag_5s=1;}// 否则5秒启动标志置位
if((set_min<=3)&&(work_status==0))bz_flag=1;// 若设定分小于3且工作状态为0,
//蜂鸣器启动标志置位
	else bz_flag=0;					//否则蜂鸣器启动标志复位
}
//===========================================================
/*T1 5ms定时中断服务子*/ 
void timer1(void) interrupt 3 using 2
{static bit RL;static uchar cnt500;
cnt500++;if(cnt500==100){cnt500=0;flag_500ms=!flag_500ms;}// 每0.5秒,标志取反
RL=!RL;
TH1=-(2500/256);// 重装5mS定时初值
TL1=-(2500%256);
if(start_flag)// 若系统启动
{if(work_status==0)// 若自动时控工作
	{	if(RL){P1=DATA_7SEG[set_min/10];// 点亮十位数码管
			s_x1=0;s_x2=0;g_x1=1;g_x2=1;}
		else{P1=DATA_7SEG[set_min%10];// 点亮个位数码管
			s_x1=1;s_x2=1;g_x1=0;g_x2=0;}
	}
//===========================================
else//否则处于持续工作时
	{	if(flag_500ms){if(RL){P1=0x40;s_x1=0;s_x2=0;// 点亮g段
						g_x1=1;g_x2=1;}
						else {P1=0x40;s_x1=1;s_x2=1;// 点亮g段
							g_x1=0;g_x2=0;}
						}
		else{P1=0x00;s_x1=1;s_x2=1;g_x1=1;g_x2=1;}
	}
}
else {P1=0x00;s_x1=1;s_x2=1;g_x1=1;g_x2=1;}	// 若系统关闭,熄灭数码管
}


/**************************************************/
void key(void)			//扫描时间设定键
{uchar temp,ss;
delay(10);
ss=P3;P3=0xff;
if(P3!=0xff)
{delay(10);temp=P3;P3=ss;
if(temp==0xfb){start_flag=!start_flag;ram_flag=0x55;delay(300);}// 按下开/关键,
//系统启动标志取反,同时防干扰标志写入55H
	if(start_flag)	//若处于开机状态,根据按键状态,进行功能散转
	{
	switch(temp)
			{
			
			case 0xf7:{set_min++;bz_flag=0;startflag_5s=1;cnt_5s=0;// 设定分递增
						if(set_min>=60)set_min=60;delay(300);}break;
			case 0xef:{set_min--;bz_flag=0;startflag_5s=1;cnt_5s=0;// 设定分递减
						if(set_min<=00)set_min=0;delay(300);}break;
			case 0xdf:{powout_flag++;if(powout_flag>=3)powout_flag=0;// 切换
//输出功率
												delay(300);}break;
			case 0xbf:{work_status=!work_status;delay(300);}break;// 选择自动时控
//或持续工作
			default:break;
			}
	}
	else //否则处于关机状态,设定分清零
	{set_min=0;}
//===================================
	if(work_status==0){if(set_min>0)startflag_5s=1;// 工作状态为0,
//当设定分大于0,启动5秒标志
						else startflag_5s=0;}
	else {startflag_5s=1;}// 工作状态为1,也启动5秒标志
}
}

/**************************************/
void power_out(uchar powout_flag)// 切换高中低三档温度
{	
	if(pout_flag==1)
	{	
			switch(powout_flag)
			{
			case 0:m_pow_out=0;h_pow_out=1;l_pow_out=1;break;
			case 1:h_pow_out=0;m_pow_out=1;l_pow_out=1;break;
			case 2:l_pow_out=0;m_pow_out=1;h_pow_out=1;break;
			default:break;
			}
	}
	else {m_pow_out=1;h_pow_out=1;l_pow_out=1;}
if(start_flag==0)
{m_pow_out=1;h_pow_out=1;l_pow_out=1;pout_flag=0;bz_flag=0;bz_out=1;}
if(work_status==1)startflag_5s=1;
else {if(set_min==0)
		{m_pow_out=1;h_pow_out=1;l_pow_out=1;
		pout_flag=0;bz_flag=0;bz_out=1;startflag_5s=0;}
	}
//=====================================================
if((bz_flag)&&(pout_flag)){if(flag_500ms)bz_out=0;else bz_out=1;}
else bz_out=1;
}
/*******************************************************/
/*主函数*/
void main()
{	
	if(ram_flag!=0x55)init();//上电时初始化
	init_timer0();      //定时器T0初始化
	init_timer1();		//定时器T1初始化
	EA=1;	 				//开总中断
		
while(1)            	//无限循环
    {
	if(!start_flag){g_led=0;r_led=1;}// 系统关闭,绿灯亮,红灯灭
	else {g_led=1;r_led=0;}// 否则系统启动,红灯亮,绿灯灭
	key();				//扫描按键
	power_out(powout_flag);	//调用功率切换子函数
	reset()			//看门狗复位
    }
}

⌨️ 快捷键说明

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