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

2020-02-08来源: 51hei关键字: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 != '')

        {

                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);   

      }    

         }

}


关键字:52单片机控制  编码器  显示程序 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic487578.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:单片机步进电机转速控制程序(速度LED显示)
下一篇:单片机硬件电路设计的七个原则分享

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

基于AT89S52单片机控制的高精度数控直流电流源
在现代科学研究和工业生产中,精度高、稳定性好的数控直流电流源得到了十分广泛的应用。以往所采用的电流源多数是利用电位器进行调节,输出电流值无法实现精准步进。有些电流源虽能够实现数控但是往往输出的电流值过小,且所设定的输出电流值是否准确不经测试无法确定,不够直观。为此,结合单片机技术及V/I变换电路,利用闭环反馈调整控制原理设计制作了一种新型的基于单片机控制的高精度数控直流电流源。本系统以AT89S52单片机为控制器,通过人机接口(按键和LCD显示屏)来设置输出电流,设置步进等级1 mA,并可同时显示预设电流值和实际输出电流值。本系统由按键设置输出电流值,经单片机计算后通过D/A转换器(TLV5618)输出模拟信号,再经过V/I转换
发表于 2020-06-10
基于AT89S<font color='red'>52单片机控制</font>的高精度数控直流电流源
AT89C52单片机控制BH1415F调频台C程序
BH1415F调频台控制C程序 使用keil C51 通过调试 //使用AT89C52单片机,12MHz晶振,用共阳四位LED数码管 //P0口输出段码,P2口扫描 //#pragma SRC(d:\aa.asm) #include "reg52.h" #include "intrins.h"     //_nop_();延时函数用 #define  Disdata    P0
发表于 2018-01-07
利用STC89C52单片机控制LCD1602(不带中文字库)显示的中文
一、设计原理 使用STC89C52单片机控制1602LCD(不带中文字库的);利用1602LCD(不带中文字库的)中的存储器(64个字节00H-3FH)自建立8个5×8点阵的字符从而显示中文字符。     二、LCD1602的指令集: 1、清屏 RS    R/W DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0
发表于 2016-08-17
绝对值编码器数据接收的问题
实验环境:STM32F407,KEIL5,绝对值式编码器程序目的:将串口接收到的编码器的数据存到数组RecBufEncode中,Count计数,ch是编码器通过串口返回的数据,编码器设置的是自动发送数据。如果存入数据满足13位,进入while中执行后续操作 #define LEN 13 //定义接收一条指令的长度 绝对式编码器的返回值 RecBufEncode[Count++]=ch; Count %= LEN; while(0 == Count)   {    ...//后续操作 }上诉方式实现不了目的。实验结果:只能读取每次上次后获取的第一个数据,在转动编码器后,数据存在但数值不变
发表于 2020-06-29
STM32伺服编码器接口
在STM32的高级定时器和一般定时器中有Encoder interface mode(编码器接口),TI1和TI2分别对应TIM_CH1 和TIM_CH2 通道。一、计数规则如下:表55的是编码器不同的信号下计数方向。1.仅在TI1边沿计数:上升沿触发时,若对应TI2为低电平,则计数器向下计数;对应为高电平,则向上计数。如图2.在○1和○2处,TI1的上升沿对应TI2为低电平,所以计数器向上计数;同样的,在○3处则相反。2.在TI1和TI2边沿计数:若TI1、TI2上升沿捕捉时,TI1上升边沿对应TI2位于低电平,则向上计数;TI2上升边沿对应TI1高电平,向上计数,所以为双倍。二、功能配置1.设置I/O口(启动时钟,工作在定时器
发表于 2020-06-29
STM32伺服<font color='red'>编码器</font>接口
如何在小空间内实现大马力?
动系统全面升级。一般而言,电机并非是“孤胆英雄”,绝大多数情况下需要与减速箱及编码器结合进行减速。为了确保组件之间完美匹配,并最大限度地降低安装要求,建议从同一来源获取一个包含各组件的完整解决方案。即便在安装空间极其有限、因此造成高扭矩驱动需要尽量缩短的情况下,仍然存在特别适合机器人、假肢关节、实验室自动化设备、泵、医疗技术或飞机机舱设备的实践性方案。   图: 强大而紧凑的驱动系统适用于机器人、人工关节、实验室自动化设备、泵、医疗技术或飞机机舱设备。(版权所有:Schunk, FAULHABER)驱动专家 FAULHABER 再次展现了其作为系统供应商的能力,并通过添加相应的减速箱和集成编码器
发表于 2020-05-14
如何在小空间内实现大马力?
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved