/************************************************** 实验名:交通灯设计 实验内容:利用中断,定时/计数器,数码管和led灯进行交通灯的设计 *************************************************/ #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}; //定义数值0,1,2....9 void delayms(uint xsm) //延时程序 { 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) //定义数码管函数 { 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; //设置定时器0和计数器1为工作方式1 TH0=(65536-46080)/256; //设置初值 TL0=(65536-46080)%256; TH1=(65536-46080)/256; TL1=(65536-46080)%256; EA=1; //开总中断 ET0=1; //开定时器0中断 ET1=1; //开定时器1中断 TR0=1; //启动定时器0 TR1=1; //启动定时器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++; }
|