基于51单片机的微波炉仿真原理图程序方案设计

原理图:

基于51单片机的微波炉仿真原理图程序方案设计_第1张图片
仿真:
基于51单片机的微波炉仿真原理图程序方案设计_第2张图片
程序设计:

#include 
#define  uint unsigned int
#define  uchar unsigned char
uint dis[]={0x00,0x00,0x00,0x00};
uint pv=1,pv_j=6,pv_l=24; //定义 档位、加热时间、冷却时间(每个周期)
uint count_s=0;    //记录定时时间
uint cyc0=20,cyc1=20;    // 为了计时一秒,定时器一次中断为50ms,20*50ms=1s
uchar codevalue[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};  //七段数码管显示码,显示0~9和全亮
uchar codecho[]={0xfe,0xfd,0xfb,0xf7};		  //位选码
sbit P10=P1^0;		//引脚定义
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
sbit duan=P2^0;
sbit wei=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
/*--------------------
  延时函数,大致延时一毫秒
-------------------*/
void delay_ms(uint t)
{uchar i;
	while(t--)	 
	{
		i=250;
		while(--i);		
	}	
}
	/*------------------------
   定时器初始化
--------------------------*/
void t_clr()
{
	EA=1;            //CPU开中断
	ET0=1;
	ET1=1;           //定时器 中断允许
	TMOD=0X11;       //定时器T1、T0 定时   方式一
	TH0=0X3c;
	TL0=0Xaf;
                    //12M 晶振,65536-15536=50000,50000us*20=1000000us=1s
	TH1=0X3c;
	TL1=0X0af;
}
/*------------------------
    键盘扫描函数
--------------------------*/
void key_scan()
{
	if(!P10)
	{
	 delay_ms(120);
		if(!P10)
		count_s+=30;      //时间 +30秒
        if (count_s>6000)
            count_s=0;
	}
	
    if(!P11)
	{
	 delay_ms(120);
		if(!P11)
		count_s+=60;       //时间 +1 分
        if (count_s>6000)
            count_s=0;
	}

	if(!P12)
	{
	 delay_ms(120);
		if(!P12)
		count_s+=300;      //时间+5分
        if (count_s>6000)
            count_s=0;
	}

	if(!P13)
	{
	 delay_ms(120);
		if(!P13)
		count_s=0;         //时间清零

	}

	if(!P14)
	{
	 delay_ms(120);
		if(!P14)
		{if (pv<3)
		 pv++;               //档位+1
         pv_j=pv*6+6;        //加热时间
         pv_l=30-pv_j;       //冷却时间
		}

	}

	if(!P15)
	{
	 delay_ms(120);
		if(!P15)
		{if (pv>0)
		 pv--;               //档位-1
         pv_j=pv*6+6;
         pv_l=30-pv_j;
		}

	}

	if(!P16)
	{
	 delay_ms(120);
		if(!P16)
		{
		 P22=1;
         if(count_s==0)          //如果没有设定时间,不加热,定时器不工作 
            {TR0=0;
            TR1=0;}
         else                    //如果已经设定时间,则开始计时,开始加热
		    {                   
            pv_j=6*pv+6;
            pv_l=30-pv_j;
            t_clr();
            TR0=1;
		    TR1=1;
            P22=0;}
		}

	}

	if(!P17)               //停止加热,终止定时器
	{
	 delay_ms(120);
		if(!P17)
		{P22=1;
		 P23=0;
		 TR0=0;
		 TR1=0;
		}
	}
}
/*------------------------
    时间变换为每个显示位
--------------------------*/
void time_converter()
{
	dis[0]=count_s/600;             //取分的十位
	dis[1]=(count_s/60)%10;         //取分的个位
                                 
	dis[2]=(count_s%60)/10;         //取秒的十位
	dis[3]=(count_s%60)%10;  		//取秒的个位
}
/*------------------------
   显示函数
--------------------------*/
void display()
{  
    
    uchar t;
	uchar k;
	for(k=0;k<4;k++)				//LED显示
	{
	 wei=1;
	 P0=codecho[k];
	 wei=0;		
     P0=0xff;
     delay_ms(1);
	 duan=1; 
     P0=codevalue[dis[k]];
	 duan=0;
     P0=0xff;
     delay_ms(1);     

	 }
	P3=codevalue[pv];                 //显示档位 */
	while(!P24)					  //按键测试
	{
	for(t=0;t<4;t++)
	{
	wei=1;
	P0=codecho[t];
	wei=0;
    P0=0xff;
    delay_ms(1);
	duan=1;
    P0=codevalue[10];	
	duan=0;
    P0=0xff;
    delay_ms(1);
	P3=codevalue[10];
	}     
  }
} 
/*------------------------
     主函数
--------------------------*/
void main()
{	    
    uchar n=200;
    P23=0;
	t_clr();        //初始化	
	while(1)
	{
		key_scan();   //键盘扫描
		time_converter();//数值转换
		display();     //显示
	}
}


/*------------------------
   定时器T0中断
--------------------------*/
void t0() interrupt 1
{	
    TR0=0;
    TH0=0X3c;
	TL0=0Xaf;
    cyc0--;
	if (cyc0==0)
		{cyc0=20;
		count_s--;  //时间-1S
        if (count_s==0)  //如果定时已到
            {
			 P22=1;      //停止加热,定时器终止
             TR0=0;
             TR1=0;
             P23=1;
            }
        else 
            TR0=1;        //继续定时
		}
    else
        TR0=1;
   	
}
/*------------------------
    定时器T1中断
--------------------------*/
void t1() interrupt 3
{
    TR1=0;
    TH1=0X3c;
	TL1=0X0af;
    TR1=1;
    if (pv_j!=0)          //需要加热
        {cyc1--;
        if (cyc1==0)
            {cyc1=20;
            pv_j--;
            if (pv_j==0)   //加热时间到
                {
                    P22=1;      //否则,停止加热,进入冷却阶段
                }
            }
        }
    else if (pv_l!=0)           //是否需要冷却
        {cyc1--;
        if (cyc1==0)
            {cyc1=20;
            pv_l--;
            if (pv_l==0)         //冷却时间到
                {
				P22=0;          //进行加热
                pv_j=pv*6+6;}    //再次设定加热时间
            }
        }

}

.

链接:https://pan.baidu.com/s/1u_pgrNexcCtZIcwZY5mKDg
提取码:6ani

.

你可能感兴趣的:(基于51单片机的微波炉仿真原理图程序方案设计)