扩展无
绿灯 26S 红灯 30S 黄灯 闪烁3S
初始化:
1.南北通行 2.东西红灯 3.计时器保持26 跟 30
交通灯过程:
1.南北通行26S 然后 南北 跟 东西 黄灯闪烁3S 2.东西通行26S 然后 东西 跟 南北 黄灯闪烁3S
中断:
1.四个交通灯 红灯亮起 2.计时器全灭 3.蜂鸣器响起
复位:
即从新进行main 可以跳出我的中断死循环
运用到的功能
1.外部中断0 2.定时器中断0
uchar segcode[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint t=0;
uint count=0;
sbit select0=P2^0;
sbit select1=P2^1;
sbit Select0=P2^2;
sbit Select1=P2^3;
//30 27 3
// p0 nan bei p1 dong xi
sbit ge1=P2^4;
sbit re1=P2^5;
sbit ye1=P2^6;
sbit ge2=P2^7;
sbit re2=P3^0;
sbit ye2=P3^1;
sbit P3_2=P3^2;
sbit beep=P3^3;
uint flag=0;
void delay(uint aim)
{
uint j=0;
for(;aim>0;aim--)
for(j=0;j<125;j++);
}
// all
void check(){
//while(1)
while(1){
beep=0;
P1=0xFF;P0=0xFF;
ye1=0;re1=1;ge1=0;
ye2=0;re2=1;ge2=0;
}
}
void int0rupt() interrupt 0 //P3^2==0
{
while(P3_2!=1);
check();
}
void timer0_isr() interrupt 1
{
TH0 = (65536 - 1000) / 256;
TL0 = (65536 - 1000) % 256;
if(t<4&&count%400==0){
ye1=~ye1; ye2=~ye2;
}
count++;
if(count>=1000)
{
t--;
if(t==-1)
{
t=30;flag=!flag;
}
count=0;
}
}
void Nan_bei(uint n){
P1=~segcode[n/10];
select0=0;
select1=1;
delay(5);
select0=0;
select1=0;
delay(2);
P1=~segcode[n%10];
select0=1;
select1=0;
delay(5);
select0=0;
select1=0;
delay(2);
}
void Dong_xi(uint n){
P0=~segcode[n/10];
Select0=0;
Select1=1;
delay(5);
Select0=0;
Select1=0;
delay(2);
P0=~segcode[n%10];
Select0=1;
Select1=0;
delay(5);
Select0=0;
Select1=0;
delay(2);
}
void high(){
if(t<4){
re1=0;ge1=0;
re2=0;ge2=0;
Nan_bei(t);
Dong_xi(t);
return;
}
if(!flag){//Nan_bei lu Dong_xi red
ye1=0;re1=0;ge1=1;
ye2=0;re2=1;ge2=0;
Nan_bei(t-4);
Dong_xi(t);
}else{
ye1=0;re1=1;ge1=0;
ye2=0;re2=0;ge2=1;
Nan_bei(t);
Dong_xi(t-4);
}
}
void initlight(){
beep=1;
EA=1;//
EX0=1;//
IT0=0;//
TMOD=0x01;
TH0 = (65536 - 1000) / 256;
TL0 = (65536 - 1000) % 256;
ET0 = 1;
TR0 = 1;
ye1=0;re1=0;ge1=1;
ye2=0;re2=1;ge2=0;
t=30;
while(1){
Nan_bei(26);
Dong_xi(30);
if(t==29) break;
}
}
void main()
{
initlight();
t++;
while(1)
{
high();
}
}
|