主要是用单片机 INT0 的中断进行脉冲计数
脉冲是由Clock元器件产生。
INT0外部中断输入脉冲。
设置举例,设置高低高时钟,频率为10,则设置第一个边沿出现时间为1.1。
INT0是低电平触发,设置出现时间为1.1刚好每秒增加数为10,并且每次都是10的倍数。
开关型霍尔元器件刚好是低电平,可以直接使用。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- // 脉冲计数
- // INT0中断计数
- #include <reg51.h>
- 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++;
- }
复制代码
所有资料51hei提供下载:
脉冲计数-20190310183300.zip
(20.7 KB, 下载次数: 145)
|