找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

求解释一下豆浆机的Proteus仿真单片机源码每一步的意思,以及4个按键的作用

查看数: 4594 | 评论数: 6 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2017-6-11 16:02

正文摘要:

我找到一个豆浆机的仿真源码,但是源码没有几个注释,我根本看不懂,求大神帮忙翻译一下每句的意思,我急用呀,本人实在太小白了,根本看不懂几句代码。 #include<reg51.h> #include<intrins.h> #defi ...

回复

ID:398094 发表于 2021-6-12 11:06
按不同按键工作时间不一样
ID:149799 发表于 2021-6-12 09:10
zhangzihao1111 发表于 2021-6-11 20:24
sbitkey1=P2^0;        //接口定义
sbitkey2=P2^1;
sbitkey3=P2^2;

详细解释啊,谢谢你。
ID:936659 发表于 2021-6-11 20:24
sbitkey1=P2^0;        //接口定义
sbitkey2=P2^1;
sbitkey3=P2^2;
sbitbuzzer=P1^4;

sbitrelayF=P1^0;
sbitrelayJ=P1^1;
unsignedcharReadTempFlag=0;//定义读时间标志
inttemp1;                //温度读取值
floattemperature;//实际温度

unsignedlongtime_20ms=0;                        //定时计数

unsignedchari;

xdataunsignedchardis0[16];//数据暂存
xdataunsignedchardis1[16];//数据暂存
xdataunsignedchardis2[16];//数据暂存

unsignedintsetR=5;//设置温度
unsignedintsetF1=5;//设置湿度
unsignedintsetF2=5;

bitstartFlag=0;//开始运行
unsignedinttimeLater=0;//初始化时间
unsignedcharstep=0;//运行步骤

bitdisFlag=0;//显示标志
unsignedcharSetFlag=0;//设置标志

voidInit_Timer0(void);//函数命令
voidCheckKey(void);
voiddealYunXing(void);

voidmain(void)
{
        Init_Timer0();//定时器0初始化

        relayF=0;        //继电器和蜂鸣器上电动作下方便检测硬件
        relayJ=0;
        buzzer=0;
        DelayMs(200);//延时有助于稳定
        relayF=1;
        relayJ=1;
        buzzer=1;

        LCD_Init();//初始化液晶
        DelayMs(20);//延时有助于稳定
        LCD_Clear();//清屏

        while(1)//主循环
        {       
                CheckKey();//按键处理
                dealYunXing();        //运行过程
                if(ReadTempFlag==1)                //读取温度标志
                {
                        ReadTempFlag=0;
                        temp1=ReadTemperature();        //读取温度
                        temperature=(float)temp1*0.0625;        //温度值转换
                        sprintf(dis0,"T:%4.1fC",temperature);
                        LCD_Write_String(0,0,dis0);//显示时间及温度
                }

                if(disFlag==1)
                {
                        disFlag=0;
                        sprintf(dis1,"J%02dA%02dB%02d",(int)setR,(int)setF1,(int)setF2);
                        LCD_Write_String(0,1,dis1);        //初始化显示
                       
                        if(SetFlag==0)//按键设置标志
                        {
                                LCD_Write_Char(0,1,'');LCD_Write_Char(4,1,'');LCD_Write_Char(8,1,'');//更新显示标志
                        }
                        elseif(SetFlag==1)//按键设置标志
                        {
                                LCD_Write_Char(0,1,'S');LCD_Write_Char(4,1,'');LCD_Write_Char(8,1,'');//更新显示标志
                        }                       
                        elseif(SetFlag==2)//按键设置标志
                        {
                                LCD_Write_Char(0,1,'');LCD_Write_Char(4,1,'S');LCD_Write_Char(8,1,'');//更新显示标志
                        }
                        elseif(SetFlag==3)//按键设置标志
                        {
                                LCD_Write_Char(0,1,'');LCD_Write_Char(4,1,'');LCD_Write_Char(8,1,'S');//更新显示标志
                        }

                        if(step==0)        //查看运行步骤
                        {       
                                sprintf(dis2,"STP-%2.1f",(float)timeLater/10);        //显示                               
                        }
                        elseif(step==1)                //查看运行步骤
                        {       
                                sprintf(dis2,"JR-%2.1f",(float)timeLater/10);        //显示                                                                                               
                        }
                        elseif(step==2)                //查看运行步骤
                        {       
                                sprintf(dis2,"FS1-%2.1f",(float)timeLater/10);        //显示                                                                                                       
                        }
                        elseif(step==3)        //查看运行步骤
                        {       
                                sprintf(dis2,"JR-%2.1f",(float)timeLater/10);        //显示                                                                                               
                        }                                       
                        elseif(step==4)                //查看运行步骤
                        {       
                                sprintf(dis2,"FS2-%2.1f",(float)timeLater/10);        //显示                                                                                       
                        }
                        elseif(step==5)                //查看运行步骤
                        {       
                                sprintf(dis2,"JR-%2.1f",(float)timeLater/10);        //显示                                                                                               
                        }
                        LCD_Write_String(9,0,dis2);//显示
                                               
                }
        }
}

