標(biāo)題: 52單片機(jī)的光電編碼計(jì)數(shù)問題 [打印本頁]

作者: heyang619834109    時(shí)間: 2018-5-11 15:54
標(biāo)題: 52單片機(jī)的光電編碼計(jì)數(shù)問題
在做光電編碼器的項(xiàng)目,通過D觸發(fā)器識別正轉(zhuǎn)和反轉(zhuǎn),分別觸發(fā)外部中斷0和1,此步是實(shí)現(xiàn)了的,但是,加入計(jì)數(shù)器來計(jì)數(shù)輸入脈沖時(shí)LCD一直顯示為0,請大神們幫忙看看我哪兒寫錯(cuò)了哦
  1. #include <reg51.h>
  2. #include<intrins.h>
  3. #include<LCD1602.h>
  4. #include "stdio.h"                                 //定義浮點(diǎn)運(yùn)算模塊
  5. #define uint unsigned int
  6. #define uchar unsigned char  
  7. int data k=1;  //標(biāo)志位
  8. unsigned char TempBuffer[16];        //定義一個(gè)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位計(jì)數(shù)方式
  15.         IE=0X87;   //開中斷
  16.         TH0=0;
  17.         TL0=0;           //預(yù)置初值
  18. }
  19. //延時(shí)函數(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)  //反計(jì)數(shù)
  27. void service_int0()interrupt 0 using 0
  28. {
  29.         k--;//標(biāo)志位減l
  30.         TR0=0;//停止計(jì)數(shù)
  31.         TH0=-TH0;
  32.         TL0=-TL0;//把計(jì)數(shù)器重新復(fù)值,此時(shí)相當(dāng)于減
  33.         TR0=1;//開始計(jì)數(shù)               
  34. }
  35. //中斷處理函數(shù)(3.3)          //加計(jì)數(shù)
  36. void service_intl()interrupt 2 using 1
  37. {
  38.         k++;//標(biāo)志位加l
  39.         TR0=0;//停止計(jì)數(shù)
  40.         TH0=-TH0;
  41.         TL0=-TL0;//把計(jì)數(shù)器重新復(fù)值,此時(shí)相當(dāng)于加
  42.     TR0=1;//開始計(jì)數(shù)               
  43. }
  44. void timer0(void) interrupt 1 using 2        //計(jì)數(shù)器
  45. {
  46.         uchar a,b,m,n;                        
  47.         uint c;
  48.         if(k==0)          //反向計(jì)數(shù)滿                   在這里我假設(shè)旋轉(zhuǎn)一圈的脈沖數(shù)為600,只要超過600就重新計(jì)數(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)                 //正向計(jì)數(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]);           //從第一個(gè)數(shù)值開始顯示
  89.                 EA=1;
  90.         }
  91. }
復(fù)制代碼



作者: heyang619834109    時(shí)間: 2018-5-11 16:01
我的矩形脈沖接到T0口來觸發(fā)計(jì)數(shù)的




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1