在做光電編碼器的項目,通過D觸發器識別正轉和反轉,分別觸發外部中斷0和1,此步是實現了的,但是,加入計數器來計數輸入脈沖時LCD一直顯示為0,請大神們幫忙看看我哪兒寫錯了哦
- #include <reg51.h>
- #include<intrins.h>
- #include<LCD1602.h>
- #include "stdio.h" //定義浮點運算模塊
- #define uint unsigned int
- #define uchar unsigned char
- int data k=1; //標志位
- unsigned char TempBuffer[16]; //定義一個10位數組用于存放液晶顯示的數字
- uint count,counter=0;
- //中斷初始化函數
- void INT_Init(){
- IT0=1; //設置下降沿中斷 外部中斷0和1
- IT1=1;
- TMOD=0X05; //T0為16位計數方式
- IE=0X87; //開中斷
- TH0=0;
- TL0=0; //預置初值
- }
- //延時函數
- void DelayMs(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- //中斷處理函數(3.2) //反計數
- void service_int0()interrupt 0 using 0
- {
- k--;//標志位減l
- TR0=0;//停止計數
- TH0=-TH0;
- TL0=-TL0;//把計數器重新復值,此時相當于減
- TR0=1;//開始計數
- }
- //中斷處理函數(3.3) //加計數
- void service_intl()interrupt 2 using 1
- {
- k++;//標志位加l
- TR0=0;//停止計數
- TH0=-TH0;
- TL0=-TL0;//把計數器重新復值,此時相當于加
- TR0=1;//開始計數
- }
- void timer0(void) interrupt 1 using 2 //計數器
- {
- uchar a,b,m,n;
- uint c;
- if(k==0) //反向計數滿 在這里我假設旋轉一圈的脈沖數為600,只要超過600就重新計數
- {
- a=TH0;
- b=TL0;
- a=TH0<<8;
- c=a|b;
- counter=1001011000-c; //600-當前值,即減法
- if(counter<0)
- {
- TH0=0;
- TL0=0;
- }
- }
- if(k==1) //正向計數滿
- {
- m=TH0;
- n=TL0;
- m=m<<8;
- counter=m|n;
- if(counter>600)
- {
- TH0=0;
- TL0=0;
- }
- }
- }
-
- void main(){
- DelayMs(255);//等待電源穩定,液晶復位完成
- LCD_Initial(); //初始化液晶
- INT_Init();
- GotoXY(0,0); //定義顯示行(第一行)
- Print(" BIAN MA QI"); //顯示的內容
- GotoXY(0,1); //定義顯示行(第二行)
- Print(" Q"); //顯示的內容
- while(1)
- {
- EA=0;
- count=counter;
- sprintf(TempBuffer,"%d",count); //數據轉換為數組TempBuffer,"%10表示數組長度為10位
- GotoXY(0,1); //定義顯示行(第二行)
- Print(&TempBuffer[0]); //從第一個數值開始顯示
- EA=1;
- }
- }
復制代碼
|