找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于52单片机控制编码器显示程序

  [复制链接]
跳转到指定楼层
楼主
#include "reg52.h"  
  
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
sbit DIR=P1^0;
sbit STEP=P1^1;
sbit K1=P3^1;
sbit K2=P3^0;
typedef unsigned int u16;   //对数据类型进行声明定义
typedef unsigned char u8;
uchar code digit[ ]={"0123456789"}; //定义字符数组显示数字
uchar idata TEST[]="SPEED";

//电机正反转二维数组 0为逆时针,1为顺时针
uchar code MotorCode[2][8]={{0x04,0x06,0x02,0x0a,0x08,0x09,0x01,0x05},{0x05,0x01,0x09,0x08,0x0a,0x02,0x06,0x04}};
sbit EncoderA=P3^2;    //编码器A相
sbit EncoderB=P3^4;    //编码器B相
uint EncoderCount=0 ;

void delay(u16 i)
{
while(i--);
}
void Lcd1602_Delay1ms(uint c)   //误差 0us
{
        uint a,b;
        for(a=c;a>0;a--)
                for(b=114;b>0;b--);
}
#ifndef  LCD1602_4PINS  //当没有定义这个LCD1602_4PINS时
void LcdWriteCom(uchar com)   //写入命令
{
LCD1602_E = 0;     //使能
LCD1602_RS = 0;    //选择发送命令
LCD1602_RW = 0;    //选择写入

LCD1602_DATAPINS = com;     //放入命令
Lcd1602_Delay1ms(1);  //等待数据稳定
LCD1602_E = 1;           //写入时序
Lcd1602_Delay1ms(5);   //保持时间
LCD1602_E = 0;
}
#else
void LcdWriteCom(uchar com)   //写入命令
{
LCD1602_E = 0;  //使能清零
LCD1602_RS = 0;  //选择写入命令
LCD1602_RW = 0;  //选择写入
LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1;  //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = com << 4; //发送低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1;  //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名         : LcdWriteData
* 函数功能     : 向LCD写入一个字节的数据
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/     
#ifndef  LCD1602_4PINS     
void LcdWriteData(uchar dat)   //写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择输入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //写入数据
Lcd1602_Delay1ms(1);
LCD1602_E = 1;   //写入时序
Lcd1602_Delay1ms(5);   //保持时间
LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat)   //写入数据
{
LCD1602_E = 0;   //使能清零
LCD1602_RS = 1;   //选择写入数据
LCD1602_RW = 0;   //选择写入
LCD1602_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1;   //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = dat << 4; //写入低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1;   //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
#ifndef  LCD1602_4PINS
/*=================================================
*函数名称:LCD1602_Dis_OneChar
*函数功能:在指定位置显示一个字符
*调用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();        
*输入:x:要显示的横坐标取值0-40,y:要显示的行坐标取值0-1(0为第一行,1为第二行)
                dat:需要显示的数据以ASCLL形式显示
=================================================*/
void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat)
{
        if(y)        x |= 0x40;
        x |= 0x80;
        LcdWriteCom(x);
        LcdWriteData(dat);               
}
#endif
/*=================================================
*函数名称:LCD1602_Dis_Str
*函数功能:在指定位置显示字符串
*调用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();
*输入:x:要显示的横坐标取值0-40,y:要显示的行坐标取值0-1(0为第一行,1为第二行)
                *str:需要显示的字符串
=================================================*/
#ifndef  LCD1602_4PINS
void LCD1602_Dis_Str(uchar x, uchar y, uchar *str)
{
        if(y) x |= 0x40;
        x |= 0x80;
        LcdWriteCom(x);
        while(*str != '\0')
        {
                LcdWriteData(*str++);
        }
}
#endif
/*******************************************************************************
* 函 数 名       : LcdInit()
* 函数功能   : 初始化LCD屏
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/     
#ifndef  LCD1602_4PINS
void LcdInit()        //LCD初始化子程序
{
  LcdWriteCom(0x38);  //开显示
LcdWriteCom(0x0c);  //开显示不显示光标
LcdWriteCom(0x06);  //写一个指针加1
LcdWriteCom(0x01);  //清屏
LcdWriteCom(0x80);  //设置数据指针起点
}
#else
void LcdInit()        //LCD初始化子程序
{
LcdWriteCom(0x32);  //将8位总线转为4位总线
LcdWriteCom(0x28);  //在四位线下的初始化
LcdWriteCom(0x0c);  //开显示不显示光标
LcdWriteCom(0x06);  //写一个指针加1
LcdWriteCom(0x01);  //清屏
LcdWriteCom(0x80);  //设置数据指针起点
}
#endif

void keypros1()
{
  if(K1==0)  //检测按键K1是否按下
  {
   delay(1); //消除抖动
   if(K1==0)
   {
     while(1)
     {
    TMOD=0x01;
          TH0=(65535-2000)/256;
          TL0=(65535-2000)%256;
          EA=1;
          ET0=1;
          TR0=1;
         
    DIR=0;
     }
   while(!K1);   
      }   
         }
}


由于内容有限,这只是部分代码,需要完整版,请下载附件

编码器(成功).zip

29.81 KB, 下载次数: 132, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:404419 发表于 2018-11-26 17:40 | 只看该作者
经本人实验,真实有效!!!
回复

使用道具 举报

板凳
ID:1 发表于 2018-11-26 21:49 | 只看该作者
能分享原理图吗?
回复

使用道具 举报

地板
ID:404419 发表于 2018-12-17 09:52 | 只看该作者
程序原理图

QQ截图20181217094801.png (86.73 KB, 下载次数: 30)

原理图

原理图
回复

使用道具 举报

5#
ID:415787 发表于 2019-3-1 16:23 | 只看该作者
学习了
回复

使用道具 举报

6#
ID:482999 发表于 2019-3-1 22:37 | 只看该作者
学习学习
回复

使用道具 举报

7#
ID:516413 发表于 2019-6-26 15:48 | 只看该作者
感谢大神分享
回复

使用道具 举报

8#
ID:585817 发表于 2019-7-18 09:07 | 只看该作者
怎样在程序里面调节电机速度??
回复

使用道具 举报

9#
ID:688122 发表于 2020-2-6 19:20 | 只看该作者
389156621 发表于 2019-7-18 09:07
怎样在程序里面调节电机速度??

同问,我也想实现这个功能
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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