樓主的源碼:
- /****************************************交通燈程序*********************************************/
- /*
- 功能:以南北方向?yàn)橹鞲傻溃瑬|西方向?yàn)榇胃傻馈?nbsp;
- 1、實(shí)現(xiàn)主干道通行15秒轉(zhuǎn)通行注意狀態(tài),黃燈亮3秒。這段時(shí)間內(nèi)次干道保持紅燈常亮 (由數(shù)碼管顯示時(shí)間)
- 2、次干道通行10秒轉(zhuǎn)通行注意狀態(tài),黃燈亮2秒。這段時(shí)間內(nèi)主干道保持紅燈常亮 (由數(shù)碼管顯示時(shí)間)
- 3、緊急按鍵按下,所有路口紅燈
- /************************************調(diào)用頭文件、宏定義*****************************************/
- #include<stc10.h>
- #define D P1
- #define uchar unsigned char
- #define uint unsigned int
- /*******************************************函數(shù)聲明******************************************/
- void z1(void);//南北通
- void z2(void);//南北注意
- void z3(void);//東西通
- void z4(void);//東西注意
- void gb(void); //全關(guān)
- void jinji(void);//緊急狀態(tài),紅燈全亮
- void sm(void); //鍵盤掃描
- void plus(); //加一掃描
- void minus(); //減一掃描
- void plus2();
- void minus2();
- void timer(void);//定時(shí)器T1初始化
- void time1(void);//定義定時(shí)器T1中斷服務(wù)程序
- void display(void);//顯示函數(shù)
- void delay(uint a);//10ms延時(shí)函數(shù)
- /*************************************定義數(shù)組,全局變量***************************************/
- uint duan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9斷碼數(shù)組
- uint y,gw,sw,gw2,sw2; //全局變量
- int time,s,times,time2,times2,time3;
- /*********************************定義12個(gè)小燈、數(shù)碼管位、按鍵*********************************/
- /*************12個(gè)小燈*******************/ //數(shù)碼管位選// // 按鍵 //
- sbit d1 =P2^0; sbit d2 =P2^1; sbit d3= P2^2; sbit w1=P0^0; sbit H1 =P3^6; sbit H2=P3^7;
- sbit d4 =P2^3; sbit d5 =P2^4; sbit d6= P2^5; sbit w2=P0^1; sbit key1 =P0^5;
- sbit d7 =P2^6; sbit d8 =P2^7; sbit d9= P3^2; sbit w3=P0^2; sbit key2 =P0^6;
- sbit d10=P3^3; sbit d11=P3^4; sbit d12=P3^5; sbit w4=P0^3; sbit key3 =P0^7;
- /*********************************************主函數(shù)***********************************************/
- void main(void)
- {
- times=18;
- time=15;
- time2=10;
- times2=12;
- y=0,s=0; //定時(shí)器溢出計(jì)數(shù)初始化
- P1M1=0X00; //推挽輸出,增加數(shù)碼管亮度
- P1M0=0XFF;
- timer(); //啟動(dòng)定時(shí)器T1
- while(1)
- {
- z1(); //主干道通行,綠燈15秒
- z2(); //主干道注意,黃燈 3秒
- z3(); //次干道通行,綠燈10秒
- z4(); //次干道注意,黃燈 2秒
- }
- }
- /******************不同狀態(tài)函數(shù)、定時(shí)器初始化、定時(shí)器中斷服務(wù)函數(shù)************************/
- void z1(void)//南北通行,東西禁止
- {
- while(s<time)
- {
- sm();
- plus();
- minus();
- if(TR1==1)
- {
- //藍(lán) /黃 /紅
- d4 =0;d5 =1;d6 =1;//北
- d10=0;d11=1;d12=1;//南
- d7 =1;d8 =1;d9 =0;//東
- d1 =1;d2 =1;d3 =0;//西
- }
- sw2=(time-s)/10; //數(shù)碼管十位(南北主干道)
- gw2=(time-s)%10; //數(shù)碼管個(gè)位
- sw=(times-s)/10;
- gw=(times-s)%10;
- display(); //顯示
- gb(); //關(guān)閉
- } s=0;//對(duì)定時(shí)時(shí)間標(biāo)志位清零重置
- }
- void z2(void)//南北注意,東西禁止
- {
- time3=3;
- while(s<time3)
- {
- sm();
- if(TR1==1)
- {
- //藍(lán) /黃 /紅
- d4 =1;d5 =0;d6 =1;//北
- d10=1;d11=0;d12=1;//南
- d7 =1;d8 =1;d9 =0;//東
- d1 =1;d2 =1;d3 =0;//西
- }
- sw2=(time3-s)/10; //數(shù)碼管十位(南北主干道)
- gw2=(time3-s)%10; //數(shù)碼管個(gè)位
- sw=sw2; //東西次干道
- gw=gw2;
- display(); //顯示
- gb(); //關(guān)閉
- } s=0;
- }
- void z3(void)//東西通行,南北禁止
- {
- while(s<time2)
- {
- sm();
- plus2();
- minus2();
- //藍(lán) /黃 /紅
- d4 =1;d5 =1;d6 =0;//北
- d10=1;d11=1;d12=0;//南
- d7 =0;d8 =1;d9 =1;//東
- d1 =0;d2 =1;d3 =1;//西
- sw2=(times2-s)/10;; //南北主干道
- gw2=(times2-s)%10;
- sw=(time2-s)/10; //數(shù)碼管十位(東西次干道)
- gw=(time2-s)%10; //數(shù)碼管個(gè)位
- display(); //顯示
- gb(); //關(guān)閉
- } s=0;
- }
- void z4(void)//東西注意,南北禁止
- {
- time3=2;
- while(s<time3)
- {
- sm();
- //藍(lán) /黃 /紅
- d4 =1;d5 =1;d6 =0;//北
- d10=1;d11=1;d12=0;//南
- d7 =1;d8 =0;d9 =1;//東
- d1 =1;d2 =0;d3 =1;//西
- sw=(time3-s)/10; //東西次干道_數(shù)碼管十位
- gw=(time3-s)%10; //東西次干道_數(shù)碼管個(gè)位
- sw2=sw; //南北主干道
- gw2=gw;
- display(); //顯示
- gb(); //關(guān)閉
- } s=0;
- }
- void jinji(void)//紅燈全亮,其余全滅,緊急狀態(tài)
- {
- //藍(lán) /黃 /紅
- d4 =1;d5 =1;d6 =0;//北
- d10=1;d11=1;d12=0;//南
- d7 =1;d8 =1;d9 =0;//東
- d1 =1;d2 =1;d3 =0;//西
- }
- void gb(void)//全部關(guān)閉
- {
- //藍(lán) /黃 /紅
- d4 =1;d5 =1;d6 =1;//北
- d10=1;d11=1;d12=1;//南
- d7 =1;d8 =1;d9 =1;//東
- d1 =1;d2 =1;d3 =1;//西
- }
- void delay(uint a) //@11.0592MHz 10ms延時(shí)(使用燒錄軟件生成的延時(shí)代碼)
- {
- for(a;a>0;a--)
- {
- unsigned char i, j;
- i = 18;
- j = 235;
- do
- {
- while (--j);
- } while (--i);
- }
- }
- void display() //數(shù)碼管顯示
- {
- w1=0; //十位
- D=duan[sw];
- delay(1);
- w1=1;
- D=0X00;
- w2=0; //個(gè)位
- D=duan[gw];
- delay(1);
- w2=1;
- D=0x00;
- w3=0; //十位
- D=duan[sw2];
- delay(1);
- w3=1;
- D=0X00;
- w4=0; //個(gè)位
- D=duan[gw2];
- delay(1);
- w4=1;
- D=0x00;
- }
- void timer(void)
- {
- TMOD=0X10;
- TH1=(65536-50000)/256; //50ms定時(shí)
- TL1=(65536-50000)%256;
- EA=1;
- ET1=1;
- TR1=1;
- }
- void time1(void) interrupt 3 //定時(shí)器T1中斷服務(wù)程序
- {
- TH1=(65536-50000)/256; //50ms定時(shí)
- TL1=(65536-50000)%256;
- y++;
- if(y==20)
- {s++; y=0;}
- }
- void sm(void)//緊急狀態(tài)掃描函數(shù)
- {
- H1=0; //按鍵另一端置0,當(dāng)按鍵按下相當(dāng)于接地,由原理圖,沒有按下時(shí),通過上拉電阻拉高了
- if(key1==0) //判斷按鍵是否按下
- {
- delay(2); //消抖
- while(!key1) //松手檢測(cè)
- TR1=!TR1; //關(guān)閉定時(shí)器
- while(key1==1) //四個(gè)方向全為紅燈,進(jìn)入緊急狀態(tài)
- {
- gb();
- jinji(); //打開緊急狀態(tài)
- gw=gw2=sw=sw2=8;
- display();
- }
- while(key1==0) //松手檢測(cè)
- display();
- TR1=1; //打開定時(shí)器,跳出
- }
- }
- void plus()
- {
- H1=0; //按鍵另一端置0,當(dāng)按鍵按下相當(dāng)于接地,由原理圖,沒有按下時(shí),通過上拉電阻拉高了
- if(key2==0) //判斷按鍵是否按下
- delay(2); //消抖
- if(key2==0)
- {
- time+=1;
- times+=1;}
- while(!key2); //松手檢測(cè)
- }
- void minus()
- {
- H1=0; //按鍵另一端置0,當(dāng)按鍵按下相當(dāng)于接地,由原理圖,沒有按下時(shí),通過上拉電阻拉高了
- if(key3==0) //判斷按鍵是否按下
- delay(2); //消抖
- if(key3==0){
- time-=1;
- times-=1;}
- while(!key3); //松手檢測(cè)
- }
- void plus2()
- {
- H2=0; //按鍵另一端置0,當(dāng)按鍵按下相當(dāng)于接地,由原理圖,沒有按下時(shí),通過上拉電阻拉高了
- if(key2==0) //判斷按鍵是否按下,在這里相當(dāng)于key5
- delay(2); //消抖
- if(key2==0)
- {
- time2+=1;
- times2+=1;}
- while(!key2); //松手檢測(cè)
- }
- void minus2()
- {
- H2=0; //按鍵另一端置0,當(dāng)按鍵按下相當(dāng)于接地,由原理圖,沒有按下時(shí),通過上拉電阻拉高了
- if(key3==0) //判斷按鍵是否按下,這里相當(dāng)于key6
- delay(2); //消抖
- if(key3==0){
- time2-=1;
- times2-=1;}
- while(!key3); //松手檢測(cè)
- }
復(fù)制代碼 |