找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8565|回復: 3
打印 上一主題 下一主題
收起左側

單片機INT0外部中斷脈沖計數Proteus仿真+源程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:469990 發(fā)表于 2019-3-10 18:47 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
主要是用單片機 INT0中斷進行脈沖計數
脈沖是由Clock元器件產生。
INT0外部中斷輸入脈沖。


設置舉例,設置高低高時鐘,頻率為10,則設置第一個邊沿出現時間為1.1。
INT0是低電平觸發(fā),設置出現時間為1.1剛好每秒增加數為10,并且每次都是10的倍數。


開關型霍爾元器件剛好是低電平,可以直接使用。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  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;//設置成下降沿觸發(fā)方式
  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. }
復制代碼

所有資料51hei提供下載:
脈沖計數-20190310183300.zip (20.7 KB, 下載次數: 145)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:513813 發(fā)表于 2019-5-2 13:52 | 只看該作者
請問下,周期變化的脈沖可以直接按這種方法用單片機采集嗎
回復

使用道具 舉報

板凳
ID:24486 發(fā)表于 2020-2-22 22:18 | 只看該作者
謝謝分享,學習學習。
回復

使用道具 舉報

地板
ID:640334 發(fā)表于 2020-7-28 00:06 | 只看該作者
支持樓組的付出
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表