找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 134|回复: 0
打印 上一主题 下一主题
收起左侧

单片机电饭锅程序

[复制链接]
跳转到指定楼层
楼主
ID:918728 发表于 2024-4-24 08:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "reg51.h"
#include "intrins.h"
#include "DHT11.h"
#include "1602.h"
#define uchar unsigned char
#define uint unsigned int
        
sbit led1=P2^2;//指示灯
sbit led2=P2^3;
sbit led3=P2^4;

sbit led7=P3^6;     //预约
sbit led8=P3^5;     //快慢炖切换
sbit led9=P3^7;     //保温
sbit led10=P3^4;     //工作指示灯

sbit heat=P2^1;//加热器
sbit beep=P2^0;//蜂鸣器
sbit shaogan=P3^3;//烧干检测
sbit CLK=        P3^0;//时钟,初始状态为0
sbit DI=        P3^1;//数据输入
sbit DO=        P3^1;// 数据输出
sbit CS=        P2^5;
uint current=0;//存储电流

uint time=0;
uchar pwm=0;//输出功率控制
uchar mode=0;//模式
uchar shi1=0,fen1=1,shi2=0,fen2=1,miao=0;//煮饭时间+预约时间
uint sec=0;
uchar start=0;
uchar key=0,num=0;
uint k_flag;
bit flag;
uchar wendu,shidu;//温度、湿度值
//延时
void delay(uint i)
{
    while(i--);
}
//ms延时
void delay_ms(uint i)
{
    while(i--)
        delay(110);
}

/*********************************************
读取ADC
**********************************************/
uchar ADC()//通道ch0
{
        uchar temp0,temp1,i;
        CS=0;
        temp0=0;
        temp1=0;
        _nop_();
        _nop_();
        DI=1;//开始位
        _nop_();
        _nop_();
        CLK=1;
        _nop_();
        _nop_();
        CLK=0;
        _nop_();
        _nop_();
        DI=0;
        _nop_();
        _nop_();
//选择通道0
        DI=1;
        _nop_();
        CLK=1;//上升沿DI=1
        _nop_();
        CLK=0;//1个下降沿DI=1
        _nop_();
        DI=0;
        _nop_();
        CLK=1;
        _nop_();
        CLK=0;//第3个上升沿DI=0
        _nop_();
           DI=1;
///********通道选择结束开始读取转换后的二进制数****
//下降沿读数,一下进行判断和处理,共8次
for(i=0;i<8;i++)
   {
        temp0=temp0<<1;
        CLK=1;
    if(DO)
           temp0++;
           _nop_();
           CLK=0;
   }
for(i=0;i<8;i++)
   {
        temp1=temp1>>1;
        CLK=1;
    if(DO)
           temp1=temp1 +0x80;
           _nop_();
           CLK=0;
   }
         CS=1;
   return temp0;
}

//蜂鸣器
void buzzr()
{
    beep=0;
    delay_ms(500);
    beep=1;
    delay_ms(500);
    beep=0;
    delay_ms(500);
    beep=1;
    delay_ms(500);
    beep=0;
    delay_ms(500);
    beep=1;
    delay_ms(500);
    beep=0;
    delay_ms(500);
    beep=1;
}

//按键检测
uchar key_scan()
{
    uchar i,j;
    i=0;
    j=0;
    P1=0x0f;
    if(P1!=0x0f) //检测有无按下
    {
        switch(P1)//检测行
        {
        case 0x0e:
            i=1;
            break;
        case 0x0d:
            i=5;
            break;
        case 0x0b:
            i=9;
            break;
        case 0x07:
            i=13;
        }
        P1=0xf0;
        switch(P1)//检测列
        {
        case 0xe0:
            j=0;
            break;
        case 0xd0:
            j=1;
            break;
        case 0xb0:
            j=2;
            break;
        case 0x70:
            j=3;
        }
    }
    if(i+j !=key)
    {
        key=i+j;
        return i+j;
    }
    else
        return 0;
}

