| 按不同按键工作时间不一样 |
zhangzihao1111 发表于 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; //定时发送数据 } } } |
|
没那么复杂,主要功能是控制马达正反转,加速与减速 下面的是调速,转的方向也屏蔽了一个,剩下的是数码管显示及延时,很简单 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 | 收起 理由 |
|---|---|---|
|
| + 15 | |
|
| + 15 | |
|
| + 35 | |
|
| + 35 | |
|
| + 35 | |
|
| + 35 |
| 冗长的程序!还没人解答? |