看了挑战后,就想看看自己是否有60%了。但想好久都没有写,因c语言很久没用了,也因思路不清就放下了,看了下大虾们推荐的状态机,有了点思路。但最近要找实习单位就一直没写,今天突然想起就试试,调试下行了。哈哈。 还有我最近一直纠结于是选PLC还是单片机发展。不知道该走那条路呀?选择单片机,下学期就要实习了,已没时间深入了。工作后·········· //---------------------------------------- //第一个按键按下去时候,第一个LED以10Hz频率闪烁, //再次按下时候,熄灭,再次按下时候,闪烁,依次循环。 //第二个按键按下去等到放开时候,第二个LED以100hz频率闪烁。 //再次按下放开,熄灭,第三次按下放开,闪烁,依次循 //第三个按键按下去时候,第三个Led //以50Hz频率闪烁,放开时候LED熄灭。 //---------------------------------------- #include<reg51.h> #define uint unsignedint #define uchar unsignedchar uint ky1=0; //按键1状态变量,初态为0 uint ky2=0; //按键2状态变量 uint ky3=0; //按键3状态变量 uint shi_ms=0; //计时变量 sbit led1=P3^0;//led灯 sbit led2=P3^1; sbit led3=P3^2; sbit key1=P1^0;//按键 sbit key2=P1^1; sbit key3=P1^2; bit ld1=0;//led1闪烁标志,为1时led1闪烁 bit ld2=0;//led2闪烁标志,为1时led2闪烁 bit ld3=0;//led3闪烁标志,为1时led3闪烁 void dingshi0_csh() //定时器0初始化 { EA=1; ET0=1; TR0=1; TMOD = 0x01; //设定时器0功能为计时 TH0=0xfc; //1ms中断一次 TL0=0x18; } void main() { dingshi0_csh();//定时器0初始化 while(1) //下面是按照状态机的思想编写的 { switch(ky1) //按键1的状态处理 { case 0: //在初态中等待按键按下 { if(0==key1) {ky1=1;} //按键按下转状态1 } break; case 1: //在状态1中消抖 { //延时未写 if(0==key1) //消抖后按键是按下 { ky1=2; //状态转移 ld1=~ld1;//闪烁处理,原是熄灭,闪烁;原闪烁则熄灭 led1=1; //让灯熄灭,保证按下按键后灯是熄灭的 } else //消抖后按键没有按下 ky1=0; //返回初状态 }break; case 2: //在状态2中等待按键释放 { if(1==key1) { ky1=3; } }break; case 3: //判断按键是否释放 { //延时 if(1==key1) //按键释放,跳状态0等待下一次按键 { ky1=0; } else //按键没释放,跳状态2等待按键释放 ky1=2; } break; } switch(ky2) { case 0: { if(0==key2) { ky2=1; } } break; case 1: { if(0==key2) { ky2=2; } else ky2=0; } break; case 2: { if(1==key2) { ky2=3; } } case 3: { if(1==key2) { ky2=0; ld2=~ld2; led2=1; } else ky2=2; } break; } switch(ky3) { case 0: { if(0==key3) { ky3=1; } } break; case 1: { if(0==key3) { ky3=2; ld3=1; } else ky3=0; } case 2: { if(1==key3) { ky3=3; } } break; case 3: { if(1==key3) { ky3=0; ld3=0; led3=1; } else ky3=2; } break; } } } void Timer0Interrupt() interrupt 1 { TH0 = 0x0FC; TL0 = 0x18; shi_ms++; if(0==(shi_ms%100)&&ld1==1)//0.1s并来了led1标志位ld1为1 { //led1以10HZ频率闪烁 led1=~led1; } if(0==(shi_ms%10)&&ld2==1)//0.01s并来了led1标志位ld1为1 { //led1以100HZ频率闪烁 led2=~led2; } if(0==(shi_ms%20)&&ld3==1)//0.02s并来了led1标志位ld1为1 { //led1以50HZ频率闪烁 led3=~led3; } if(200==shi_ms) { shi_ms=0; } } |
我这迟来的单片机编程挑战
最新推荐文章于 2023-07-27 09:36:04 发布