找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2458|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

52單片機的光電編碼計數(shù)問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:278851 發(fā)表于 2018-5-11 15:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
10黑幣
在做光電編碼器的項目,通過D觸發(fā)器識別正轉(zhuǎn)和反轉(zhuǎn),分別觸發(fā)外部中斷0和1,此步是實現(xiàn)了的,但是,加入計數(shù)器來計數(shù)輸入脈沖時LCD一直顯示為0,請大神們幫忙看看我哪兒寫錯了哦
  1. #include <reg51.h>
  2. #include<intrins.h>
  3. #include<LCD1602.h>
  4. #include "stdio.h"                                 //定義浮點運算模塊
  5. #define uint unsigned int
  6. #define uchar unsigned char  
  7. int data k=1;  //標(biāo)志位
  8. unsigned char TempBuffer[16];        //定義一個10位數(shù)組用于存放液晶顯示的數(shù)字
  9. uint count,counter=0;
  10. //中斷初始化函數(shù)
  11. void INT_Init(){
  12.     IT0=1; //設(shè)置下降沿中斷         外部中斷0和1
  13.         IT1=1;
  14.         TMOD=0X05; //T0為16位計數(shù)方式
  15.         IE=0X87;   //開中斷
  16.         TH0=0;
  17.         TL0=0;           //預(yù)置初值
  18. }
  19. //延時函數(shù)
  20. void DelayMs(uint z)
  21. {
  22.         uint x,y;
  23.         for(x=z;x>0;x--)
  24.                 for(y=110;y>0;y--);               
  25. }
  26. //中斷處理函數(shù)(3.2)  //反計數(shù)
  27. void service_int0()interrupt 0 using 0
  28. {
  29.         k--;//標(biāo)志位減l
  30.         TR0=0;//停止計數(shù)
  31.         TH0=-TH0;
  32.         TL0=-TL0;//把計數(shù)器重新復(fù)值,此時相當(dāng)于減
  33.         TR0=1;//開始計數(shù)               
  34. }
  35. //中斷處理函數(shù)(3.3)          //加計數(shù)
  36. void service_intl()interrupt 2 using 1
  37. {
  38.         k++;//標(biāo)志位加l
  39.         TR0=0;//停止計數(shù)
  40.         TH0=-TH0;
  41.         TL0=-TL0;//把計數(shù)器重新復(fù)值,此時相當(dāng)于加
  42.     TR0=1;//開始計數(shù)               
  43. }
  44. void timer0(void) interrupt 1 using 2        //計數(shù)器
  45. {
  46.         uchar a,b,m,n;                        
  47.         uint c;
  48.         if(k==0)          //反向計數(shù)滿                   在這里我假設(shè)旋轉(zhuǎn)一圈的脈沖數(shù)為600,只要超過600就重新計數(shù)
  49.         {                        
  50.                 a=TH0;
  51.                 b=TL0;
  52.                 a=TH0<<8;
  53.                 c=a|b;
  54.                 counter=1001011000-c;  //600-當(dāng)前值,即減法
  55.                 if(counter<0)
  56.                 {        
  57.                         TH0=0;
  58.                         TL0=0;
  59.                 }        
  60.         }
  61.         if(k==1)                 //正向計數(shù)滿
  62.         {                        
  63.                 m=TH0;
  64.                 n=TL0;
  65.                 m=m<<8;
  66.                 counter=m|n;
  67.                 if(counter>600)
  68.                 {
  69.                         TH0=0;
  70.                         TL0=0;
  71.                 }
  72.         }
  73. }

  74. void main(){

  75.         DelayMs(255);//等待電源穩(wěn)定,液晶復(fù)位完成
  76.         LCD_Initial();        //初始化液晶
  77.         INT_Init();        
  78.         GotoXY(0,0);        //定義顯示行(第一行)
  79.         Print(" BIAN MA QI");         //顯示的內(nèi)容
  80.         GotoXY(0,1);                                 //定義顯示行(第二行)
  81.         Print("              Q");         //顯示的內(nèi)容        
  82.            while(1)
  83.         {
  84.                 EA=0;                        
  85.                 count=counter;
  86.                    sprintf(TempBuffer,"%d",count); //數(shù)據(jù)轉(zhuǎn)換為數(shù)組TempBuffer,"%10表示數(shù)組長度為10位
  87.                 GotoXY(0,1);                          //定義顯示行(第二行)
  88.                 Print(&TempBuffer[0]);           //從第一個數(shù)值開始顯示
  89.                 EA=1;
  90.         }
  91. }
復(fù)制代碼


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

使用道具 舉報

沙發(fā)
ID:278851 發(fā)表于 2018-5-11 16:01 | 只看該作者
我的矩形脈沖接到T0口來觸發(fā)計數(shù)的
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表