|
10黑幣
在做光電編碼器的項目,通過D觸發(fā)器識別正轉(zhuǎn)和反轉(zhuǎn),分別觸發(fā)外部中斷0和1,此步是實現(xiàn)了的,但是,加入計數(shù)器來計數(shù)輸入脈沖時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; //標(biāo)志位
- unsigned char TempBuffer[16]; //定義一個10位數(shù)組用于存放液晶顯示的數(shù)字
- uint count,counter=0;
- //中斷初始化函數(shù)
- void INT_Init(){
- IT0=1; //設(shè)置下降沿中斷 外部中斷0和1
- IT1=1;
- TMOD=0X05; //T0為16位計數(shù)方式
- IE=0X87; //開中斷
- TH0=0;
- TL0=0; //預(yù)置初值
- }
- //延時函數(shù)
- void DelayMs(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- //中斷處理函數(shù)(3.2) //反計數(shù)
- void service_int0()interrupt 0 using 0
- {
- k--;//標(biāo)志位減l
- TR0=0;//停止計數(shù)
- TH0=-TH0;
- TL0=-TL0;//把計數(shù)器重新復(fù)值,此時相當(dāng)于減
- TR0=1;//開始計數(shù)
- }
- //中斷處理函數(shù)(3.3) //加計數(shù)
- void service_intl()interrupt 2 using 1
- {
- k++;//標(biāo)志位加l
- TR0=0;//停止計數(shù)
- TH0=-TH0;
- TL0=-TL0;//把計數(shù)器重新復(fù)值,此時相當(dāng)于加
- TR0=1;//開始計數(shù)
- }
- void timer0(void) interrupt 1 using 2 //計數(shù)器
- {
- uchar a,b,m,n;
- uint c;
- if(k==0) //反向計數(shù)滿 在這里我假設(shè)旋轉(zhuǎn)一圈的脈沖數(shù)為600,只要超過600就重新計數(shù)
- {
- a=TH0;
- b=TL0;
- a=TH0<<8;
- c=a|b;
- counter=1001011000-c; //600-當(dāng)前值,即減法
- if(counter<0)
- {
- TH0=0;
- TL0=0;
- }
- }
- if(k==1) //正向計數(shù)滿
- {
- m=TH0;
- n=TL0;
- m=m<<8;
- counter=m|n;
- if(counter>600)
- {
- TH0=0;
- TL0=0;
- }
- }
- }
-
- void main(){
- DelayMs(255);//等待電源穩(wěn)定,液晶復(fù)位完成
- LCD_Initial(); //初始化液晶
- INT_Init();
- GotoXY(0,0); //定義顯示行(第一行)
- Print(" BIAN MA QI"); //顯示的內(nèi)容
- GotoXY(0,1); //定義顯示行(第二行)
- Print(" Q"); //顯示的內(nèi)容
- while(1)
- {
- EA=0;
- count=counter;
- sprintf(TempBuffer,"%d",count); //數(shù)據(jù)轉(zhuǎn)換為數(shù)組TempBuffer,"%10表示數(shù)組長度為10位
- GotoXY(0,1); //定義顯示行(第二行)
- Print(&TempBuffer[0]); //從第一個數(shù)值開始顯示
- EA=1;
- }
- }
復(fù)制代碼
|
|