51单片机外部中断怎么用?

今天再接再厉把昨天的程序来完善,由于心理测试仪需要采集外部脉冲来计数,那么就必须用到外部中断来计数,然后送数码管显示,昨天贪方便先用内部计时中断,好,今天自己添一个方波到单片机的P3,2口(INTO口),作为外部中断源来使用:仿真图如下:

     

程序如下:

#include<reg52.h>

#define uchar unsigned char

#define uint  unsigned int

code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 共阳:09

code tablewei[]={0x02,0x01};//选择哪个数码管亮    :个位或者十位

static uchar i,numduan,numwei,shi;

static uint j;

sbit P00=P0^0;

sbit P01=P0^1;

sbit WELA=P1^0;

sbit DUAN=P1^1;

sbit led=P1^7;//检测是否有进入中断

void init()

{

    

    EA=1;//开总中断

    EX0=1; //外部中断0开关

    IT0=1; //下降沿触发   

    DUAN=1;

    P2=table[0];

    DUAN=0;

    WELA=1;

    P00=0;

    P01=0;

    WELA=0;//先灭掉数码管上的显示(既不显示)

    i=j=numduan=numwei=shi=0;

    led=0;

    

}

void main()

{

    init();

    while(1)//由于不知道外部信号什么时候到了,只能在主函数中不断的刷新数据

    {

         j++;

             if(j==5000)//差不多每5ms刷新一次,既200Hz

        {

            DUAN=1;    //开始刷新数码管的数 ,先送个位数,开第一数码管的位选端

            P2=table[numduan];

            DUAN=0;

            WELA=1;

            P0=tablewei[0];

            WELA=0;

            

        }

        if(j==10000)

        {

            DUAN=1;    //再送十位数,开第二数码管的位选端

            P2=table[shi];

            DUAN=0;

            WELA=1;

            P0=tablewei[1];

            WELA=0;

            j=0;

        }

    }

}

void into0() interrupt 0     //外部中断0,每来一个中断,数码管的数加一

{

    numduan++;

    led=!led;

    if(numduan>=10)

    {

         numduan=0;

        shi++;

        if(shi>=10)

        {

            shi=0;

        }

    }

}

    

如果闪烁的狠明显,可以修改中断中的j==5000j==10000来改变刷新频率。

 

写日记只为给生活留下点回忆,此外,一无是处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值