交通灯控制器,用的外部中断控制模式转换,但是外部中断1不好使,没反应把外部中断改为定时器0就可以
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar aa;
sbit nb=P2^2;
sbit dx=P2^3;
sbit shi=P3^6;
sbit ge=P3^7;
bit flag=0;
sbit P10=P1^0; //外部中断扩展所需的口
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
//定义IO口
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; //数码管段码
void delay(uint z);
void display(uint n);
void yellowa(void);
void yellowb(void);
void timer0();
void redgreena();
void redgreenb();
//模块函数
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void timer0() interrupt 1 //定时器初始化
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if(aa==18)
{
aa=0;
flag=1;
}
}
void display(uint n) //数码管显示函数
{
while(!flag)
{
shi=0;ge=1;
P0=table[n/10];
delay(5);
ge=0;shi=1;
P0=table[n%10];
delay(5);
//shi=1;ge=1;
}
if(flag==1)
flag=0;
}
void redgreena() //主干道红绿灯以及时间
{ uint num;
num=15;
display(num);
while(num<=15&&num>=0)
{ num--;
P2=0xfc;
display(num);
}
;
}
void redgreenb() //次干道红绿灯以及时间
{ uint num;
num=10;
while(num<=10&&num>=0)
{ P2=0xcf;
display(num);
num--;
}
}
void yellowa(void) //主干道黄灯以及时间
{
uint a;
for(a=4;a>0;a--)
{ P2=0xfc;
dx=1;
delay(100);
dx=0;
display(a);
}
}
void yellowb(void) //次干道黄灯以及时间
{
uint a;
for(a=3;a>0;a--)
{ P2=0xcf;
nb=1;
delay(100);
nb=0;
display(a);
}
}
void int0() interrupt 2 //紧急模式与夜间模式函数
{
if(!P12)
{
P2=0x0c;
}
if(!P11)
{
P2=0x03;
}
}
void main()
{
uint num;
num=0;
aa=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
EX0=1;
IT0=0;
EX1=1;
IT1=0;
PX1=1;
PT0=0;
//中断初始化
while(1)
{ //P1=0x00;
P2=0xff;
redgreena();
//P0=1;
yellowa();
redgreenb();
yellowb(); //函数流程
}
}
|