|
交通燈設(shè)計(jì).JPG (365.04 KB, 下載次數(shù): 34)
下載附件
2017-11-29 22:02 上傳
- #include<reg51.h>
- //--定義使用的IO口--//
- #define GPIO_DIG P0
- #define GPIO_PLACE P1
- #define GPIO_TRAFFIC P2
- sbit RED10 = P2^0; //左紅燈
- sbit GREEN10 = P2^1; //左綠燈
- sbit RED11 = P2^2; //南北紅
- sbit YELLOW11= P2^3; //南北黃
- sbit GREEN11 = P2^4; //南北綠
- sbit RED00 = P3^0; //下人行道紅燈
- sbit GREEN00 = P3^1; //下人行道綠燈
- sbit RED01 = P2^5; //東西紅
- sbit YELLOW01= P2^6; //東西黃
- sbit GREEN01 = P2^7; //東西綠
- //--定義全局變量--//
- unsigned char code DIG_PLACE[8] = {
- 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位選控制 查表的方法控制
- unsigned char code DIG_CODE[17] = {
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的顯示碼
- unsigned char DisplayData[8];
- //用來(lái)存放要顯示的8位數(shù)的值
- unsigned char Time, Second; //用來(lái)存放定時(shí)時(shí)間
- /*void main()
- {
- P2=0x00;
- RED00=0;
- GREEN00=0;
- GPIO_DIG=0xff;
- GPIO_PLACE=0x00;
- while(1);
- } */
- //--聲明全局函數(shù)--//
- void DigDisplay(); //動(dòng)態(tài)顯示函數(shù)
- void Timer0Cofig(void);
- void main(void)
- {
- Second = 1;
- Timer0Cofig(); //定時(shí)器初始化
- while(1)
- {
- if(Second == 70) //總時(shí)間歸零
- {
- Second = 1;
- }
- //--南北通行,30秒--//
- if(Second < 31)
- {
- DisplayData[0] = DIG_CODE[(35 - Second) % 100 / 10]; //東西紅燈35S
- DisplayData[1] = DIG_CODE[(35 - Second) %10];
- DisplayData[2] = DIG_CODE[(30 - Second) % 100 / 10];//南北綠燈35S
- DisplayData[3] = DIG_CODE[(30 - Second) %10];
- DisplayData[4] = DIG_CODE[(35 - Second) % 100 / 10];//下紅燈35S
- DisplayData[5] = DIG_CODE[(35 - Second) %10];
- DisplayData[6] = DIG_CODE[(30 - Second) % 100 / 10];//左綠燈35S
- DisplayData[7] = DIG_CODE[(30 - Second) %10];
- DigDisplay();
- RED11 = 1; //南北紅燈滅
- YELLOW11 = 1; //南北黃燈滅
- GREEN11 = 0; //南北綠燈亮
-
- RED01 = 0; //東西紅燈亮
- YELLOW01 = 1; //東西黃燈滅
- GREEN01 = 1; //東西綠燈滅
- RED10=1; //左人行道紅燈滅
- GREEN10 = 0; //左人行道綠燈亮
- RED00 = 0; //下人行道紅燈亮
- GREEN00 = 1; //下人行道綠燈滅
- }
- //--南北黃燈等待切換狀態(tài),5秒--//
- else if(Second < 36)
- {
- DisplayData[0] = DIG_CODE[(35 - Second) % 100 / 10]; //東西紅燈35S
- DisplayData[1] = DIG_CODE[(35 - Second) %10];
- DisplayData[2] = DIG_CODE[(35 - Second) % 100 / 10];//南北黃燈5S
- DisplayData[3] = DIG_CODE[(35 - Second) %10];
- DisplayData[4] = DIG_CODE[(35 - Second) % 100 / 10];//下紅燈5S
- DisplayData[5] = DIG_CODE[(35 - Second) %10];
- DisplayData[6] = DIG_CODE[(70 - Second) % 100 / 10];//左紅燈5S
- DisplayData[7] = DIG_CODE[(70 - Second) %10];
- DigDisplay();
- RED11 = 1; //南北紅燈滅
- YELLOW11 = 0; //南北黃燈亮
- GREEN11 = 1; //南北綠燈滅
-
- RED01 = 0; //東西紅燈亮
- YELLOW01 = 1; //東西黃燈滅
- GREEN01 = 1; //東西綠燈滅
- RED10 = 0; //左人行道紅燈亮
- GREEN10 = 1; //左人行道綠燈滅
- RED00 = 0; //下人行道紅燈亮
- GREEN00 = 1; //下人行道綠燈滅
- }
- //--東西通行--//
- else if(Second < 66)
- {
- DisplayData[0] = DIG_CODE[(65 - Second) % 100 / 10];
- DisplayData[1] = DIG_CODE[(65 - Second) %10];
- DisplayData[2] = DIG_CODE[(70 - Second) % 100 / 10];
- DisplayData[3] = DIG_CODE[(70 - Second) %10];
- DisplayData[4] = DIG_CODE[(65 - Second) % 100 / 10];
- DisplayData[5] = DIG_CODE[(65 - Second) %10];
- DisplayData[6] = DIG_CODE[(70 - Second) % 100 / 10];
- DisplayData[7] = DIG_CODE[(70 - Second) %10];
- DigDisplay();
- RED11 = 0; //南北紅燈亮
- YELLOW11 = 1; //南北黃燈滅
- GREEN11 = 1; //南北綠燈滅
-
- RED01 = 1; //東西紅燈滅
- YELLOW01 = 1; //東西黃燈滅
- GREEN01 = 0; //東西綠燈亮
- RED10 = 0; //左人行道紅燈亮
- GREEN10 = 1; //左人行道綠燈滅
- RED00 = 1; //下人行道紅燈滅
- GREEN00 = 0; //下人行道綠燈亮
- }
- //--黃燈等待切換狀態(tài),5秒--//
- else
- {
- DisplayData[0] = DIG_CODE[(70 - Second) % 100 / 10];
- DisplayData[1] = DIG_CODE[(70 - Second) %10];
- DisplayData[2] = DIG_CODE[(70 - Second) % 100 / 10];
- DisplayData[3] = DIG_CODE[(70 - Second) %10];
- DisplayData[4] = DIG_CODE[(105 - Second) % 100 / 10];
- DisplayData[5] = DIG_CODE[(105 - Second) %10];
- DisplayData[6] = DIG_CODE[(70 - Second) % 100 / 10];
- DisplayData[7] = DIG_CODE[(70 - Second) %10];
- DigDisplay();
- RED11 = 0; //南北紅燈亮
- YELLOW11 = 1; //南北黃燈滅
- GREEN11 = 1; //南北綠燈滅
-
- RED01 = 1; //東西紅燈滅
- YELLOW01 = 0; //東西黃燈亮
- GREEN01 = 1; //東西綠燈滅
- RED10 = 0; //左人行道紅燈亮
- GREEN10 = 1; //左人行道綠燈滅
- RED00 = 0; //下人行道紅燈亮
- GREEN00 = 1; //下人行道綠燈滅
- }
- }
- }
- void DigDisplay()
- {
- unsigned char i;
- unsigned int j;
- for(i=0; i<8; i++)
- {
- GPIO_PLACE = DIG_PLACE; //發(fā)送位選 GPIO_DIG = DisplayData; //發(fā)送段碼 j = 10; //掃描間隔時(shí)間設(shè)定 while(j--); GPIO_DIG = 0x00; //消隱 }}
- void Timer0Cofig(void){ TMOD = 0x01; //定時(shí)器0選擇工作方式1 TH0 = 0x3C; //設(shè)置初始值,定時(shí)50MS TL0 = 0xB0; EA = 1; //打開(kāi)總中斷 ET0 = 1; //打開(kāi)定時(shí)器0中斷 TR0 = 1; //啟動(dòng)定時(shí)器0 }
- void Timer0() interrupt 1{ TH0 = 0x3C; //設(shè)置初始值 TL0 = 0xB0; Time++; if(Time == 20) { Second ++; Time = 0; }}
-
復(fù)制代碼
|
|