在做光电编码器的项目,通过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;
- }
- }
复制代码
|