找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 2725|回复: 6
收起左侧

单片机电饭煲程序

  [复制链接]
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 | 显示全部楼层
有原理图不
回复

举报

ID:482794 发表于 2024-6-26 15:42 | 显示全部楼层
有图不?
回复

举报

ID:1042173 发表于 2024-7-24 20:44 | 显示全部楼层
#include "includes.h"这头文件在那?
回复

举报

ID:336378 发表于 2024-12-16 17:24 | 显示全部楼层
估计不完整的程序,半桶水。
回复

举报

ID:60178 发表于 2025-3-14 04:25 | 显示全部楼层
没有温度传感器啊
回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

快速回复 返回顶部 返回列表