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

📄 qichepenyouzuiqingxiji.c

📁 由AT89S51单片机控制检测输入/输出显示和电机调速
💻 C
字号:
#include <AT89X51.H>//11.0592MHz,看门狗工作
#define uchar unsigned char
#define uint unsigned int
#define ON 0;
#define OFF 1;
#define reset() {WDT=0x1e;WDT=0xe1;}//看门狗复位宏定义
uchar code DATA_7SEG[10]={0x3f,0x06,0x5b,0x4f,0x66,
                    0x6d,0x7d,0x07,0x7f,0x6f};/*0~9的数码管段码*/
uint deda;   	//1ms计时单元
uchar sec;		//计时秒
char set_min;	//设定分
uchar min_5m; //5分钟计数器
uchar val; //中间变量
uchar pwm_val; //调宽脉冲变量值
char push_val; //压力变化值
sfr WDT=0xa6;//定义看门狗定时器
sbit pushdec_key=P1^4; //压力-键
sbit pushinc_key=P1^3; //压力+键
sbit timedec_key=P1^2; //时间-键
sbit timeinc_key=P1^1; //时间+键
sbit buzz=P3^5; //驱动蜂鸣器端
sbit out=P3^6;//调宽脉冲输出端
sbit relay=P3^7; //驱动继电器端
uchar dis_sel; //显示内容散转标志
bit over_5m; //5分钟溢出标志
bit flag_5m; //5分钟标志
bit flag_5s; //5秒钟标志
bit start; //启动标志
bit dis_flag; //显示标志
bit key_flag; //按下键标志
bit buzz_sound; //蜂鸣器声响标志
bit y; //中间变量
bit out_flag;//pwm输出标志
/*****************函数声明列表*****************/
void time_conv(void);// 时间计算子函数
void pwm_out(void);// 调宽脉冲输出子函数
void push_dis(void); //显示压力子函数
void oil_dis(void); //显示缺油子函数
void normal_dis(void) ;//显示正常工作子函数
void other_dis(void); //显示(缺油、超温)子函数
void temp_dis(void); //显示超温子函数
void oil_low(void); //缺油处理子函数
void temp_over(void); //超温处理子函数
void other(void); //(缺油、超温)处理子函数
void buzz_control(void); //控制蜂鸣器子函数
void delay(uint k); //延时子函数
void init(void); //初始化子函数
void init_timer0();//定时器0初始化子函数
void init_timer1();//定时器1初始化子函数
void key(void)	; //按键/感应开关处理子函数
void close(void); //关机子函数
void time_inc(void); //时间+子函数
void time_dec(void); //时间-子函数
void push_inc(void); //压力+子函数
void push_dec(void); //压力-子函数
void normal_work(void); //正常工作子函数
/**********************************/
/*******************初始化**********************/
void init()
{
IT0=1;
IE=0x8b;
reset()
}	
/*********************定时器T0初始化************************/
void init_timer0()
{
TMOD=0x11;
TH0=-(1150/256);
TL0=-(1150%256);
TR0=0;ET0=1;EA=1;
}
/*************定时器T1初始化************/
/*定时器T1初始化*/
void init_timer1()
{
TH1=-(5000/256);
TL1=-(5000%256);
TR1=1;ET1=1;EA=1;
}
/*************延时子函数***************/
/*延时子函数*/
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++){
for(j=0;j<60;j++)
{;}	reset()}
}


/********************外中断0服务子函数*********************/
void int0_serve(void) interrupt 0 using 1
{
delay(20);
if(P3_2==0)
start=!start;
	while(P3_2==0)
	{delay(20);
	if(P3_2==1)break;}
}
/****************************************/
/*1mS定时中断服务子函数*/
void timer0(void) interrupt 1  using 2
{
TH0=-(1150/256);
TL0=-(1150%256);
deda++;
pwm_val++;
pwm_out();
time_conv();
}
/*************调宽脉冲输出子函数***************/
void pwm_out(void)
{
	if(out_flag)
	{
		if(pwm_val<=(push_val+30)) {out=ON;}
		else {out=OFF;}
		if(pwm_val>=50) pwm_val=0;
	}
	else out=OFF;
}
/****************时间计算子函数***************/
void time_conv(void)
{
if(deda>=1000){sec++;deda=0;}
if(deda==500){buzz_sound=!buzz_sound;}
if(sec>=60)
{set_min--;sec=0;
	if(flag_5m)min_5m++;
}
if(min_5m>=5){over_5m=1;min_5m=0;}
if(set_min<=0)set_min=0;
/***************/
}

