/************************************************** 實(shí)驗(yàn)名:交通燈設(shè)計(jì) 實(shí)驗(yàn)內(nèi)容:利用中斷,定時(shí)/計(jì)數(shù)器,數(shù)碼管和led燈進(jìn)行交通燈的設(shè)計(jì) *************************************************/ #include <reg52.h> #define uint unsigned int #define uchar unsigned char sbit wei1=P2^4; //定義位選 0 sbit wei2=P2^5; //1 sbit wei3=P2^6; //2 sbit wei4=P2^7; //3 sbit green_we=P1^2; //定義交通燈綠東西 sbit green_ns=P1^3; //定義交通燈綠南北 sbit red_we=P1^0; //定義交通燈紅東西 sbit red_ns=P1^1; //定義交通燈紅南北 sbit yellow_we=P1^4; //定義交通燈黃東西 sbit yellow_ns=P1^5; //定義交通燈黃南北 uchar num,num1,shi_we,shi_ns,ge_we,ge_ns; uint xianshi_we,xianshi_ns; uchar code table[]={ 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; //定義數(shù)值0,1,2....9 void delayms(uint xsm) //延時(shí)程序 { uint i,j; for(i=xsm;i>0;i--) for(j=110;j>0;j--); } void display(uchar shi_we,uchar ge_we,ucharshi_ns,uchar ge_ns) //定義數(shù)碼管函數(shù) { wei1=1; wei2=0; wei3=0; wei4=0; P0=table[shi_we]; delayms(5); wei1=0; wei2=1; wei3=0; wei4=0; P0=table[ge_we]; delayms(5); wei1=0; wei2=0; wei3=1; wei4=0; P0=table[shi_ns]; delayms(5); wei1=0; wei2=0; wei3=0; wei4=1; P0=table[ge_ns]; delayms(5); } void main() { num=0; num1=0; xianshi_we=99; xianshi_ns=99; shi_we=9; ge_we=9; shi_ns=9; ge_ns=9; TMOD=0x51; //設(shè)置定時(shí)器0和計(jì)數(shù)器1為工作方式1 TH0=(65536-46080)/256; //設(shè)置初值 TL0=(65536-46080)%256; TH1=(65536-46080)/256; TL1=(65536-46080)%256; EA=1; //開總中斷 ET0=1; //開定時(shí)器0中斷 ET1=1; //開定時(shí)器1中斷 TR0=1; //啟動(dòng)定時(shí)器0 TR1=1; //啟動(dòng)定時(shí)器1 P1=0xff; //led燈全滅 P1=0xf6; //定義東西亮紅燈,南北亮綠燈; while(1) { display(shi_we,ge_we,shi_ns,ge_ns); if(num1==1140) { P1=0xde;//定義東西亮紅燈,南北亮黃燈; } if(num1==1200) { P1=0xf9;//定義東西亮綠燈,南北亮紅燈; xianshi_we=60; xianshi_ns=60; } if(num1==2340) { P1=0xed;//定義東西亮黃燈,南北亮紅燈; } if(num1==2400) { num1=0; xianshi_we=60; xianshi_ns=60; P1=0xf6;//定義東西亮紅燈,南北亮綠燈; } } } void T0_time()interrupt 1 { TH0=(65536-46080)/256; TL0=(65536-46080)%256; num++; if(num%20==0) { num=0; xianshi_we--; xianshi_ns--; shi_we=xianshi_we/10; ge_we=xianshi_we%10; shi_ns=xianshi_ns/10; ge_ns=xianshi_ns%10; } } void T1_count() interrupt 3 { TH1=(65536-46080)/256; TL1=(65536-46080)%256; num1++; }
|