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

📄 fadianjikz.c

📁 交流发电机电压自动控制器,用于控制交流发电机因外加负载的改变自动稳压之用.
💻 C
字号:
#include<reg51.h>
#include<io.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//4m
/*************************************************
	全局变量
**************************************************/
bit up = 0;
bit down = 0;
uchar bt = 0;	//begin or stop frequency_sample
uchar kp = 0;	//采样次数
uint pinlv[5] = {0,0,0,0,0};
uint jieg = 0x1a0a;
/*************************************************
	延时函数
**************************************************/
void delay(uchar u)
{
	uchar i;
	while(u--)
	{
		for(i=0;i<125;i++)
		{
			_nop_();
		}
	}
}
void time(void)
{
	EA=1;
	TMOD=0x11;
	TH0=0x0;
	TL0=0x0;

	TH1=0xfc;
	TL1=0x18;	//3ms

//	ET0=1;	//允许定时器T0中断
//	TR0=1;	//启动定时器T0

	ET1=1;	//允许定时器T1中断
	TR1=1;	//启动定时器T1

	IT0=1;	//外部中断0下降缘触发
	EX0=1;	//允许外部0中断
	PX0=1;	//外部中断0高优先级
}
/**************************************
	模拟信号控制
***************************************/
void moni(uchar a)
{
	if(((jieg <= 0x17ac)||(outv == 0))&&(a == 3))	//频率高55,电压高230
	{
		up = 0;
		a = 0;
	}
	if(((jieg >= 0x1b20)||(outv == 1))&&(a == 4))	//频率低48,电压低190
	{
		down = 0;
		a = 0;
	}
}
void main(void)
{
	uchar a = 0;
	P1 = 0xff;
	P3 = 0xff;
	time();
	standard = 0;	//基准高
	while(1)
	{
		//---------------------stop-----------------------------
		if((up == 1)||(down == 1))	//正在执行上或者下
		{
			if((sensor0 == 0)||(sensor1 == 0))	//限位传感器
			{								
				delay(10);
				if((sensor0 == 0)||(sensor1 == 0))
				{
					up = 0;
					down = 0;
					a = 0;
				}
			}
			if(a==1)
			{
				if(sdu == 1)
				{
					up = 0;
					a = 0;
				}
			}
			if(a==2)
			{
				if(sdd == 1)
				{
					down = 0;
					a = 0;
				}
			}
		}
		moni(a);
		//-------------------begin--------------------------------
		if(sensor0 == 1)	//没有到达上位
		{
			if((jieg >= 0x1cef)&&(sdu == 1)&&(sdd == 1))	//频率低
		//	if((jieg >= 0x1988)&&(sdu == 1)&&(sdd == 1))	//频率低
			{
				up = 1;
				down = 0;
				standard = 0;	//基准高
				a = 3;
			}
			if((sdu == 0)&&(sdd == 1))
			{
				delay(10);
				if((sdu == 0)&&(sdd == 1))
				{
					up = 1;
					a = 1;
				}
			}
		}
		if(sensor1 == 1)	//没有到达下位
		{
			if((jieg <= 0x15b3)&&(sdu == 1)&&(sdd == 1))	//频率高
		//	if((jieg <= 0x1a92)&&(sdu == 1)&&(sdd == 1))	//频率高
			{
				up = 0;
				down = 1;
				standard = 1;	//基准低
				a = 4;
			}
			if((sdd == 0)&&(sdu == 1))
			{
				delay(10);
				if((sdd == 0)&&(sdu == 1))
				{
					down = 1;
					a = 2;
				}
			}
		}
	}
}
/***********************************************
			外部中断0
************************************************/
void waibu0(void) interrupt 0
{
	uint date,xte;
	if(bt == 0)
	{
		TH0=0x0;
		TL0=0x0;
		TR0 = 1;	//启动记数
	}
	bt++;
	if(bt == 2)
	{
		TR0 = 0;	//关闭记数
		EX0 = 0;	//不允许外部0中断
		pinlv[kp] = TH0*256+TL0;
		kp++;		//地址移动
		bt = 0;		//允许再次记数
		if(kp >= 5)
		{
			kp = 0;

			if(pinlv[0] > pinlv[1])
			{
				date = pinlv[0];
				xte = pinlv[1];
			}
			else 
			{
				date = pinlv[1];
				xte = pinlv[0];
			}
			if(date < pinlv[2])
				date = pinlv[2];
			if(date < pinlv[3])
				date = pinlv[3];
			if(date < pinlv[4])
				date = pinlv[4];

			if(xte > pinlv[2])
				xte = pinlv[2];
			if(xte > pinlv[3])
				xte = pinlv[3];
			if(xte > pinlv[4])
				xte = pinlv[4];
	//如果使用4M的晶振,溢出周期是3us,那么在20MS内的脉冲数是6666.7,最低可以测量30Hz,最高可以测量200Hz
			jieg = pinlv[0] - xte + pinlv[1] + pinlv[2] + pinlv[3] - date + pinlv[4];

			jieg = jieg / 3;
		}		
		else
		{
			EX0 = 1;	//允许外部0中断
		}
	}	
}
/************************************************
		定时器1
*************************************************/
void timer1(void) interrupt 3
{	
	static uchar d = 0;
	static uint suo = 0;
//	TR1=0;		//关闭定时器1
	TH1=0xfc;
	TL1=0x18;	//3ms
	if((up == 1)||(down == 1))
	{
		suo = 0;
		if(d == 0)
		{
			motor_a0 = 0;
			motor_a1 = 1;
			motor_b0 = 1;
			motor_b1 = 1;	
		}
		else if(d == 1)
		{
			motor_a0 = 0;
			motor_a1 = 0;
			motor_b0 = 1;
			motor_b1 = 1;	
		}
		else if(d == 2)
		{
			motor_a0 = 1;
			motor_a1 = 0;
			motor_b0 = 1;
			motor_b1 = 1;	
		}
		else if(d == 3)
		{
			motor_a0 = 1;
			motor_a1 = 0;
			motor_b0 = 0;
			motor_b1 = 1;	
		}
		else if(d == 4)
		{
			motor_a0 = 1;
			motor_a1 = 1;
			motor_b0 = 0;
			motor_b1 = 1;	
		}
		else if(d == 5)
		{
			motor_a0 = 1;
			motor_a1 = 1;
			motor_b0 = 0;
			motor_b1 = 0;	
		}
		else if(d == 6)
		{
			motor_a0 = 1;
			motor_a1 = 1;
			motor_b0 = 1;
			motor_b1 = 0;	
		}
		else if(d == 7)
		{
			motor_a0 = 0;
			motor_a1 = 1;
			motor_b0 = 1;
			motor_b1 = 0;	
		}
	}
	else
	{
		suo ++;
		if((suo>333)&&(d != 0))
		{
			d = 0;
			suo = 0;
		}
		if(suo>336)
		{
			motor_a0 = 1;
			motor_a1 = 1;
			motor_b0 = 1;
			motor_b1 = 1;
			suo = 0;
		}
	}
	if((up == 1)&&(down == 0))
	{
		d ++;
		if(d >= 8)
			d = 0;
	}
	if((up == 0)&&(down == 1))
	{
		if(d == 0)
			d = 8;
		d --;
	}
//	if((up == 0)&&(down == 0)&&(d != 0))
//	if((up == 0)&&(down == 0))
//	{
//		d = 8;
//	}
	if(d == 0)
		EX0 = 1;	//允许外部0中断
}

⌨️ 快捷键说明

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