写中断之前 我们先要了解 中断在哪
常用的有外部中断 计时器中断 串行口中断
这里我们用外部中断
1、(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。
2、(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。
3、TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断。
4、TF1(TCON.7),片内定时/计数器T1溢出中断请求标志。当定时/计数器T1发生溢出时,置位TF1,并向CPU申请中断。
5、RI(SCON.0)或TI(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。
EA: 总中断允许。 EA=0;CPU屏蔽所有中断的请求 EA=1;开放所有中断。
ES:串行口中断允许位。ES=0; 禁止串行中断。ES=1; 允许串口中断。
ET0、ET1: 定时器/计数器0 和 定时器/计数器 1 中断允许位 =0时 禁止相应的定时器中断。 =1 允许相应的定时器中断。
EX0、EX1: 外部中断0 和 外部中断 1 中断允许位。=0时 禁止相应的外部中断。 =1时 允许相应的外部中断。
(1:代表允许中断 0 :代表禁止中断)
中断程序
void check(){
int i;
beep=0;
P0=num[0];
P2=~(0x02);
P1=~(0x01);
for(i=0;i<=10;i++){
dalay(1000);
}
beep=1;
}
void int0rupt() interrupt 0 //P3^2==0
{
beep=1; //关闭蜂鸣器
while(P3_2!=1);
check();
}
较上一个红绿灯 我这个多了一个中断程序
这个·中断是 在按下按钮之后 进入中断 然后 进入10s的东西通行 南北禁止通行
倒计时秒表设为0 同时蜂鸣器响起
这个中断可以用在 一路放绿灯
整个proteus图片如下
蜂鸣器响应电压应设置为2v 否则没有响应
主要功能跟我上一个红绿灯差不多 只多了一个中断
七段码实现红绿灯
主程序
#include<reg51.h>
unsigned char num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit P3_2=P3^2;
sbit beep=P3^3;
void dalay(unsigned int n){
int i=0,j=0;
for(i=0;i<n;i++)
for(j=0;j<120;j++);
}
void solve(){
int i=0;
for(i=0;i<8;i++){
P0=~(0x01<<i);
dalay(1000);
}
}
void leftgreen(){
int i=0;
P2=~(0x01);
P1=~(0x04);
for(i=0;i<10;i++){
P0=num[9-i];
dalay(1000);
}
}
void leftred(){
int i=0;
P2=~(0x02);
P1=~(0x01);
for(i=0;i<10;i++){
P0=num[9-i];
dalay(1000);
}
}
void yellow(){
int i=0;
for(i=0;i<4;i++){
P0=num[3-i];
P2=~(0x04);
P1=~(0x02);
dalay(500);
P2=0xFF;
P1=0xFF;
dalay(500);
}
}
void check(){
int i;
beep=0;
P0=num[0];
P2=~(0x02);
P1=~(0x01);
for(i=0;i<=10;i++){
dalay(1000);
}
beep=1;
}
void int0rupt() interrupt 0 //P3^2==0
{
beep=1;
while(P3_2!=1);
check();
}
void main(){
EA=1;//
EX0=1;//
IT0=0;//
while(1){
P0=num[0];
dalay(1000);
leftgreen();
P2=0xFF;P1=0xFF;
P0=num[0];
dalay(1000);
yellow();
P0=num[0];
P2=0xFF;P1=0xFF;
dalay(1000);
leftred();
P0=num[0];
P2=0xFF;P1=0xFF;
yellow();
P0=num[0];
P2=0xFF;P1=0xFF;
}
}