基于51单片机控制交通灯的电路图与C语言程序
思路: 红灯停,绿灯行,黄灯闪烁提示行人红绿灯即将切换。四个方向各有一个红、黄、绿显示和两个数码管。东西道为人行道(20秒),南北道为车行道(60秒),黄灯延时最后三秒时,闪烁并切换。三、硬件电路设计此电中路设计采用AT89C51单片机,74LS47(数码管驱动)74LS373(数码管驱动输出锁存),8个数码管显示其延时值,四个红、黄、绿指示灯。硬件设计关键在于,延时显示时,要考虑到当个位数字显示时,要确保十位数字显示输出的不变。因此,可加输出锁存器。在延时最后三秒时,要让黄灯进行闪烁,并同时显示数字(这一步在软件设计上很关键)。四、软件程序(C语言) 以下是整个设计的软件程序,直接可以编译成*。Hex代码。通过以上电路,下载到单片机,可直接运行。//*****************************////程序名:十字路口交通灯控制//编写人:黄庭剑//初写时间:2009年1月2日//程序功能:南北为车行道,延时60秒;东西方向为人行道,延时20秒,且在最后3秒黄灯显示2秒钟再实现切换.//CPU说明:AT89C51型单片机; 24MHZ晶体振荡器//完成时间:2009年1月6日//*****************************//#include#include#includesfr p0 = 0x80;sfr p1 = 0x90;sfr p2 = 0xA0;sfr p3 = 0xb0; //这部分内容其实在“#include”里已经有,但里面定义的必须区分大小写,在这里,因为我程序采用的是小写,reg51.h里对各个端口与寄存器的定义都是大写,所以在编译连接时,会报错,所以,在本设计程序里,我只用到了端口,在这里也就只定义了四个,而没有去改reg51.h里面的内容。其实两者是一样的。sbit sw = p0^0;sbit OE =P0^6;sbit LE =P0^7; //74LS373锁存器控制端定义char display[]={ 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99 }; //p1口的数码管时间显示调用,利用74L74BCD码,8位驱动输出;//函数声明 beginvoid delay1(int count);void delay_long(int number1,int number2);void people_car_drive();//函数声明end//***********************//延时子程序void delay1(int count) { int i; for(i=count;i>0;i--) { ;} }void delay_long(int number1,int number2) { int a,b; for(a=number1;a>0;a--) { for(b=number2;b>0;b--) { _nop_(); } } }//**********************//延时子程序 void people_car_drive() { int p_1=2,i,j=9,p_2=6; //****************//行人通行时,延时20秒 p2=0x09; //南北红灯亮 p3=0x24; //东西绿灯亮 while(p_1-->0) { LE=1; OE=0; if(p_1==0){OE=1;} //当十位数减到0时,只显示个位数 p1=display[p_1]; delay1(1000); LE=0; j=9; for(i=10;i>0;i--) { if(p_1==0&&j==3)break; //减到3时退出循环,让其黄灯闪烁显示 p1=display[j--]; delay_long(16000,2); if(sw==1)return; } } //*******************************************************************************// p2=0x12; //南北黄灯闪烁三秒,以提醒行人注意 p3=0x12; p1=display[3]; delay_long(8000,1); p2=0x00; p3=0x00; delay_long(14000,1); p2=0x12; p3=0x12; p1=display[2]; delay_long(8000,1); p2=0x00; p3=0x00; delay_long(14000,1); p2=0x12; p3=0x12; p1=display[1]; delay_long(8000,1); p2=0x00; p3=0x00; delay_long(14000,1);//*****************以下是车辆通行时延时60秒// p2=0x24; //南北绿灯亮 p3=0x09; //东西红灯亮 while(p_2-->0) { LE=1; OE=0; if(p_2==0){OE=1;} //当十位数减到0时,只显示个位数 p1=display[p_2]; delay1(1000); LE=0; j=9; for(i=10;i>0;i--) { if(p_2==0&&j==3)break; //减到2时退出循环 p1=display[j--]; delay_long(16000,2); if(sw==1)return; } } p2=0x12; //南北黄灯闪烁三秒,以提醒行人注意 p3=0x12; p1=display[3]; delay_long(8000,1); p2=0x00; p3=0x00; delay_long(14000,1); p2=0x12; p3=0x12; p1=display[2]; delay_long(8000,1); p2=0x00; p3=0x00; delay_long(14000,1); p2=0x12; p3=0x12; p1=display[1]; delay_long(8000,1); p2=0x00; p3=0x00; delay_long(14000,1); //南北黄灯闪烁三秒完毕 } void main() //主函数入口处{ p0=0x01; p1=0x00; p2=0x00; p3=0x00; //初始化各端口 { while(1) { if(sw==0) { people_car_drive();}else { p2=0x00; p3=0x00; //关闭所有交通灯 } } }}详情访问:http://hi.baidu.com/hjiannew/
关于51单片机的红绿灯实验的C语言程序,注意是要C语言程序。
主函数部分:void main(void){ InitTimer1() ;Time=30;P1=0xFF;Flag=0;while(1){ if(Time==0) { if(Flag) Time=20; else Time=30; Flag=~Flag; } if(Time>3 && (!Flag)) { EastR=OFF; EastG=ON;WestR=OFF; WestG=ON;SouthR=ON; SouthG=OFF;NorthR=ON; NorthG=OFF;display(Time,1); } else if(Time>3 && Flag) { EastR=ON; EastG=OFF;WestR=ON; WestG=OFF;SouthR=OFF; SouthG=ON;NorthR=OFF; NorthG=ON;display(Time,0); }}}其他已发到邮箱啦