//主函数
void main()
{
    uchar i;
    TMOD|=0X01;
    TH0=(65536-1000)/256;
    TL0=(65536-1000)%256;
    ET0=1;//打开定时器0中断允许
    EA=1;//打开总中断
    TR0=1;//打开定时器
    LCD_Initial();
    while(1)
    {
                while(current>110)//过流
                {
                        heat=1;
      beep=~beep;  
                }
                if(current<50) //解除报警
                {
      beep=1;
                }
//     LCD_SramChar(13,2,current/100%10+0x30);           //显示电流
//     LCD_SramChar(14,2,current/10%10+0x30);
//     LCD_SramChar(15,2,current%10+0x30);               
        //点亮指示灯

        switch(mode/2)
        {
        case 5:
            led1=0;
            led2=0;
            led3=1;
            break;
        case 4:
            led1=0;
            led2=1;
            led3=0;
            break;
        case 3:
            led1=0;
            led2=1;
            led3=1;
            break;
        case 2:
            led1=1;
            led2=0;
            led3=0;
            break;
        case 1:
            led1=1;
            led2=0;
            led3=1;
            break;
        case 0:
            led1=1;
            led2=1;
            led3=0;
        }
        //显示
        if(led7==0)               //yuyue
        {

            LCD_WriteString(0,1,"Yu Yue:");
            LCD_SramChar(8,1,shi2/10+0x30);           //初始设定的时间
            LCD_SramChar(9,1,shi2%10+0x30);
            LCD_SramChar(10,1,':');
            LCD_SramChar(11,1,fen2/10%10+0x30);           //初始设定的时间
            LCD_SramChar(12,1,fen2%10+0x30);
            LCD_SramChar(13,1,':');
            LCD_SramChar(14,1,miao/10+0x30);           //初始设定的时间
            LCD_SramChar(15,1,miao%10+0x30);
        }
        else
        {
            if(led10==0)
            {
                LCD_WriteString(0,1,"ShiJian:");
                LCD_SramChar(8,1,shi1/10+0x30);           //初始设定的时间
                LCD_SramChar(9,1,shi1%10+0x30);
                LCD_SramChar(10,1,':');
                LCD_SramChar(11,1,fen1/10%10+0x30);           //初始设定的时间
                LCD_SramChar(12,1,fen1%10+0x30);
                LCD_SramChar(13,1,':');
                LCD_SramChar(14,1,miao/10+0x30);           //初始设定的时间
                LCD_SramChar(15,1,miao%10+0x30);
            }
            else
            {
                LCD_WriteString(0,1,"     dianfanguo");
            }
        }



        LCD_WriteString(0,2,"WD:");
        LCD_SramChar(3,2,wendu/10+0x30);           //显示温度
        LCD_SramChar(4,2,wendu%10+0x30);
        LCD_WriteString(7,2,"SD:");
        LCD_SramChar(10,2,shidu/10+0x30);           //显示湿度
        LCD_SramChar(11,2,shidu%10+0x30);

        i=key_scan();//按键检测

        if((i<7)&&(i>0)) //选择
        {
            if(led8==1)//慢炖
            {
                mode=(i-1)*2;
            }
            else
            {
                mode=(i-1)*2+1;
            }
        }

       if(i==7)//快炖
        {
            led8=0;
            if(mode%2==0)
                mode++;
        }
        if(i==8)//慢炖
        {
            led8=1;
            if(mode%2==1)
                mode--;
        }

       if(i==9)//保温
        {
            led9=!led9;
        }
        if(i==10)//预约
        {
            led7=!led7;
        }
        if(i==11)//启动
        {
            start=1;
            led10=0;
        }

       if(i==12)//停止
        {
            start=0;
            led9=1;
            led10=1;
            shi1=0;
            fen1=1;
            shi2=0;
            fen2=0;
            miao=0;
            beep=1;
        }
        if(shaogan==0)//烧干
            beep=0;
        else
        {
            beep=1;
        }

        //设置
        if(led7==0)
        {
            if(i==13)//小时
            {
                if(shi2<23)
                    shi2++;
            }
            if(i==14)
            {
                if(shi2>0)
                    shi2--;
            }
            if(i==15)//分钟
            {
                if(fen2<59)
                    fen2++;
            }
            if(i==16)
            {
                if(fen2>0)
                    fen2--;
            }
            else
        {
            if(i==13)//小时
            {
                if(shi1<23)
                    shi1++;
            }
            if(i==14)
            {
                if(shi1>0)
                    shi1--;
            }
            if(i==15)//分钟
            {
                if(fen1<59)
                    fen1++;
            }
            if(i==16)
            {
                if(fen1>0)
                    fen1--;
            }
        }
    }
}

//定时器中断
void Timer0() interrupt 1
{
    if(start)//启动
    {
        if(led7)//正常模式
        {
            if(led9)
            {
                if(sec<500)//1s
                    sec++;
                else
                {
                    sec=0;
                    if(miao>0)//倒计时
                        miao--;
                    else
                    {
                        miao=59;
                        if(fen1>0)
                            fen1--;

                        else
                        {
                            fen1=59;
                            if(shi1>0)
                                shi1--;
                            else
                            {
                                shi1=0;//结束
                                fen1=0;
                                miao=0;
                                led7=1;
                                buzzr();
                                led8=1;
                                 led9=0;
                            }
                        }
                    }
                }
            }
            //输出控制
            if(time<14)
                time++;
            else
            {
                time=0;
            }
            if(time<pwm)//占空比控制功率
                heat=0;
            else
                heat=1;
            //输出值设置
            if(!led8)
                pwm=1;
            else
             {
                pwm=mode+2;
            }
        }
        else//预约模式
        {
            heat=1;
            if(sec<500)//1s
                sec++;
            else
            {
                sec=0;
                if(miao>0)//倒计时
                    miao--;
                else
                {
                    miao=59;
                    if(fen2>=0)
                        fen2--;     
                    else
                    {
                        fen2=59;
                        if(shi2>0)
                            shi2--;
                        else
                        {
                            shi2=0;//结束
                            fen2=0;
                            miao=0;//启动
                            led7=1;
                                                                                                          led9=0;
                        }
                    }
                }
            }
        }
    }   
    else//停止
    {
        heat=1;
        led10=1;

    }
    if(num<200)        //测温
        num++;
    else
    {
        num=0;
        dht11_recive();
        wendu=dht11_dat[2];
        shidu=dht11_dat[0];
              current=ADC();//电流检测        
//                          current = current*2;//电流修正,电路测试环节可以修改
    }
    TH0=(65536-1000)/256;
    TL0=(65536-1000)%256;
}         


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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