标题:
我只会单片机定时器中断写交通灯,外部中断怎么写?求思路
[打印本页]
作者:
2470899818
时间:
2019-8-29 17:06
标题:
我只会单片机定时器中断写交通灯,外部中断怎么写?求思路
师傅让我们设计交通灯 系统..要求用 外部中断与定时器中断.
我只会定时器中断..外部中断写不出来..
求高手帮忙写一个 应用 外部中断 与定时器中断的 交通灯 例子.
下面是我自己写的交通灯程序与 仿真图
51hei截图20190829170457.jpg
(175.75 KB, 下载次数: 31)
下载附件
2019-8-29 17:05 上传
单片机源程序如下:
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit red_a=P0^0;
sbit yellow_a=P0^1;
sbit green_a=P0^2;
sbit red_b=P0^3;
sbit yellow_b=P0^4;
sbit green_b=P0^5;
sbit spk=P3^3;
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
uchar count=0,type=1,a=0;
uint t=0;
uchar code led_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
//uchar dsy_buffer[]={0,0,0};
/*void show()
{
dsy_buffer[2]=count/100;
dsy_buffer[1]=count/100;
P1=led_code[dsy_buffer[1]];
P2=led_code[dsy_buffer[2]];
}*/
void delay500ms(unsigned char m)
{
unsigned char k1,k2;
TH0=0x3c;
TL0=0XB0;
TR0=1;
for(k1=0;k1<m;k1++)
{
for(k2=0;k2<10;k2++)
{
while(!TF0);
TF0=0;
TH0=0x3c;
TL0=0XB0;
}
}
}
void sound(uchar t) //·¢éùoˉêy
{
uchar i,j;
for(i=0;i<200;i++)
{
spk=~spk;
for(j=0;j<t;j++);
}
}
void clear()
{
uint j;
if(k3==0)
{
P1=0x00;
P2=0x00;
red_a=1;yellow_a=1;green_a=1;//1±íê¾Ãe,0±íê¾áá..a±íê¾¶«Î÷..b±íê¾Äϱ±
red_b=1;yellow_b=1;green_b=1;
for(j=100;j>0;j--)
{
delay500ms(2);
if(k3==0)
{
red_a=1;yellow_a=1;green_a=0;//1±íê¾Ãe,0±íê¾áá..a±íê¾¶«Î÷..b±íê¾Äϱ±
red_b=0;yellow_b=1;green_b=1;
break;
}
}
}
}
void key1_an()
{
uint j;
if(k1==0)
{
red_a=0;yellow_a=1;green_a=1;
red_b=1;yellow_b=1;green_b=0;
for(j=100;j>0;j--)
{
delay500ms(2);
if( k1 ==0)
{
j=1;
red_a=1;yellow_a=1;green_a=0;//1±íê¾Ãe,0±íê¾áá..a±íê¾¶«Î÷..b±íê¾Äϱ±
red_b=0;yellow_b=1;green_b=1;
}
}
}
}
void key2_an()
{
uint j;
if(k2==0)
{
red_a=1;yellow_a=1;green_a=0;
red_b=0;yellow_b=1;green_b=1;
for(j=100;j>0;j--)
{
delay500ms(2);
if( k2 ==0)
{
j=1;
red_a=0;yellow_a=1;green_a=1;
red_b=1;yellow_b=1;green_b=0;
}
}
}
}
void traflic_light()
{
uchar i=0;
P1=0x00;
P2=0x00;
switch(type)
{
case 1:
red_a=1;yellow_a=1;green_a=0;//1±íê¾Ãe,0±íê¾áá..a±íê¾¶«Î÷..b±íê¾Äϱ±
red_b=0;yellow_b=1;green_b=1;
for(i=0;i<10;i++)
{
P1=led_code[9-i];
delay500ms(2);
//show();
clear();
key1_an();
}
type=2;
break;
case 2:
for(i=0;i<6;i++)
{
yellow_a=~yellow_a;green_a=1;
P1=led_code[i/2+1];
delay500ms(1);
if(i%2==0)
{
sound(90);
sound(120);
}
clear();
}
type=3;
break;
case 3:
red_a=0;yellow_a=1;green_a=1;
red_b=1;yellow_b=1;green_b=0;
for(i=0;i<10;i++)
{
P2=led_code[9-i];
delay500ms(2);
clear();
key2_an();
}
type=4;
break;
case 4:
for(i=0;i<6;i++)
{
yellow_b=~yellow_b;green_b=1;
P2=led_code[i/2+1];
delay500ms(1);
clear();
if(i%2==0)
{
sound(90);
sound(120);
}
}
type=1;
}
}
void main()
{
EA=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
while(1) ;
}
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(++t==20)
{
traflic_light();
sound(90);
sound(120);
t=0;
}
}
/*void EX_INT0() interrupt 0
{
count++;
}*/
/*void int0() interrupt 0
{
t++;
delay500ms(2);
delay500ms(2);
}
*/
复制代码
作者:
csmyldl
时间:
2019-8-29 18:31
要用到外部中断,主要是编写按键作为外部中断触发的程序,图中3个按键只有最下面一个按键接在P32上才能用外部中断,如果3个按键均要用外部中断,还必须修改电路,接在P32上的按键,当按下时为低电平,可设置外部中断0中断允许,并且设置下降沿触发即可,程序中包含如下内容即可
IE=0x81; //允许外部中断
IT0=1; //下降沿触发
void wzd() interrupt 0
{
; //外中断后的任务
}
作者:
鹏博士PBs
时间:
2019-8-30 09:11
楼主你的需求不明确啊
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1