×
单片机 > 单片机程序设计 > 详情

单片机INT0外部中断脉冲计数

发布时间:2024-05-12 发布时间:
|

主要是用单片机INT0的中断进行脉冲计数
脉冲是由Clock元器件产生。
INT0外部中断输入脉冲。

设置举例,设置高低高时钟,频率为10,则设置第一个边沿出现时间为1.1。
INT0是低电平触发,设置出现时间为1.1刚好每秒增加数为10,并且每次都是10的倍数。

开关型霍尔元器件刚好是低电平,可以直接使用。

仿真原理图如下

单片机源程序如下:

// 脉冲计数

// INT0中断计数

#include


sbit P2_0 = P2^0;//数码管选定位

sbit P2_1 = P2^1;//数码管选定位

sbit P2_2 = P2^2;//数码管选定位

sbit P2_3 = P2^3;//数码管选定位


//共阳极数码管

unsigned char code table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};


unsigned int motorspeed = 0;

unsigned char GE, SHI, BAI, QIAN;

unsigned int counter = 0;//脉冲数

unsigned int calsp;//设定多长时间计数一次


void display();//数码管显示

void delay();//延迟函数

void calspeed();


void main()

{

EA = 1;//开启总中断

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

IT0 = 1;//设置成下降沿触发方式

TMOD = 0x01;//设置定时器0为模式1,即16位计数模式

TH0 = (65536-10000)/256;//计数时间为10ms

TL0 = (65536-10000)%256;


ET0 = 1;//开启定时器0中断

TR0 = 1;//启动定时器0


P2 = P2&0xf0;//将P2的1~4置1


while(1)

{

display();

calspeed();

}


return ;

}


void calspeed()

{

if (calsp == 100)//100*10=1s计算1次

{

motorspeed = motorspeed + counter;

counter = 0;//清零脉冲数

calsp = 0;//清零标志

}

}


//数码管显示函数,依次点亮数码管

void display()

{

GE = motorspeed%10;

SHI = motorspeed/10%10;

BAI = motorspeed/100%10;

QIAN = motorspeed/1000%10;


P2_0 = 1;

P0 = table[QIAN];

delay();

P2_0 = 0;


P2_1 = 1;

P0 = table[BAI];

delay();

P2_1 = 0;


P2_2 = 1;

P0 = table[SHI];

delay();

P2_2 = 0;


P2_3 = 1;

P0 = table[GE];

delay();

P2_3 = 0;

}


//延迟函数

void delay()

{

unsigned char i = 10;

while(i--)

;

}


void _TIMER0() interrupt 1

{

TH0 = (65536-10000)/256;//重新装入初值,计数时间为10ms

TL0 = (65536-10000)%256;

calsp++;

}


//INT0输入

void _INT0() interrupt 0

{

counter++;

}




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
stm32 总线矩阵介绍