Altium Designer画的交通灯原理图和PCB图如下:(51hei附件中可下载工程文件)
单片机源程序如下:
- /***************************************************
- 基于单片机的交通灯设计
- ***************************************************/
- #include <reg52.h> //52系列单片机头文件
- #define uchar unsigned char
- #define uint unsigned int
- #define ON 0
- #define OFF 1
- sbit D1 = P1^3; //数码管位选引脚
- sbit C1 = P1^2;
- sbit B1 = P1^1;
- sbit A1 = P1^0;
- sbit NS_GRE = P2^5; //定义LED灯引脚
- sbit NS_YEL = P2^4;
- sbit NS_RED = P2^3;
- sbit EW_GRE = P2^2;
- sbit EW_YEL = P2^1;
- sbit EW_RED = P2^0;
- uchar flag=1; //方向标志位 1南北,0东西 初始化flag=1即南北方向先行
- #define YELTime 4 //黄灯时间 4s
- #define EWTime 28+YELTime //东西红灯28s
- #define NSTime 16+YELTime //南北红灯16s
- uchar t=EWTime;
- uchar tt=0;
- sbit Key1 = P3^2; //按键引脚定义
- sbit Key2 = P3^4;
- uchar keyflag = 0; //紧急情况标志位,1为紧急情况
- uchar table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //共阳数码管
- #define EW_RED_ON() do { EW_RED=ON;EW_GRE=OFF;EW_YEL=OFF; } while (0)
- #define EW_YEL_ON() do { EW_RED=OFF;EW_GRE=OFF;EW_YEL=ON; } while (0)
- #define EW_GRE_ON() do { EW_RED=OFF;EW_GRE=ON;EW_YEL=OFF; } while (0)
- #define NS_RED_ON() do { NS_RED=ON;NS_GRE=OFF;NS_YEL=OFF; } while (0)
- #define NS_YEL_ON() do { NS_RED=OFF;NS_GRE=OFF;NS_YEL=ON; } while (0)
- #define NS_GRE_ON() do { NS_RED=OFF;NS_GRE=ON;NS_YEL=OFF; } while (0)
- /***************************************************
- * 延时函数
- ***************************************************/
- void Delay10uS(uint z)
- {
- uint i,a,b;
- for(i=0;i<z;i++){
- for(b=1;b>0;b--)
- for(a=2;a>0;a--);
- }
- }
- /***************************************************
- * 东西方向显示函数
- *num1 数值的十位 num2 数值的各位
- ***************************************************/
- void display1(uchar num1,uchar num2)
- {
- P0=0XFF;
- P0=table[num1];
- A1=ON;
- Delay10uS(1);
- A1=OFF;
- P0=0XFF;
- P0=table[num2];
- B1=ON;
- Delay10uS(1);
- B1=OFF;
- P0=0XFF;
- }
- /***************************************************
- * 南北方向显示函数
- *num3 数值的十位 num4 数值的各位
- ***************************************************/
- void display2(uchar num3,uchar num4)
- {
- P0=0XFF;
- P0=table[num3];
- C1=ON;
- Delay10uS(1);
- C1=OFF;
- P0=0XFF;
- P0=table[num4];
- D1=ON;
- Delay10uS(1);
- D1=OFF;
- P0=0XFF;
- }
- /***************************************************
- * 定时器初始化函数
- ***************************************************/
- void Timer_Init(void)
- {
- TMOD=0x01; //定时器工作方式
- TH0=(65536-50000)/256; //定时器初值 50ms中断一次
- TL0=(65536-50000)%256;
- ET0=1; //使能定时器中断
- TR0=1; //启动定时器0
- }
- /***************************************************
- * 按键检测函数
- ***************************************************/
- void Key_Scan()
- {
- //--检测按键1--//
- if (Key1==0) //检测按键K1是否按下
- {
- Delay10uS(200); //消除抖动
- if (Key1==0) //再次检测按键是否按下
- {
- keyflag=1; //将紧急情况标志位置1
- }
- }
- if (Key2==0) //检测按键K1是否按下
- {
- Delay10uS(200); //消除抖动
- if (Key2==0) //再次检测按键是否按下
- {
- keyflag=0; //将紧急情况标志位置0
- flag=1; //重新从南北方向开始
- t=EWTime;
- }
- }
- }
- void main() //主函数
- {
- Timer_Init(); //定时器初始化
- EA=1; //打开全局中断
- NS_GRE = OFF; //所有的灯都灭
- NS_YEL = OFF;
- NS_RED = OFF;
- EW_GRE = OFF;
- EW_YEL = OFF;
- EW_RED = OFF;
- P0 = 0xFF; //数码管显示灭
- while(1)
- {
- Key_Scan();
- if(flag==1) //南北方向先开始
- {
- display1(t/10, t%10); //东西方向显示时间
- display2(t/10, t%10); //南北方向显示时间
- EW_RED_ON(); //东西方向保持红灯
- if(t>4) //绿灯时间
- {
- NS_GRE_ON(); //南北方向保持绿灯
- }
- if(t>=0&&t<5) NS_YEL_ON(); //南北方向保持黄灯
- if(t==0) //时间为0
- {
- flag=0; //南北方向结束,flag=0,开始东西方向
- t=NSTime; //加载南北方向红灯时间
- }
- }
- if(flag==0)
- {
- display1(t/10, t%10); //东西方向显示时间
- display2(t/10, t%10); //南北方向显示时间
- NS_RED_ON(); //南北方向保持红灯
- if(t>4)
- {
- EW_GRE_ON(); //东西方向保持绿灯
- }
- if(t>=0&&t<5) EW_YEL_ON();//东西方向保持黄灯
- if(t==0)
- {
- flag=1; //东西方向结束,flag=1,开始南北方向
- t=EWTime; //加载东西方向红灯时间
- }
- }
- if(keyflag == 1) //如果急停按键按下 红灯全亮 数码管显示关闭
- {
- P0 = 0xFF; //数码管显示灭
- EW_RED_ON(); //东西方向红灯
- NS_RED_ON(); //南北方向红灯
- flag=2; //标志位flag=2,即东西、南北方向的其他操作停止
- }
- }
- }
- void timer1(void) interrupt 1
- {
- TH0=(65536-50000)/256; //重新装入初值
- TL0=(65536-50000)%256;
- tt++;
- if(tt==20) //表示1S时间到了
- {
- tt=0;
- t--; //数码管显示时间减一
- }
- }
复制代码
所有资料51hei提供下载:
交通灯pcb原理图.zip
(8.55 MB, 下载次数: 233)
|