标题:
52单片机的光电编码计数问题
[打印本页]
作者:
heyang619834109
时间:
2018-5-11 15:54
标题:
52单片机的光电编码计数问题
在做光电编码器的项目,通过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;
}
}
复制代码
作者:
heyang619834109
时间:
2018-5-11 16:01
我的矩形脉冲接到T0口来触发计数的
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1