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

{
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;
}
}
关键词: 交通 有趣 有趣

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的初学者是个拿来练手的好程序。有兴趣的朋友可以回帖问我拿这个程序完整的功能要求。
以上是目前所知道的个人看法。关于& 代替% 网上有很多介绍,大家自己体会。
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
用知识换取送给亲朋的礼物,做个浪漫的开发者 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
玩转“DFRobot盖革计数器模块”测一测身边的辐射源 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【STM32F769】AI之与本地deepseek对接被打赏50分 | |
Buck电路工作在CCM模式下电感电流的计算公式是什么?被打赏5分 | |
buck电路工作原理被打赏5分 | |
基于MSPM0L1306的MODBUS-RTU协议通讯实验被打赏100分 | |
我想要一部加热台+多合一调试工具被打赏18分 | |
每周了解几个硬件知识+485硬件知识分享被打赏10分 | |
【换取手持数字示波器】树莓派PICO调试器官方固件本地化部署实践被打赏24分 | |
【换取手持数字示波器】分享一个KEIL无法识别CMSIS-DAP调试器的解决办法被打赏20分 | |
【换取手持数字示波器】分享一个自制的ArduinoNano扩展板底板被打赏23分 | |
【换取手持示波器】树莓派PICOW网页烟花被打赏18分 |