|
- #define uchar unsigned char //無(wú)符號(hào)字符型 宏定義 變量范圍0~255
- #define uint unsigned int //無(wú)符號(hào)整型 宏定義 變量范圍0~65535
-
- //數(shù)碼管段選定義 0 1 2 3 4 5 6 7 8 9 A B
- uchar smg_du[]={0x40,0x75,0x0c,0x14,0x31,0x12,0x02,0x74,0x00,0x10,0x20,0x03,}; //斷碼
- uchar dis_smg[4] = {0}; //數(shù)碼管顯示數(shù)組的緩沖區(qū)
-
- //數(shù)碼管位選定義
- sbit smg_we1 = P2^0; //數(shù)碼管位選IO口定義
- sbit smg_we2 = P2^1; //數(shù)碼管位選IO口定義
- sbit smg_we3 = P3^6; //數(shù)碼管位選IO口定義
- sbit smg_we4 = P3^7; //數(shù)碼管位選IO口定義
- sbit key1 = P1^0; //按鍵IO口定義
- sbit key2 = P1^1; //按鍵IO口定義
- sbit key3 = P1^2; //按鍵IO口定義
- sbit key4 = P1^3; //按鍵IO口定義
-
- uchar menu_1; //設(shè)置不同參數(shù)的變量
- char dx_s = 0,nb_s = 0; //東西 南北 倒計(jì)時(shí)變量
- sbit dx_red = P2^7; //東西紅燈IO口定義
- sbit dx_green = P2^6; //東西綠燈IO口定義
- sbit dx_yellow = P2^5; //東西黃燈IO口定義
- sbit nb_red = P2^4; //南北紅燈IO口定義
- sbit nb_green = P2^3; //南北綠燈IO口定義
- sbit nb_yellow = P2^2; //南北黃燈IO口定義
- bit flag_1s = 0; //1秒的變量
- bit flag_500ms; //500毫秒的變量
- bit flag_dx_nb = 0; //東西南北模式
- uchar dx_time = 30,nb_time = 20; //東西、南北的時(shí)間設(shè)置的時(shí)間
- uchar flag_jdgz ; //交通管制
- /***********************數(shù)碼位選函數(shù)*****************************/
- void smg_we_switch(uchar i)
- {
- switch(i)
- {
- case 0: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break;
- case 1: smg_we1 = 1; smg_we2 = 0; smg_we3 = 1; smg_we4 = 1; break;
- case 2: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break;
- case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;
- }
- }
-
- /********************************************************************
- * 名稱 : delay_1ms()
- * 功能 : 延時(shí)1ms函數(shù)
- * 輸入 : q
- * 輸出 : 無(wú)
- ***********************************************************************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<120;j++);
- }
- uchar i;
- /********************************************************************
- * 名稱 : display()
- * 功能 : 數(shù)碼管顯示
- * 輸入 : 無(wú)
- * 輸出 : 無(wú)
- ***********************************************************************/
- void display()
- {
- for(i=0;i<4;i++)
- {
- P0 = 0xff; //消隱
- smg_we_switch(i); //位選
- P0 = dis_smg[i]; //段選
- delay_1ms(3); //延時(shí)
- }
- }
- /*********************定時(shí)器0初始化******************/
- void time0_init()
- {
- EA = 1; //開總中斷
- TMOD = 0X01; //定時(shí)器0工作方式1
- ET0 = 1; //開定時(shí)器0中斷
- TR0 = 1; //允許定時(shí)器0定時(shí)
- TH0 = 0x3c;
- TL0 = 0xb0; //50ms
- }
- /*********************交通燈處理函數(shù)*********************************/
- void jiaotongdeng_dis()
- {
- if(flag_1s == 1) //1秒執(zhí)行一次里面的程序
- {
- flag_1s = 0;
- if(flag_dx_nb == 0) //南北綠燈時(shí)間
- {
- dx_s --; //東西倒計(jì)時(shí)時(shí)間減1
- nb_s --; //南北倒計(jì)時(shí)時(shí)間減1
- if(dx_s == 5)
- nb_s = 5;
- }
- if(flag_dx_nb == 1) //東西綠燈時(shí)間
- {
- dx_s --; //南北倒計(jì)時(shí)時(shí)間減1
- nb_s --; //東西倒計(jì)時(shí)時(shí)間減1
- if(nb_s == 5)
- dx_s = 5;
- }
- if(dx_s <= 0) //倒計(jì)時(shí)時(shí)間為0切換東西 南北綠燈時(shí)間
- {
- flag_dx_nb = ~flag_dx_nb;
- if(flag_dx_nb == 1) //東西時(shí)間
- {
- dx_s = dx_time;
- nb_s = dx_time + 5;
- }
- else //南北時(shí)間
- {
- dx_s = nb_time + 5;
- nb_s = nb_time;
- }
- }
- }
- dis_smg[0] = smg_du[dx_s % 10] ; //顯示東西倒計(jì)時(shí) 時(shí)間
- dis_smg[1] = smg_du[dx_s / 10] ;
- dis_smg[2] = smg_du[nb_s % 10] ; //顯示南北倒計(jì)時(shí) 時(shí)間
- dis_smg[3] = smg_du[nb_s / 10] ;
- /***********************南北時(shí)間綠燈時(shí)間*********************************/
- if(flag_dx_nb == 0)
- {
- if(dx_s > 5)
- {
- dx_red = 0; //東西紅燈亮
- dx_green = 1; //東西綠燈滅
- dx_yellow = 1; //東西黃燈滅
- nb_red = 1; //南北紅燈滅
- nb_green = 0; //南北綠燈亮
- nb_yellow = 1; //南北黃燈滅
- }else if(dx_s <= 5) //當(dāng)小于5秒時(shí) 黃燈要閃了
- {
- dx_red = 0; //東西紅燈滅
- dx_green = 1; //東西綠燈滅
- dx_yellow = 1; //東西黃燈滅
- nb_red = 1; //南北紅燈滅
- nb_green = 1; //南北綠燈滅
- if(flag_500ms == 0) //黃燈閃爍
- {
- nb_yellow = 0; //亮
- }
- else
- {
- nb_yellow = 1; //滅
- }
- }
- }
- /***********************東西時(shí)間綠燈時(shí)間*********************************/
- if(flag_dx_nb == 1)
- {
- if(nb_s > 5)
- {
- dx_red = 1; //東西紅燈滅
- dx_green = 0; //東西綠燈亮
- dx_yellow = 1; //東西黃燈滅
- nb_red = 0; //南北紅燈亮
- nb_green = 1; //南北綠燈滅
- nb_yellow = 1; //南北黃燈滅
- }else if(nb_s <= 5) //當(dāng)小于5秒時(shí) 黃燈要閃了
- {
- dx_red = 1; //東西紅燈滅
- dx_green = 1; //東西綠燈滅
- nb_red = 0; //南北紅燈亮
- nb_green = 1; //南北綠燈滅
- nb_yellow = 1; //南北黃燈滅
- if(flag_500ms == 0) //黃燈閃爍
- {
- dx_yellow = 0;//東西黃燈亮
- }
- else
- {
- dx_yellow = 1;//東西黃燈滅
- }
- }
- }
- }
- /********************獨(dú)立按鍵程序*****************/
- uchar key_can; //按鍵值
- void key() //獨(dú)立按鍵程序
- {
- static uchar key_new; //key_new 這個(gè)變量的功能是做按鍵松手檢測(cè)的
- key_can = 0; //按鍵值還原成0
- if(key1 == 0 || key2 == 0 || key3 == 0 || key4 == 0) //有按鍵按下
- {
- delay_1ms(1); //按鍵延時(shí)消抖動(dòng)
- if(key_new == 1)
- {
- key_new = 0; //key_new = 0 說(shuō)明按鍵已按下
- if(key1 == 0) //確認(rèn)是按鍵按下
- key_can = 1; //得到按鍵值
- if(key2 == 0) //確認(rèn)是按鍵按下
- key_can = 2; //得到按鍵值
- if(key3 == 0) //確認(rèn)是按鍵按下
- key_can = 3; //得到按鍵值
- if(key4 == 0) //確認(rèn)是按鍵按下
- key_can = 4; //得到按鍵值
- }
- }
- else
- key_new = 1; //key_new = 1 說(shuō)明按鍵已經(jīng)松開了
- }
-
- /********************設(shè)置函數(shù)*****************/
- void key_with()
- {
- if(key_can == 4) //交通管制按鍵 緊急模式
- {
- flag_jdgz ++;
- if(flag_jdgz > 4)
- flag_jdgz = 0;
- if(flag_jdgz == 1) // 全部亮紅燈
- {
- dx_red = 0; //東西紅燈亮
- dx_green = 1; //東西綠燈滅
- dx_yellow = 1; //東西黃燈滅
- nb_red = 0; //南北紅燈亮
- nb_green = 1; //南北綠燈滅
- nb_yellow = 1; //南北黃燈滅
- }
- if(flag_jdgz == 2) // 東西紅燈 南北綠燈
- {
- dx_red = 0; //東西紅燈亮
- dx_green = 1; //東西綠燈滅
- dx_yellow = 1; //東西黃燈滅
- nb_red = 1; //南北紅燈滅
- nb_green = 0; //南北綠燈亮
- nb_yellow = 1; //南北黃燈滅
- }
- if(flag_jdgz == 3) // 南北紅燈 東西綠燈
- {
- dx_red = 1; //東西紅燈滅
- dx_green = 0; //東西綠燈亮
- dx_yellow = 1; //東西黃燈滅
- nb_red = 0; //南北紅燈亮
- nb_green = 1; //南北綠燈滅
- nb_yellow = 1; //南北黃燈滅
- }
- if(flag_jdgz == 4) // 南北黃燈閃 東西黃燈閃
- {
- dx_red = 1; //東西紅燈滅
- dx_green = 1; //東西綠燈滅
- nb_red = 1; //南北紅燈滅
- nb_green = 1; //南北綠燈滅
- }
- }
- if(key_can == 1) //設(shè)置鍵
- {
- menu_1 ++;
- if(menu_1 >= 3)
- {
- menu_1 = 0; //menu_1 = 0 退出設(shè)置,是在正常顯示界面下
- }
- }
- if(menu_1 == 1) //設(shè)置東西綠燈的時(shí)間
- {
- if(key_can == 2) //加鍵
- {
- dx_time ++ ; //設(shè)置東西綠燈的時(shí)間 加1
- if(dx_time > 99)
- dx_time = 99;
- }
- if(key_can == 3) //減鍵
- {
- dx_time -- ; //設(shè)置東西綠燈的時(shí)間 減1
- if(dx_time <= 5)
- dx_time = 5;
- }
- dis_smg[0] = smg_du[dx_time % 10] ; //顯示設(shè)置的東西綠燈的時(shí)間 個(gè)位數(shù)
- dis_smg[1] = smg_du[dx_time / 10] ; //顯示設(shè)置的東西綠燈的時(shí)間 十位數(shù)
- dis_smg[2] = smg_du[10] ; //顯示為A
- dis_smg[3] = smg_du[10] ; //顯示為A
- }
- if(menu_1 == 2) //設(shè)置南北綠燈的時(shí)間
- {
- if(key_can == 2) //加鍵
- {
- nb_time ++ ; //設(shè)置南北綠燈的時(shí)間 加1
- if(nb_time > 99)
- nb_time = 99;
- }
- if(key_can == 3) //減鍵
- {
- nb_time -- ; //設(shè)置南北綠燈的時(shí)間 減1
- if(nb_time <= 5)
- nb_time = 5;
- }
- dis_smg[0] = smg_du[11] ; //顯示為B
- dis_smg[1] = smg_du[11] ; //顯示為B
- dis_smg[2] = smg_du[nb_time % 10] ; //顯示設(shè)置的南北綠燈的時(shí)間 個(gè)位數(shù)
- dis_smg[3] = smg_du[nb_time / 10] ; //顯示設(shè)置的南北綠燈的時(shí)間 十位數(shù)
- }
- }
- /********************************************************************
- * 名稱 : main()
- * 功能 : 實(shí)現(xiàn)燈的閃爍
- * 輸入 : 無(wú)
- * 輸出 : 無(wú)
- ***********************************************************************/
- void main()
- {
- time0_init(); //定時(shí)器初始化程序
- dx_s = nb_time + 5; //南北時(shí)間
- nb_s = nb_time ; //東西時(shí)間
- while(1)
- {
- key(); //按鍵函數(shù)
- if(key_can > 0) //有按鍵按下
- key_with(); //按鍵處理設(shè)置函數(shù)
- if((menu_1 == 0) && (flag_jdgz == 0))
- jiaotongdeng_dis(); //交通燈處理函數(shù)
- if(flag_jdgz == 4) //夜間模式
- if(flag_500ms == 1) // 南北黃燈閃 東西黃燈閃
- {
- flag_500ms = 0;
- nb_yellow = ~nb_yellow; // 南北黃燈閃
- dx_yellow = ~dx_yellow; // 東西黃燈閃
- }
- display(); //數(shù)碼管顯示函數(shù)
- }
- }
- /*********************定時(shí)器0中斷服務(wù)程序************************/
- void time0_int() interrupt 1
- {
- static uchar value; //定時(shí)50ms中斷一次
- TH0 = 0x3c;
- TL0 = 0xb0; //50ms
- value ++;
- if(value % 10 == 0)
- flag_500ms = ~flag_500ms; //定時(shí)產(chǎn)生一個(gè)500毫秒的變量
- if(value >= 20)
- {
- value = 0;
- flag_1s = 1; //定時(shí)產(chǎn)生一個(gè)1秒的變量
- }
- }
復(fù)制代碼
|
|