|
Altium Designer畫的交通燈原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png (47.63 KB, 下載次數(shù): 80)
下載附件
2019-10-15 02:36 上傳
0.png (82.58 KB, 下載次數(shù): 84)
下載附件
2019-10-15 02:36 上傳
0.png (6.91 KB, 下載次數(shù): 78)
下載附件
2019-10-15 02:36 上傳
單片機(jī)源程序如下:
- /***************************************************
- 基于單片機(jī)的交通燈設(shè)計(jì)
- ***************************************************/
- #include <reg52.h> //52系列單片機(jī)頭文件
- #define uchar unsigned char
- #define uint unsigned int
- #define ON 0
- #define OFF 1
- sbit D1 = P1^3; //數(shù)碼管位選引腳
- 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; //方向標(biāo)志位 1南北,0東西 初始化flag=1即南北方向先行
- #define YELTime 4 //黃燈時(shí)間 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; //緊急情況標(biāo)志位,1為緊急情況
- uchar table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //共陽數(shù)碼管
- #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)
- /***************************************************
- * 延時(shí)函數(shù)
- ***************************************************/
- 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--);
- }
- }
- /***************************************************
- * 東西方向顯示函數(shù)
- *num1 數(shù)值的十位 num2 數(shù)值的各位
- ***************************************************/
- 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;
- }
- /***************************************************
- * 南北方向顯示函數(shù)
- *num3 數(shù)值的十位 num4 數(shù)值的各位
- ***************************************************/
- 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;
- }
- /***************************************************
- * 定時(shí)器初始化函數(shù)
- ***************************************************/
- void Timer_Init(void)
- {
- TMOD=0x01; //定時(shí)器工作方式
- TH0=(65536-50000)/256; //定時(shí)器初值 50ms中斷一次
- TL0=(65536-50000)%256;
- ET0=1; //使能定時(shí)器中斷
- TR0=1; //啟動(dòng)定時(shí)器0
- }
- /***************************************************
- * 按鍵檢測(cè)函數(shù)
- ***************************************************/
- void Key_Scan()
- {
- //--檢測(cè)按鍵1--//
- if (Key1==0) //檢測(cè)按鍵K1是否按下
- {
- Delay10uS(200); //消除抖動(dòng)
- if (Key1==0) //再次檢測(cè)按鍵是否按下
- {
- keyflag=1; //將緊急情況標(biāo)志位置1
- }
- }
- if (Key2==0) //檢測(cè)按鍵K1是否按下
- {
- Delay10uS(200); //消除抖動(dòng)
- if (Key2==0) //再次檢測(cè)按鍵是否按下
- {
- keyflag=0; //將緊急情況標(biāo)志位置0
- flag=1; //重新從南北方向開始
- t=EWTime;
- }
- }
- }
- void main() //主函數(shù)
- {
- Timer_Init(); //定時(shí)器初始化
- EA=1; //打開全局中斷
- NS_GRE = OFF; //所有的燈都滅
- NS_YEL = OFF;
- NS_RED = OFF;
- EW_GRE = OFF;
- EW_YEL = OFF;
- EW_RED = OFF;
- P0 = 0xFF; //數(shù)碼管顯示滅
- while(1)
- {
- Key_Scan();
- if(flag==1) //南北方向先開始
- {
- display1(t/10, t%10); //東西方向顯示時(shí)間
- display2(t/10, t%10); //南北方向顯示時(shí)間
- EW_RED_ON(); //東西方向保持紅燈
- if(t>4) //綠燈時(shí)間
- {
- NS_GRE_ON(); //南北方向保持綠燈
- }
- if(t>=0&&t<5) NS_YEL_ON(); //南北方向保持黃燈
- if(t==0) //時(shí)間為0
- {
- flag=0; //南北方向結(jié)束,flag=0,開始東西方向
- t=NSTime; //加載南北方向紅燈時(shí)間
- }
- }
- if(flag==0)
- {
- display1(t/10, t%10); //東西方向顯示時(shí)間
- display2(t/10, t%10); //南北方向顯示時(shí)間
- NS_RED_ON(); //南北方向保持紅燈
- if(t>4)
- {
- EW_GRE_ON(); //東西方向保持綠燈
- }
- if(t>=0&&t<5) EW_YEL_ON();//東西方向保持黃燈
- if(t==0)
- {
- flag=1; //東西方向結(jié)束,flag=1,開始南北方向
- t=EWTime; //加載東西方向紅燈時(shí)間
- }
- }
- if(keyflag == 1) //如果急停按鍵按下 紅燈全亮 數(shù)碼管顯示關(guān)閉
- {
- P0 = 0xFF; //數(shù)碼管顯示滅
- EW_RED_ON(); //東西方向紅燈
- NS_RED_ON(); //南北方向紅燈
- flag=2; //標(biāo)志位flag=2,即東西、南北方向的其他操作停止
- }
- }
- }
- void timer1(void) interrupt 1
- {
- TH0=(65536-50000)/256; //重新裝入初值
- TL0=(65536-50000)%256;
- tt++;
- if(tt==20) //表示1S時(shí)間到了
- {
- tt=0;
- t--; //數(shù)碼管顯示時(shí)間減一
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
交通燈pcb原理圖.zip
(8.55 MB, 下載次數(shù): 234)
2019-10-14 20:55 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|