单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:289|回复:2
打印上一主题下一主题

单片机电饭煲程序

[复制链接]
跳转到指定楼层
楼主
ID:918728发表于 2024-4-29 10:41|只看该作者回帖奖励
#include "includes.h"
uint temp;
uint count;                
uint hour,minute,sec,oldsec=0;
uint hour1=0,minute1=0,sec1=0;   //时,分,秒

sbit green = P1^0;                 //工作指示灯
sbit red  = P1^1;               //停止指示灯

sbit Cook = P1^2;                 //速煮米饭
sbit Soup  = P1^3;               //精煮米饭
sbit congee = P1^7;                 //煮粥
sbit Stewed = P2^0;                 //煲汤

sbit KeepHeat = P1^4;         //保温
sbit menu = P1^5;                 //时间预约
sbit add = P1^6;                 //加      
sbit dec = P2^1;                 //减      

sbit Beep = P2^4;                 //蜂鸣器
sbit AddTemp = P3^7;  //加热
uint ModeFlag;
unsigned char mode;
void KeepTemp(void);

/*******************************************
******       延时程序   ***************
*******************************************/
void delay_ms(unsigned char ms)   // 延时毫秒@12M,ms最大值255  
{  
   unsigned char i;  
   while(ms--)  
       for(i = 0; i< 5; i++);  
}

void delay00(unsigned int z)
{
       unsigned int x,y;
       for(x=z;x>0;x--)
           for(y=110;y>0;y--);
}

/*******************************************
******       设置工作模式   ***************
*******************************************/
void SetMode()
{
       if(Cook == 0)       //速煮米饭
       {
           delay_ms(5);
           while(!Cook);
           sec = 0;
           minute = 0;
           count = 0;
           ModeFlag = 1;
       }
       else if(Soup == 0)         //精煮米饭
       {
           delay_ms(5);
           while(!Soup);
           sec = 0;
           minute = 0;
           count = 0;
           ModeFlag = 2;
       }

       else if(KeepHeat == 0)   //保温
       {
           delay_ms(5);
           while(!KeepHeat);
           sec = 0;
           minute = 0;
           count = 0;
           ModeFlag = 5;
       }
       else if(congee == 0)           //煮粥
       {
           delay_ms(5);
           while(!congee);
           sec = 0;
           minute = 0;
           count = 0;
           ModeFlag = 3;
       }      

       else if(Stewed == 0)           //煲汤
       {
           delay_ms(5);
           while(!Stewed);
           sec = 0;
           minute = 0;
           count = 0;
           ModeFlag = 4;
       }          
}

/*******************************************
******       速煮米饭部分   ***************
*******************************************/
void CookRice(void)                   //速煮米饭
{
       LCD_WriteString(0,0,"Cook Rice..");

       AddTemp = 0;//开始加热
       green = 0;
       red=1;
       if(temp >= 500)  //超过50度
       {
           TR0 = 1;
           if(sec!=oldsec)
           {

                 oldsec=sec;
                 LCD_SramChar(11,1,(3 - minute)%100/10+0x30);             //4分钟
                 LCD_SramChar(12,1,(3 - minute)%10+0x30);
                 LCD_SramChar(13,1,':');
                 LCD_SramChar(14,1,(59 - sec)%100/10+0x30);
                 LCD_SramChar(15,1,(59 - sec)%10+0x30);
           }
       }

       else
       TR0 = 0;
       if((1 - minute) == 0&& (59 - sec) == 0)
       {      
           TR0 = 0;
           AddTemp = 1;
           green = 1;
         red=0;

           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);

           ModeFlag=5;             //保温
       }
}

/*******************************************
******       精煮米饭部分   ***************
*******************************************/
void CookCong(void)                
{
       LCD_WriteString(0,0,"Cook Cong..");

       AddTemp = ~AddTemp;//开始加热
       green = 0;
       red=1;
       if(temp >= 500)//超过50度
       {
           TR0 = 1;
           if(sec!=oldsec)
           {

                 oldsec=sec;
                 LCD_SramChar(11,1,(6 - minute)%100/10+0x30);             //7分钟
                 LCD_SramChar(12,1,(6 - minute)%10+0x30);
                 LCD_SramChar(13,1,':');
                 LCD_SramChar(14,1,(59 - sec)%100/10+0x30);
                 LCD_SramChar(15,1,(59 - sec)%10+0x30);
           }
       }
       else
       TR0 = 0;
       if((1 - minute) == 0&& (59 - sec) == 0)
       {      
           TR0 = 0;
           AddTemp = 1;
           green = 1;
         red=0;
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           ModeFlag=5;
       }
}