/**************** T1 5ms定时中断服务子函数(显示用)******************/
void timer1(void) interrupt 3  using 3
{
TH1=-(5000/256);
TL1=-(5000%256);
	if(start)
	{	
		switch (dis_sel)
		{case 0:normal_dis();break;
		case 1:oil_dis();break;	
		case 2:temp_dis();break;		
		case 3:other_dis();break;
		case 4:push_dis();break;	
		default:break;
		}
	}
		else 
		{ P2=0x00;P3=0xff;}
	reset()
}
/*******************压力调整显示子函数*********************/
void push_dis(void)
{
	if(dis_flag)
		{ P2=DATA_7SEG[(push_val)/10];
		P3_0=0;P3_1=0;P3_3=1;P3_4=1;dis_flag=0;}
		else
		{ P2=DATA_7SEG[(push_val)%10];
		P3_0=1;P3_1=1;P3_3=0;P3_4=0;dis_flag=1;}
}
/********************正常工作显示子函数********************/
void normal_dis(void)	
{	
		if(dis_flag)
		{ P2=DATA_7SEG[set_min/10];
		P3_0=0;P3_1=0;P3_3=1;P3_4=1;dis_flag=0;}
		else
		{ P2=DATA_7SEG[set_min%10];
		P3_0=1;P3_1=1;P3_3=0;P3_4=0;dis_flag=1;}
}
/***********************缺油显示子函数***********************/
void oil_dis(void)	
{
	if(buzz_sound)	
	{	if(dis_flag){P2=0x40;P3_0=0;P3_1=0;P3_3=1;P3_4=1;dis_flag=0;}
		else {P2=0x40;P3_0=1;P3_1=1;P3_3=0;P3_4=0;dis_flag=1;}
	}
	else {P3_0=1;P3_1=1;P3_3=1;P3_4=1;}
}
/*****************超温显示子函数******************/
void temp_dis(void)	
{
		if(dis_flag){P2=0x40;P3_0=0;P3_1=0;P3_3=1;P3_4=1;dis_flag=0;}
		else {P2=0x40;P3_0=1;P3_1=1;P3_3=0;P3_4=0;dis_flag=1;}
}
/*********************超温、缺油同时发生显示子函数*************************/
void other_dis(void)	
{
	if((deda<250)||((deda>500)&&(deda<750)))
	{	if(dis_flag){P2=0x40;P3_0=0;P3_1=0;P3_3=1;P3_4=1;dis_flag=0;}
		else {P2=0x40;P3_0=1;P3_1=1;P3_3=0;P3_4=0;dis_flag=1;}
	}
	else {P3_0=1;P3_1=1;P3_3=1;P3_4=1;}
}

/*******************按键\感应开关处理子函数**********************/
void key(void)			
{	
	delay(10);
	while(P1!=0xff)
	{
		switch (P1)
		{
		case 0xfd:time_inc(); break;
		case 0xfb:time_dec(); break;
		case 0xf7:push_inc(); break;
		case 0xef:push_dec(); break;
		case 0xdf:oil_low(); break;
		case 0xbf:temp_over(); break;
		case 0x9f:other(); break;
		default:break;
		}
		delay(500);
	}
	if(set_min>=4){key_flag=1;TR0=1;}
}
/******************主函数******************/
void main()
{	init();
	init_timer0();      //定时器T0初始化
	init_timer1();		//定时器T1初始化
	while(1)            	//无限循环
 {	
/*------------------------------------*/
	if(start)
	{
		if(P1!=0xff)key();
		else normal_work();
	}
	else close();
  }
}

/*********************正常工作子函数*************************/
void normal_work()
{	
	dis_sel=0;
	if((key_flag)&&(!flag_5s))
	{relay=OFF;buzz=OFF;delay(6000);flag_5s=1;}
	if(flag_5s)	
	{	y=0;
		buzz_control();dis_sel=0;
		if(set_min==0)
		{out_flag=0;buzz=OFF;flag_5m=1;
		flag_5s=0;key_flag=0;delay(1000);relay=OFF;}
		else {relay=ON;delay(1000);out_flag=1;}
	}
if(over_5m){over_5m=0;flag_5m=0;start=0;min_5m=0;
				out=OFF;relay=OFF;reset()}
}
/*****************超温、缺油同时发生处理子函数******************/
void other(void)
{
delay(10);
if(P1==0x9f){while(1){dis_sel=3;relay=OFF;buzz=OFF;out_flag=0;if(!start)break;}}
	else dis_sel=0;
}

/*******************超温发生处理子函数*****************/
void temp_over(void)
{
delay(10);
if(P1==0xbf){while(1){dis_sel=2;relay=OFF;buzz=OFF;out_flag=0;if(!start)break;}}
	else dis_sel=0;
}
/*******************缺油发生处理子函数*****************/
void oil_low(void)
{
delay(10);
if(P1==0xdf){while(1){dis_sel=1;relay=OFF;out_flag=0;buzz=OFF;if(!start)break;}}
	else dis_sel=0;
}

/*****************关机处理子函数*******************/	
void close(void)
{P2=0xff;P3=0xff;relay=OFF;buzz=OFF;P1=0xff;out_flag=0;reset()
dis_sel=0;set_min=0;key_flag=0;flag_5s=0;out=OFF;push_val=20;}
/*************控制蜂鸣器子函数***************/
void buzz_control(void)
{
if((set_min>0)&&(set_min<4))buzz=buzz_sound;
else buzz=OFF;}
/****************时间增加子函数*******************/
void time_inc(void)
{	if(!timeinc_key)set_min++;
	if(set_min>=60)set_min=60;dis_sel=0;
}
/******************时间减少子函数******************/
void time_dec(void)
{	if(!timedec_key)set_min--;
	if(set_min<=0)set_min=0;dis_sel=0;
}
/*******************压力增加子函数*********************/
void push_inc(void)
{
while(!y){dis_sel=4;delay(2500);y=1;}
if(!pushinc_key)push_val=push_val++;
if(push_val>=20)push_val=20;
}
/*******************压力减少子函数*********************/
void push_dec(void)
{
while(!y){dis_sel=4;delay(2500);y=1;}
if(!pushdec_key)push_val=push_val--;
if(push_val<=0)push_val=0;
}

⌨️ 快捷键说明

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