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

📄 tyj.c

📁 51单片机控制的家用投影仪控制器的源程序,LCD显示等
💻 C
字号:
#include <AT892051.H>//11.0592MHz晶振
#define uchar unsigned char
#define uint unsigned int
/***************************************/
bit on_off=0;//开/关机标志,"1"开,"0"关
bit over30s=0;//30秒溢出标志,"1"溢出,"0"未溢出
bit time30s=0;//30秒定时启动标志,"1"启动,"0"不启动
bit over3m=0;//3分钟溢出标志,"1"溢出,"0"未溢出
bit time3m=0;//3分钟定时启动标志,"1"启动,"0"不启动
bit drv_flag=0;//驱动板启动标志,"1"已启动,"0"已关闭
bit off_flag=0;//允许关机标志,"1"允许关机,"0"不允许关机
bit rled_flashf=0;//红发光管快闪启动标志,"1"启动,"0"关闭
bit rled_flashs=0;//红发光管慢闪启动标志,"1"启动,"0"关闭
bit gled_flash=0;//绿发光管慢闪启动标志,"1"启动,"0"关闭
bit off10s_flag=0;//关机时10秒计时标志,"1"启动计时10秒,"0"关闭计时
uchar cnt=0;		// 30秒软件计数器
uchar key_flag=0;//键按下计数器
uint counter=0;// 3分钟软件计数器

/***************以下为I/O端口定义*****************/
sbit inc=P3^4;//焦距增加值按键
sbit dec=P3^5;//焦距减少值按键
sbit m0=P1^6;//焦距电机正转输出
sbit m1=P1^5;//焦距电机反转输出
sbit rled=P1^2;//输出至红发光管
sbit gled=P1^3;//输出至绿发光管
sbit out_drv=P1^4;//输出负脉冲至驱动板
sbit out_light=P3^1;//输出控制220V光源继电器
sbit out_fan=P3^0; //输出控制12V风扇继电器
sbit check_tem=P3^6;//温度检测端
sbit check_light=P3^7;//光源检测端

/**********函数列表************/
void start();
void drv();
void fun_light();
void fun_tem();
void fun1();
void init();
void init_timer1();
void delay(uint k);
void drv_mot(void);

/***********主函数************/
void main(void)
{	init();//上电时初始化
    while(1)//无限循环
  {	
	if(on_off)//若启动标志为1
	{	
       if(!off_flag){start();off_flag=1;}// 若原来停机等待,则启动
			check_tem=1;check_light=1;// 温度与光源检测端置为输入状态
		if((!check_tem)&&(!check_light))//若光源与温度正常
            {
				if(drv_flag)//若已启动驱动板
				{drv_mot();//调用驱动焦距电机的子程序,进行调焦
				gled=0;rled=1;//正常工作过程,绿灯亮
				gled_flash=0;rled_flashf=0;rled_flashs=0;// 绿灯慢闪标志复位,
//红灯快、慢闪标志复位
				out_light=0;// 投影光源亮
				out_fan=0;// 冷却风扇转
				}
			}
	
		 if(check_tem)fun_tem();//若温度不正常,调用fun_tem()子程序处理
		if(check_light)fun_light();//若光源不正常,调用fun_light()子程序处理
	 }
	else//否则启动标志为0,进入关机或待机过程
	{	
		if(off_flag)// 若关机标志有效
		{if(drv_flag)fun1();}//若已启动驱动板,进入关机过程
	rled=0;gled=1;// 正常待机过程
	out_light=1;// 投影光源灭
	out_fan=1;// 冷却风扇停转
		
  	}
  }
}

/*******************初始化子函数**********************/
void init()
{inc=1;dec=1;m0=1;m1=1;//
check_tem=1;
check_light=1;
P3_2=1;P3_3=1;
init_timer1();
IT0=1;IT1=1;
/*====================*/
on_off=0;off_flag=0;drv_flag=0;
off10s_flag=0;
}


/********************定时器1初始化***********************/
void init_timer1()
{
TMOD=0x11;
TH0=-(48000/256);
TL0=-(48000%256);
IE=0x8f;
TR1=1;
}


/*********************定时器1中断服务子函数***********************/
void time1(void) interrupt 3 using 1 
{
TH0=-(48000/256);// 重装定时初值
TL0=-(48000%256);
/*--------------------*/
if(gled_flash)// 若绿灯慢闪标志有效
{cnt++;//开始计数
	if(cnt>=10){gled=!gled;cnt=0;}// 每0.5秒绿灯闪动一次
}
/*---------------------*/
if(rled_flashs)// 若红灯慢闪标志有效
{cnt++;
	if(cnt>=10){rled=!rled;cnt=0;} // 每0.5秒红灯闪动一次
}
/*-------------------------*/
if(rled_flashf)// 若红灯快闪标志有效
{cnt++;
	if(cnt>=2){rled=!rled;cnt=0;} // 每0.1秒红灯闪动一次
}
/*-----------------------*/
if(time3m) // 若3分启动标志有效
{counter++;//开始计数
	if(counter>=2510){over3m=1;counter=0;}//3分到,则3分溢出标志置位
}
/*------------------------*/
if(time30s) // 若30秒启动标志有效
{counter++;//开始计数
	if(counter>=400){over30s=1;counter=0;} //30秒到,则30秒溢出标志置位
}
/*--------------------*/
if(off10s_flag) // 若10秒关机标志有效
{counter++;//开始计数
if(counter>=130){off10s_flag=0;key_flag=1;counter=0;} 
//若10秒内无第二次关机按键动作,则键计数器置1,继续保持开机工作
}
}