/*******************************************
******       煮粥部分   ***************
*******************************************/
void CookSoup(void)                 //煮粥
{
       LCD_WriteString(0,0,"Cook Soup..");
   delay00(200);
       AddTemp = ~AddTemp;//开始加热
      
       green = 0;
       red=1;
       if(temp >= 450)//超过45度      
       {
           TR0 = 1;

           if(sec!=oldsec)
           {
                 oldsec=sec;
                 LCD_SramChar(11,1,(3 - minute)%100/10+0x30);       //4 分钟
                 LCD_SramChar(12,1,(3 - minute)%10+0x30);
                 LCD_SramChar(13,1,':');
                 LCD_SramChar(14,1,(59 - sec)%100/10+0x30);
                 LCD_SramChar(15,1,(59 - sec)%10+0x30);
           }
       }
       else
       TR0 = 0;
       if((1 - minute) == 0&& (59 - sec) == 0)
       {
           TR0 = 0;
           AddTemp = 1;
           green = 1;
         red=0;

           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           //KeepTemp();
           ModeFlag=5;
       }

/*******************************************
******       煲汤部分   ***************
*******************************************/
void Stewedsoup(void)                 //煲汤
{
       LCD_WriteString(0,0,"Stew soup..");
       AddTemp = ~AddTemp;//开始加热
   delay00(800);
       green = 0;
       red=1;
       if(temp >= 400)//超过40度      
       {
           TR0 = 1;

           if(sec!=oldsec)
           {
                 oldsec=sec;
                 LCD_SramChar(11,1,(5 - minute)%100/10+0x30);       //6分钟
                 LCD_SramChar(12,1,(5 - minute)%10+0x30);
                 LCD_SramChar(13,1,':');
                 LCD_SramChar(14,1,(59 - sec)%100/10+0x30);
                 LCD_SramChar(15,1,(59 - sec)%10+0x30);
           }
       }
       else
       TR0 = 0;
       if((1 - minute) == 0&& (59 - sec) == 0)
       {
           TR0 = 0;
           AddTemp = 1;
           green = 1;
         red=0;

           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           Beep = 0;delay00(200);Beep = 1;delay00(200);
           ModeFlag=5;
       }
}

/*******************************************
******       保温部分   ***************
*******************************************/
void KeepTemp(void)
{
       LCD_WriteString(0,0,"Keep Temp..     ");
       AddTemp = 0;//开始加热
       green = 0;
       red=0;
       if(temp >= 300)//超过60度       30
       {
           AddTemp = 1;//停止加热
       }


else if(temp< = 300)         //开始加热 30度
       {
           AddTemp = 0;
           green = 0;
         red=0;
       }
}

/*******************************************
******       按键部分   ***************
*******************************************/
void key_scan()  
{
       unsigned char s1num=0;
       if(menu==0)      
     {
     delay00(50);
         if(menu==0)
         {
         while(!menu);      
             s1num++;
           command(0x01);
           TR0 = 0; hour=0;minute=0;sec=0;
           while(1)
         {
               if(menu==0)
         {
           delay00(50);
               if(menu==0)
               {
                         while(!menu);
                 s1num++;
                   }
             }
                                
                 if(s1num==1)          
                 {      
                       LCD_WriteString(0,0,"Set Mode:");
                       LCD_SramChar(9,0,mode/10+0x30);
                       LCD_SramChar(10,0,mode%10+0x30);

                   if(add==0)
                       {
                             delay00(30);
                             if(add==0)
                                 {       while(!add);
                                                       mode ++;
                                           if(mode >= 5)
                                                 mode = 0;
                                                 LCD_SramChar(9,0,mode/10+0x30);
                                                 LCD_SramChar(10,0,mode%10+0x30);
                                 }
                           }

                       if(dec==0)
                       {
                             delay00(30);
                             if(dec==0)
                                 {       while(!dec);
                                       if(mode == 0)
                                           mode = 5;
                                           mode --;
                                           LCD_SramChar(9,0,mode/10+0x30);
                                           LCD_SramChar(10,0,mode%10+0x30);
                                 }
                           }
                 }

                 if(s1num==2)          
                 {      
                       LCD_WriteString(0,0,"Set hour:");
                       LCD_SramChar(9,0,hour1/10+0x30);
                       LCD_SramChar(10,0,hour1%10+0x30);

                   if(add==0)
                       {
                             delay00(30);
                             if(add==0)
                                 {       while(!add);
                                                       hour1 ++;
                                           if(hour1 == 12)
                                                 hour1 = 0;
                                                 LCD_SramChar(9,0,hour1/10+0x30);
                                                 LCD_SramChar(10,0,hour1%10+0x30);
                                 }
                           }
                       if(dec==0)
                       {
                             delay00(30);
                             if(dec==0)
                                 {       while(!dec);
                                       if(hour1 == 0)
                                           hour1 = 12;
                                           hour1 --;
                                           LCD_SramChar(9,0,hour1/10+0x30);
                                           LCD_SramChar(10,0,hour1%10+0x30);
                                 }
                           }
                 }


                 if(s1num==3)          
                 {      
                       LCD_WriteString(0,0,"Set minute:");
                       LCD_SramChar(11,0,minute1/10+0x30);
                       LCD_SramChar(12,0,minute1%10+0x30);

                   if(add==0)
                     {
                     delay00(30);
                     if(add==0)
                       {       while(!add);
                           minute1 ++;
                                       if(minute1 == 60)
                                           minute1 = 0;
                                           LCD_SramChar(11,0,minute1/10+0x30);
                                           LCD_SramChar(12,0,minute1%10+0x30);
                 }
                     }

             if(dec==0)
                     {
                     delay00(30);
                     if(dec==0)
                       {       while(!dec);
                                 if(minute1 == 0)
                                       minute1 = 60;
                                 minute1 --;
                                 LCD_SramChar(11,0,minute1/10+0x30);
                                 LCD_SramChar(12,0,minute1%10+0x30);
                       }
                     }
                 }

                 if(s1num == 4)
                 {      
                       s1num=0;//s1num清零//
                       command(0x01);   //清屏
                       ModeFlag = 6;
                       AddTemp = 1;
                       TR0 = 1;
                       break;
                 }
           }
       }
       }
}

/*******************************************
******     显示预约剩余时间部分   ***************
*******************************************/
void SetTime(void)
{
       LCD_SramChar(0,1,(hour1 - hour)%100/10+0x30);         //hour1 是设定的时间,hour是正常走的时间
       LCD_SramChar(1,1,(hour1 - hour)%10+0x30);
       LCD_SramChar(2,1,':');
       if((minute1-minute)>0)
       {
           LCD_SramChar(3,1,(minute1 - 1 - minute)%100/10+0x30);
           LCD_SramChar(4,1,(minute1 - 1 - minute)%10+0x30);
       }

       else
       {
           LCD_SramChar(3,1,'0');
           LCD_SramChar(4,1,'0');
       }
       LCD_SramChar(5,1,':');
       if(((hour1 - hour)>0)||((minute1-minute)>0))
       {
           LCD_SramChar(6,1,(59 - sec)%100/10+0x30);
           LCD_SramChar(7,1,(59 - sec)%10+0x30);
       }

       else
       {
           LCD_SramChar(6,1,'0');
           LCD_SramChar(7,1,'0');
       }
       LCD_WriteString(8,1,"   ");
       if((minute1 - 1 - minute) == 0&& (59 - sec) == 0&& (hour1 - hour) == 0)
       {
           TR0 = 0;Beep = 0;delay00(200);Beep = 1;
           ModeFlag = mode;
           hour=0;minute=0;sec=0;
       }
}

/*******************************************
******       主函数  ***************
*******************************************/
void main()
{
       EA = 1;
       TMOD = 0X01;
       ET0 = 1;
       TH0 = 0X3C;
       TL0 = 0XB0;
       Beep = 1;
       AddTemp = 1;
       LCD_Initial();
       Init_DS18B20();
       temp = ReadTemperature();
       delay_ms(100);

       while(1)
       {
                 temp = ReadTemperature();
                 LCD_WriteString(0,2,"NowTemp=");
                 LCD_SramChar(8,2,temp%10000/1000+0x30);      
                 LCD_SramChar(9,2,temp%1000/100+0x30);
                 LCD_SramChar(10,2,temp%100/10+0x30);
                 LCD_SramChar(11,2,'.');
                 LCD_SramChar(12,2,temp%10+0x30);
                 LCD_SramChar(13,2,'C');
                 SetMode();
                 key_scan();

                 switch(ModeFlag)           //模式选择
                 {
                       case 1:       CookRice();break;
                       case 2: CookCong();break;
                       case 3:       CookSoup();break;
                       case 4:       Stewedsoup();break;
                       case 5:       KeepTemp();break;      
                       case 6:       SetTime();break;                          
                 }
       }
}

/*******************************************
******       定时器定时部分   ***************
*******************************************/
void t0() interrupt 1
{
       TH0 = 0X3C;
       TL0 = 0XB0;
       count ++;
       if(count >= 20)
       {
             count = 0;
           sec ++;
           if(sec == 60)
           {
                 sec = 0;
                 minute ++;
                 if(minute == 60)
                       hour ++;
           }
       }
}





沙发
ID:23640发表于 2024-5-20 14:37|只看该作者
居然没有PID控制
板凳
ID:287224发表于 2024-6-21 11:18|只看该作者
有原理图不

手机版|小黑屋|51黑电子论坛|51黑电子论坛6群QQ管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网