今天再接再厉把昨天的程序来完善,由于心理测试仪需要采集外部脉冲来计数,那么就必须用到外部中断来计数,然后送数码管显示,昨天贪方便先用内部计时中断,好,今天自己添一个方波到单片机的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};// 共阳:0到9
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==5000和j==10000来改变刷新频率。
写日记只为给生活留下点回忆,此外,一无是处。