/*******************外中断0服务子函数**********************/
void zd_int0() interrupt 0 using 2//遥控控制开/关机
{
on_off=!on_off;	//		开/关机标志取反,"1"开,"0"关
}

/*********************外中断1服务子函数********************/
void zd_int1() interrupt 2 using 3//手动控制开/关机
{
delay(5);// 延时5mS再判
if(P3_3==0)key_flag++;//若键依旧按下,键计数器递加
if(key_flag==1){on_off=1;off10s_flag=0;}// 键计数器为1,则开机
if(key_flag>=3)key_flag=0;// 键计数器的范围为0-2,即0-20秒有效
if(key_flag==0){on_off=0;off10s_flag=0;} // 键计数器为0,则关机等待
if(key_flag==2)off10s_flag=1;// 键计数器为2,进入关机状态
/*机器已工作情况下,10秒内连按二次关机键,键计数器为2,进入关机。否则,10秒一到,键计数器又置1继续进入工作。因为电脑认为可能有人不慎碰到关机键*/
	while(P3_3==0)// 等待释放键后退出中断子函数
	{delay(5);
	if(P3_3==1)break;}
}

/********************延时k*1mS子函数*********************/
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++){
for(j=0;j<121;j++)
{;}}
}

/**********************启动子函数**********************/
void start()
{   gled_flash=0;rled_flashf=0;rled_flashs=0;// 复位相关标志
	gled=0;rled=1;// 绿灯亮
    out_light=0;// 点亮投影灯光源
    out_fan=0;// 冷却风扇启动
    time30s=1;//30秒标志置位
	EX0=0;EX1=0;// 开放INT0、INT1中断
    while(!over30s);// 等延时30秒
    time30s=0;// 相关标志复位
    over30s=0;
    if(!check_light)// 若光源检测端为低电平,即光源正常发光
	{
		if(!drv_flag){drv();drv_flag=1;}// 若驱动板启动标志为"0" (尚未启动),
//调用触发子函数
	}
	EX0=1;EX1=1;// 关闭外中断
}

/************************产生触发驱动板的负脉冲子函数*************************/
void drv()// 产生1mS的负脉冲
{
out_drv=1; 
out_drv=0;
delay(1);
out_drv=1;
}

/***********************光源不正常处理子函数**************************/
void fun_light()
{	if(drv_flag){drv();drv_flag=0;}
out_fan=0;
out_light=1;gled=1;	
rled_flashf=0;
rled_flashs=1;
	over3m=0;
	time3m=1;
	EX0=0;EX1=0;
	while(!over3m){out_light=1;out_fan=0;}
	EX0=1;EX1=1;
	time3m=0;
	over3m=0;
	on_off=0;
		while(!on_off)
		{out_fan=1;out_light=1;gled=1;off_flag=0;key_flag=0;
		rled_flashf=0;rled_flashs=1;gled_flash=0;off10s_flag=0;
		if(on_off){rled_flashs=0;break;}
		}
}

/*************************温度不正常处理*****************************/
void fun_tem()
{	if(drv_flag){drv();drv_flag=0;}
out_fan=0;
out_light=1;gled=1;	
rled_flashf=1;
rled_flashs=0;
	over3m=0;
	time3m=1;
	EX0=0;EX1=0;
	while(!over3m){out_light=1;out_fan=0;}
	EX0=1;EX1=1;
	time3m=0;
	over3m=0;
	on_off=0;
		while(!on_off)
		{out_fan=1;out_light=1;gled=1;off_flag=0;key_flag=0;
		rled_flashf=1;rled_flashs=0;gled_flash=0;off10s_flag=0;
		if(on_off){rled_flashf=0;break;}
		}
}

/********************关机子函数*********************/ 
void fun1()
{	out_light=1;// 关闭光源
	if(drv_flag){drv();drv_flag=0;} // 若驱动板启动标志为"1"(已经启动工作),
//调用触发子函数发一个脉冲令其关机
	over3m=0;// 清除3分溢出标志
	time3m=1;// 启动3分计时
	EX0=0;EX1=0;// 关闭外中断
	while(!over3m){gled_flash=1;rled_flashf=0;rled_flashs=0;rled=1;out_fan=0;} /*等待
3分延时,同时打开风扇冷却*/
	EX0=1;EX1=1; // 3分过,打开外中断
	over3m=0; //清除标志
	time3m=0; 
	off_flag=0;
	out_light=1;
	out_fan=1;
	gled_flash=0;
	rled_flashf=0;rled_flashs=0;
	gled=1;
	rled=0;
}

/**********驱动焦距电机的子函数*************/
void drv_mot(void)
{	
	if((!inc)||(!dec))
	{delay(10);
		if(!inc){m0=0;m1=1;}
		else if(!dec) 
			{m1=0;m0=1;}
			else {m1=1;m0=1;}
	}
	if((inc)&&(dec)){m1=1;m0=1;}
}

⌨️ 快捷键说明

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