我这迟来的单片机编程挑战

看了挑战后,就想看看自己是否有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;
}
}


搜狗截图_2012-05-18_21-55-24.png(27.44 KB, 下载次数: 4)

搜狗截图_2012-05-18_21-55-24.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值