主要是用单片机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++;
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』