练手项目:利用单片机和仿真软件模拟汽车红绿灯项目 附效果图
这两天看到了个新闻说广东有一处电子眼,启用才几个月的时间,就拍到了62万多次的违章信息,那罚款可是一个天价的数字啊,尽管后来有关部门说只有18万多次,但是很难自圆其说,不说这个了,说回今天的正题,我们开车的人一般都知道,警察叔叔监督广大驾驶员的方法除了电子眼之外,还有一个就是我们今天的主角-红绿灯。 其实如果红绿灯设计的合理,将会大大的提高我们的通行效率,也会更大程度的避免交通事故的发生。 于是我突发奇想,红绿灯的控制其实并不复杂,我能不能用我最爱的单片机来做一个红绿灯实验呢?说干咱就干 鉴于时间和手头材料的原因,我没有做成实物,只是用仿真软件实现了我需要的功能,其实PROTEUS上实现了,放到实物上调一下应该就可以了。 程序功能很简单,模拟十字路口的交通信号灯,先是绿灯亮,然后黄灯亮三秒后,红灯亮禁行(每一个路口控制方向相同)。 仿真模拟图如下: 模拟东西通行,南北禁行: 模拟东西禁行,南北通行: 程序C语言源代码如下: /*模拟交通灯*/ define RED_EW_ON() P0 &= ~0x01 //东西方向指示灯开 define GREEN_EW_ON() P0 &= ~0x04 define YELLOW_EW_OFF() P0 |= 0x02 define RED_SN_ON() P0 &= ~0x08 //南北方向指示灯开 0000100 1111011 define GREEN_SN_ON() P0 &= ~0x20 define YELLOW_SN_OFF() P0 |= 0x10 define YELLOW_EW_BLINK() P0 ^= 0x02 //东西方向黄灯闪烁 #define YELLOW_SN_BLINK() P0 ^= 0x10 //南北方向黄灯闪烁 uint8 Flash_Count = 0, Operation_Type = 1; //闪烁次数,操作类型变量 void Traffic_Light() //交通灯切换子程序 { switch (Operation_Type) { case 1://东西方向绿灯与南北方向红灯亮 RED_EW_OFF(); YELLOW_EW_OFF(); GREEN_EW_ON(); RED_SN_ON(); YELLOW_SN_OFF(); GREEN_SN_OFF(); delay(2000); //延时 Operation_Type = 2; //下一个操作 break; case 2://东西方向黄灯开始闪烁,绿灯关闭 delay(120); YELLOW_EW_BLINK(); GREEN_EW_OFF(); //闪烁5次 if( Flash_Count != 10) return; Flash_Count = 0; Operation_Type = 3; //下一个操作 break; case 3://东西方向红灯与南北方向绿灯亮 RED_EW_ON(); YELLOW_EW_OFF(); GREEN_EW_OFF(); RED_SN_OFF(); YELLOW_SN_OFF(); GREEN_SN_ON(); //南北方向绿灯亮若干秒后切换 delay(2000); Opeation_Type = 4; //下一个操作 break; case 4://南北方向红灯开始闪烁 delay(120); YELLOW_SN_BLINK(); GREEN_SN_OFF() //闪烁5次 if( Flash_Count != 10) return; Flash_Count = 0; Operation_Type = 1; //回到第一种操作 } } //主程序 int main() { while(1) Traffic_Light(); } 程序结束 通过仿真后基本上实现了所需要的功能,后续还可以改进,例如根据车流量来适当增加或者减少绿灯时间等,由于无法上传附件 如果需要设计文件请留言或者私信,看到后会第一时间回复。谢谢! |