这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 交通灯程序的闪,很有趣的一段程序,第一第二句省了200B

共4条 1/1 1 跳转至

交通灯程序的闪,很有趣的一段程序,第一第二句省了200B

助工
2014-06-13 20:53:40     打赏
void takertimerflag(uchar direction,uchar data_rtled,uchar data_down,uchar data_yelow,uchar data_normal)
{
  rtimer_flag=timer_flag & 64;
rtimer_flag=rtimer_flag/2;
if(data_rtled*100-timer_flag<750 && data_rtled*100-timer_flag>250 && rtimer_flag==0)
{
switch(direction)
{
case 1: turnleft(data_down); break;
case 2: gostraight(data_down); break;//某方向绿灭; break;
case 3: turnright(data_down); break;
}
 
}
else if(data_rtled*100-timer_flag<300)
{
switch(direction)
{
case 1: turnleft(data_yelow);   break;
case 2: gostraight(data_yelow); break; //绿灭亮黄; break;
case 3: turnright(data_yelow);  break;
}
 
}
else
  switch(direction)
{
case 1: turnleft(data_normal);   break;
case 2: gostraight(data_normal); break; //绿亮; break;
case 3: turnright(data_normal);  break;
}
 
}



关键词: 交通     有趣     有趣    

助工
2014-06-14 09:43:09     打赏
2楼

void takertimerflag(uchar direction,uchar data_rtled,uchar data_down,uchar data_yelow,uchar data_normal)

//uchar direction  方向,1左转,2直行,3右转

//uchar data_rtled 时间,相位的停留时间(这是太阳能移动交通灯的相位时间共4个相位16个模式)

//uchar data_down, IO口控制灭的数据 为0x__

//uchar data_yelow, IO口控制绿灭红灭亮黄的数据 为0x__

//uchar data_normal  ,IO口控制正常绿灯亮的数据 为0x__

{

  rtimer_flag=timer_flag & 64;

//timer_flag是个定时器自加标志10ms自加1,rtimer_flag是一个变量uchar型------>x<64的数按位与64都得0,64<=x<128的数按位与64都得64,128<=x<128+64的数按位与64都得0,   128+64<=x<256的数按位与64都得64,   256<=x<256+64的数按位与64都得0,256+64<=x<256+128的数按位与64都得64,、、、、、、、依次以时间间隔为64在0与64两个数之间切换循环

rtimer_flag=rtimer_flag/2;//由上步可知此处的值是以时间间隔为64,在0和32之间切换

if(data_rtled*100-timer_flag<750 && data_rtled*100-timer_flag>250 && rtimer_flag==0)

//如果相位运行时间低于设定时间7.5s并且大于2.5s时 每64*10ms进入一次

{
switch(direction)
{
case 1: turnleft(data_down); break;
case 2: gostraight(data_down); break;//某方向绿灭; break;
case 3: turnright(data_down); break;
}
 
}
else if(data_rtled*100-timer_flag<300)
{
switch(direction)
{
case 1: turnleft(data_yelow);   break;
case 2: gostraight(data_yelow); break; //绿灭亮黄; break;
case 3: turnright(data_yelow);  break;
}
 
}
else
  switch(direction)
{
case 1: turnleft(data_normal);   break;
case 2: gostraight(data_normal); break; //绿亮; break;
case 3: turnright(data_normal);  break;
}
 

}


程序的重点在于用&代替了%, 就是

rtimer_flag=timer_flag/64;-----------------------------以时间间隔为64 做奇偶变换
rtimer_flag=rtimer_flag%2;由上步导致此处--------在时间间隔为64做0 1 变换

这是在完整的太阳能移动交通灯里拿出来的闪的程序,我不知道别人怎么写的,我是这样写了。。。这程序第一次写了7K,第二次用指针简化成4K,其中有掉电保存和LED的显示,和一个相位时间的设置。这么大的程序主要是数码管用错了,用成共阳的(多花费了大约300B),还有就是16个模式。。这是程序的大头。这对于51的初学者是个拿来练手的好程序。有兴趣的朋友可以回帖问我拿这个程序完整的功能要求。


以上是目前所知道的个人看法。关于& 代替% 网上有很多介绍,大家自己体会。


院士
2014-06-15 09:44:04     打赏
3楼

印象中,在单片机里使用除法是恶梦一样的用法。



助工
2014-06-16 10:12:33     打赏
4楼
那要用什么呢

共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]