单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:531|回复: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;
}      


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

Powered by 单片机教程网