单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

写了一个LCD1602显示电机转速的程序,电机是转一下,停一下,LCD显示乱码,请问是...

[复制链接]
跳转到指定楼层
楼主
北亮亮 发表于 2019-7-14 17:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

//********************************************
问题:电机是转一下,停一下,LCD显示乱码,请问是怎么回事?
写了一个LCD1602显示电机转速的程序,驱动使用TB6560
/********************************************/
/********************************************
//51单片机通过TB6560驱动器控制两相步进电机正转、反转程序
//单片机:STC89C52RC系列
//驱动器:TB6560
//步进电机:两相J-4218HB1401步进电机
CLK=1时电机运行,CLK=0时停止
CW=0时正转,CW=1时反转
EN=0时工作,EN=1停止
**********************************************/
#include<reg52.h>
/********************************************/
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P2^7;     //使能端
sbit lcdrs=P2^6;         //数据命令选择端
sbit rw=P2^5;
uchar code table[]=" Zhuan Su:";  //输入的字符
uchar table1[]=0;  //输入的字符
uchar num=0;

//********************************************
//端口定义
sbit CLK=P1^0;        //脉冲
sbit ENA=P1^1;        //使能
sbit DIR=P1^2;        //转向
//按键定义
sbit CW=P3^0;         //正传运行按键
sbit STOP=P3^1;       //停止运行按键
sbit CCW=P3^2;        //反转运行按键
sbit ADJ1=P3^3;       //调速运行按键
sbit ADJ2=P3^4;
sbit Led1=P0^0;
sbit Led2=P0^1;
bit Run_Status;
unsigned char Run_Dir;
#define F_DIR 0;        //正转
#define B_DIR 1;        //反转
uint CYCLE,speed;
/********************************************/
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}

void write_com(uchar com)//根据写时序图写出指令程序
{
        lcdrs=0;
        rw=0;
        P0=com;
        delay(50);
        lcden=1;
        delay(50);
        lcden=0;
}

void write_data(uchar date)//根据写时序图写出数据程序
{
        lcdrs=1;
        rw=0;
        P0=date;
        delay(50);
        lcden=1;
        delay(50);
        lcden=0;
}
void init()
{
        lcden=0; //使能端为低电平
        write_com(0x38);
        /*显示模式设置  00111000  设置16*2显示  5*7点阵  8位数据接口*/
        write_com(0x0f);
        /*显示开关及光标设置   00001DCB
        D=1,开显示     D=0, 关显示
        C=1,显示光标   C=0,不显示光标
        B=1,光标闪烁   B=0,光标不闪烁*/
        //write_com(0x06);//地址指针自动+1且光标+1,写字符屏幕不会移动
        write_com(0X01);
        write_com(0X80);
       
        for(num=0;num<10;num++)    //输入的字符数量,修改
        {
        write_data(table[num]);
        delay(0);
        }
}
/*********************************************/

//延时函数
void Delay_ms(unsigned char ms)
{
        unsigned char i;
        for(;ms>0;ms--)
        {
            for(i=0;i<125;i++);
        }
}
//定时中断              
void timer0_ISR(void) interrupt 1 using 1
     {
         TH0=(65536-CYCLE)/256;
         TL0=(65536-CYCLE)%256;
         CLK=~CLK;
      }
uint zhuan(){
        Run_Status=0;
        CLK=0;
        ENA=0;

        while(1)
        {

                                                                       



                if(!STOP)
                {
                        Delay_ms(1000);
                        if(!STOP)
                        {
                                Run_Status=0;
                                 CLK=0;
                                 ENA=0;
                                 TR0=0;
             Led1=1;
             Led2=1;
                        }
                }
                if(!CW&&!Run_Status)
                {
                        Delay_ms(1000);
                        if(!CW&&!Run_Status)
                        {
                                Run_Status=1;
                                DIR=0;
                                ENA=1;
                                CYCLE=2500;
                                TMOD|=0X01;
                                TH0=(65536-CYCLE)/256;
                                TL0=(65536-CYCLE)%256;
                                IE=0X82;
                                TR0=1;
                                Run_Dir=F_DIR;
            Led1=0;
                        }
                }
                if(!CCW&&!Run_Status)
                {
                        Delay_ms(1000);
                        if(!CCW&&!Run_Status)
                        {
                                Run_Status=1;
                                DIR=0;
                                ENA=1;
                                CYCLE=2500;
                                TMOD|=0X01;
                                TH0=(65536-CYCLE)/256;
                                TL0=(65536-CYCLE)%256;
                                IE=0X82;
                                TR0=1;
                                Run_Dir=B_DIR;
            Led2=0;
                        }
                }
                if(!ADJ1)
                {
                        Delay_ms(1000);        
                        if(!ADJ1)
                        {
                                if(CYCLE<20000)CYCLE+=2000;
                                else CYCLE=1000;
                                Run_Status=1;
                                TR0=1;
                        }
                }
                 return CYCLE;
                }
               
}

void main()
{

                while(1){
                zhuan();
                delay(20);
                speed = zhuan();
                delay(20);

                init();
                 
                delay(10);
                table1[1]   = (uint)((speed/1000+0x38));
                table1[2]        = (uint)((speed/100+0x38));
                table1[3]        = (uint)((speed/10+0x38));
                table1[4]        = (uint)((speed+0x38));
               
                /********************************************/
                delay(10);
                write_com(0X80+0x40);
                for(num=0;num<4;num++)    //输入的字符数量,修改
                {
                write_data(table1[num]);
                delay(50);
                }
                }                                                                                                                       
}               
                                                                                                                                       
                                                                       
                                                       

HC6800-ES V2.0开发板原理图.pdf

768.59 KB, 下载次数: 1

Tb6560步进电机驱动板.zip

94.66 KB, 下载次数: 1

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

使用道具 举报

沙发
一泓秋 发表于 2019-7-15 17:08 | 只看该作者
这种情况一般都是引脚复用冲突
回复

使用道具 举报

板凳
一泓秋 发表于 2019-7-15 17:09 | 只看该作者
电机不要直接接单片机引脚,建议加外围电路或者驱动模块
回复

使用道具 举报

地板
yzwzfyz 发表于 2019-7-16 10:08 | 只看该作者
是硬件问题。
回复

使用道具 举报

5#
@不死鸟 发表于 2019-7-16 10:38 | 只看该作者
看一下你的LCD使用的是P0口还是P1口,
和以下引脚使用是否冲突了,冲突的话就把定义的引脚改一下
sbit CLK=P1^0;        //脉冲
sbit ENA=P1^1;        //使能
sbit DIR=P1^2;        //转向
sbit Led1=P0^0;
sbit Led2=P0^1;
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

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