找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1977|回复: 1
打印 上一主题 下一主题
收起左侧

52单片机的光电编码计数问题

[复制链接]
跳转到指定楼层
楼主
ID:278851 发表于 2018-5-11 15:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
10黑币
在做光电编码器的项目,通过D触发器识别正转和反转,分别触发外部中断0和1,此步是实现了的,但是,加入计数器来计数输入脉冲时LCD一直显示为0,请大神们帮忙看看我哪儿写错了哦
  1. #include <reg51.h>
  2. #include<intrins.h>
  3. #include<LCD1602.h>
  4. #include "stdio.h"                                 //定义浮点运算模块
  5. #define uint unsigned int
  6. #define uchar unsigned char  
  7. int data k=1;  //标志位
  8. unsigned char TempBuffer[16];        //定义一个10位数组用于存放液晶显示的数字
  9. uint count,counter=0;
  10. //中断初始化函数
  11. void INT_Init(){
  12.     IT0=1; //设置下降沿中断         外部中断0和1
  13.         IT1=1;
  14.         TMOD=0X05; //T0为16位计数方式
  15.         IE=0X87;   //开中断
  16.         TH0=0;
  17.         TL0=0;           //预置初值
  18. }
  19. //延时函数
  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. //中断处理函数(3.2)  //反计数
  27. void service_int0()interrupt 0 using 0
  28. {
  29.         k--;//标志位减l
  30.         TR0=0;//停止计数
  31.         TH0=-TH0;
  32.         TL0=-TL0;//把计数器重新复值,此时相当于减
  33.         TR0=1;//开始计数               
  34. }
  35. //中断处理函数(3.3)          //加计数
  36. void service_intl()interrupt 2 using 1
  37. {
  38.         k++;//标志位加l
  39.         TR0=0;//停止计数
  40.         TH0=-TH0;
  41.         TL0=-TL0;//把计数器重新复值,此时相当于加
  42.     TR0=1;//开始计数               
  43. }
  44. void timer0(void) interrupt 1 using 2        //计数器
  45. {
  46.         uchar a,b,m,n;                        
  47.         uint c;
  48.         if(k==0)          //反向计数满                   在这里我假设旋转一圈的脉冲数为600,只要超过600就重新计数
  49.         {                        
  50.                 a=TH0;
  51.                 b=TL0;
  52.                 a=TH0<<8;
  53.                 c=a|b;
  54.                 counter=1001011000-c;  //600-当前值,即减法
  55.                 if(counter<0)
  56.                 {        
  57.                         TH0=0;
  58.                         TL0=0;
  59.                 }        
  60.         }
  61.         if(k==1)                 //正向计数满
  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);//等待电源稳定,液晶复位完成
  76.         LCD_Initial();        //初始化液晶
  77.         INT_Init();        
  78.         GotoXY(0,0);        //定义显示行(第一行)
  79.         Print(" BIAN MA QI");         //显示的内容
  80.         GotoXY(0,1);                                 //定义显示行(第二行)
  81.         Print("              Q");         //显示的内容        
  82.            while(1)
  83.         {
  84.                 EA=0;                        
  85.                 count=counter;
  86.                    sprintf(TempBuffer,"%d",count); //数据转换为数组TempBuffer,"%10表示数组长度为10位
  87.                 GotoXY(0,1);                          //定义显示行(第二行)
  88.                 Print(&TempBuffer[0]);           //从第一个数值开始显示
  89.                 EA=1;
  90.         }
  91. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:278851 发表于 2018-5-11 16:01 | 只看该作者
我的矩形脉冲接到T0口来触发计数的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表