voidCheckKey(void)
{
        staticunsignedcharrekey=0;
        if((key1==0)||(key2==0)||(key3==0))                //检测到按键按下
        {
                DelayMs(10);//小抖动
                if(rekey==0)
                {
                        if(key1==0)//检测是否按下
                        {
                                rekey=1;
                                SetFlag++;//设置标志
                                if(SetFlag>=4)SetFlag=0;
                        }       
                        elseif(key2==0)//设置值键
                        {
                                rekey=1;
                                if(SetFlag==1)//处于设置1
                                {
                                        if(setF1>0)
                                        {setR=setR-1;}
                                }
                                elseif(SetFlag==2)//处于设置2
                                {
                                        if(setF1>0)
                                        {setF1=setF1-1;}
                                }
                                elseif(SetFlag==3)//处于设置3
                                {
                                        if(setF2>0)
                                        {setF2=setF2-1;}
                                }                                                                               
                        }
                        elseif(key3==0)//设置值键
                        {
                                rekey=1;
                                if(SetFlag==1)//处于设置1
                                {
                                        if(setR<10)
                                        {setR=setR+1;}
                                }
                                elseif(SetFlag==2)//处于设置2
                                {
                                        if(setF1<10)
                                        {setF1=setF1+1;}
                                }
                                elseif(SetFlag==3)//处于设置3
                                {
                                        if(setF2<10)
                                        {setF2=setF2+1;}
                                }
                                else
                                {
                                        startFlag=1;//开始运行
                                        timeLater=setR*10;//初始化时间
                                        step=1;//运行步骤

                                        relayF=1;
                                        relayJ=0;

                                }                                                               
                        }
                }
        }
        else
        {
                rekey=0;//防止重复检测到按键
        }
}

voiddealYunXing(void)
{
        if(startFlag==1)//启动过程中
        {
                if(timeLater==0)
                {
                        buzzer=0;//报警
                        DelayMs(100);
                        buzzer=1;
                        if(step==1)
                        {       
                                step=2;//运行步骤
                                timeLater=setF1*10;//初始化时间       
                                        relayF=0;//粉碎
                                        relayJ=1;                                                                                       
                        }
                        elseif(step==2)
                        {       
                                step=3;//运行步骤
                                timeLater=setR*10;//初始化时间
                                relayF=1;//粉碎
                                relayJ=0;//加热                                                                                                               
                        }
                        elseif(step==3)
                        {       
                                step=4;//运行步骤
                                timeLater=setF2*10;//初始化时间       
                                relayF=0;//粉碎
                                relayJ=1;                                                                                                       
                        }                                       
                        elseif(step==4)
                        {       
                                step=5;//运行步骤
                                timeLater=setR*10;//初始化时间
                                relayF=1;//粉碎
                                relayJ=0;//加热                                                                                               
                        }
                        elseif(step==5)
                        {       
                                step=0;//运行步骤
                                timeLater=0;//初始化时间       
                                startFlag=0;//开始标志清空       
                                relayF=1;//粉碎
                                relayJ=1;//加热                                                                               
                        }               
                }       
        }
}

voidInit_Timer0(void)
{
        TMOD|=0x01;        //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响               
        TH0=(65536-20000)/256;                //重新赋值20ms
        TL0=(65536-20000)%256;
        EA=1;//总中断打开
        ET0=1;//定时器中断打开
        TR0=1;//定时器开关打开
}


voidTimer0_isr(void)interrupt1
{
        TH0=(65536-20000)/256;                //重新赋值20ms
        TL0=(65536-20000)%256;
        time_20ms++;

        time_20ms++;
        if(time_20ms%5==0)
        {
                disFlag=1;
                if(timeLater>0)timeLater--;
                if(time_20ms%50==0)
                {
                        ReadTempFlag=1;                //定时发送数据
                }
        }
}
ID:472242 发表于 2019-2-9 04:28
没那么复杂,主要功能是控制马达正反转,加速与减速
下面的是调速,转的方向也屏蔽了一个,剩下的是数码管显示及延时,很简单
void Timer0_int(void) interrupt 1 using        1   //定时中断
{
    t++;
        TH0=(65535-50000)/256;
        TL0=(65535-50000)%256;
        if(t==20)
        {
           t=0;
           Date=n;
           n=0;
           cnt--;
           if(cnt==0)
           {
             while(1)
                 {
                     f=0;
                         f=1;
                 }
                  
           }
        }
        if(key0==0)  //检测K3按下
        {
           Delayxms(10);  //延时10ms
           if(key0==0)   
           {
              Speed++;
                  if(Speed>20)
                  {
                    Speed=20;
                  }
           }
           while(key0==0);
        }
        if(key1==0)    //检测K4按下
        {
           Delayxms(10);
           if(key1==0)
          {
             Speed--;
                 if(Speed==0)
                 {
                    Speed=1;
                 }
          }
          while(key1==0);
        }
}        

评分

参与人数 6黑币 +170 收起 理由
zhengchong60 + 15
sheng7533967 + 15
Trump1438 + 35
#include51.h + 35
shuisheng + 35
jinsheng7533967 + 35

查看全部评分

ID:111634 发表于 2017-6-12 20:28
冗长的程序!还没人解答?

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

Powered by 单片机教程网

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