找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7577|回复: 3
收起左侧

单片机INT0外部中断脉冲计数Proteus仿真+源程序

  [复制链接]
ID:469990 发表于 2019-3-10 18:47 | 显示全部楼层 |阅读模式
主要是用单片机 INT0中断进行脉冲计数
脉冲是由Clock元器件产生。
INT0外部中断输入脉冲。


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


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

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

单片机源程序如下:
  1. // 脉冲计数
  2. // INT0中断计数
  3. #include <reg51.h>

  4. sbit P2_0 = P2^0;//数码管选定位
  5. sbit P2_1 = P2^1;//数码管选定位
  6. sbit P2_2 = P2^2;//数码管选定位
  7. sbit P2_3 = P2^3;//数码管选定位

  8. //共阳极数码管
  9. unsigned char code table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};

  10. unsigned int motorspeed = 0;
  11. unsigned char GE, SHI, BAI, QIAN;
  12. unsigned int counter = 0;//脉冲数
  13. unsigned int calsp;//设定多长时间计数一次

  14. void display();//数码管显示
  15. void delay();//延迟函数
  16. void calspeed();

  17. void main()
  18. {
  19.         EA = 1;//开启总中断
  20.         EX0 = 1;//开启外部中断0
  21.         IT0 = 1;//设置成下降沿触发方式
  22.         TMOD = 0x01;//设置定时器0为模式1,即16位计数模式
  23.         TH0 = (65536-10000)/256;//计数时间为10ms
  24.         TL0 = (65536-10000)%256;

  25.         ET0 = 1;//开启定时器0中断
  26.         TR0 = 1;//启动定时器0

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

  28.         while(1)
  29.         {
  30.                 display();
  31.                 calspeed();
  32.         }

  33.         return ;
  34. }

  35. void calspeed()
  36. {
  37.         if (calsp == 100)//100*10=1s计算1次
  38.         {
  39.                 motorspeed = motorspeed + counter;
  40.                 counter = 0;//清零脉冲数
  41.                 calsp = 0;//清零标志
  42.         }
  43. }

  44. //数码管显示函数,依次点亮数码管
  45. void display()
  46. {
  47.         GE = motorspeed%10;
  48.         SHI = motorspeed/10%10;
  49.         BAI = motorspeed/100%10;
  50.         QIAN = motorspeed/1000%10;

  51.         P2_0 = 1;
  52.         P0 = table[QIAN];
  53.         delay();
  54.         P2_0 = 0;

  55.         P2_1 = 1;
  56.         P0 = table[BAI];
  57.         delay();
  58.         P2_1 = 0;

  59.         P2_2 = 1;
  60.         P0 = table[SHI];
  61.         delay();
  62.         P2_2 = 0;

  63.         P2_3 = 1;
  64.         P0 = table[GE];
  65.         delay();
  66.         P2_3 = 0;
  67. }

  68. //延迟函数
  69. void delay()
  70. {
  71.         unsigned char i = 10;
  72.         while(i--)
  73.                 ;
  74. }

  75. void _TIMER0() interrupt 1
  76. {
  77.         TH0 = (65536-10000)/256;//重新装入初值,计数时间为10ms
  78.         TL0 = (65536-10000)%256;
  79.         calsp++;
  80. }

  81. //INT0输入
  82. void _INT0() interrupt 0
  83. {
  84.         counter++;
  85. }
复制代码
0.png
所有资料51hei提供下载:
脉冲计数-20190310183300.zip (20.7 KB, 下载次数: 145)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:513813 发表于 2019-5-2 13:52 | 显示全部楼层
请问下,周期变化的脉冲可以直接按这种方法用单片机采集吗
回复

使用道具 举报

ID:24486 发表于 2020-2-22 22:18 | 显示全部楼层
谢谢分享,学习学习。
回复

使用道具 举报

ID:640334 发表于 2020-7-28 00:06 | 显示全部楼层
支持楼组的付出
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表