找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机,按键控制电动机+1602显示

[复制链接]
跳转到指定楼层
楼主
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define CWD Moto1=1;Moto2=0
#define CCWD Moto1=0;Moto2=1
#define stop Moto1=1;Moto2=1
#define LcdData P0

sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit FuncKey=P1^2; //
sbit IncKey=P1^0;//
sbit DecKey=P1^1; //
sbit Moto1=P2^3; //
sbit Moto2=P2^4;

bit MotoStatus;
bit PulseStatus;//PWM

unsigned char NumChange;  
unsigned char HPulseNum; //
unsigned char LPulseNum; //

void Delayms(unsigned int xms);  //ms
void KeyScan(void);//按键检测
void WriteLcd(unsigned char Dat,bit x); //1602LCD
void InitLCD(void);  //初始化1602函数
void InitInt05T0(void);  //初始化定时器中断T0
void StatusLCD(void);

unsigned char FirstLine[15]={"MotoStatus: CWD"};//1602LCD显示
unsigned char SecondLine[8]={"H/L:  0%"};

void Delayms(unsigned int xms)
{
        unsigned int i,j;
        for(i=xms; i>0; i--)
                for(j=110; j>0; j--);
}

void WriteLcd(uchar Dat,bit x)//写指令x=0,写数据x=1
{
        E=0;
        LcdData=Dat;
        RS=x;
        RW=0;
        E=1;
        Delayms(1);
        E=0;
}

void InitLcd(void)
{
        WriteLcd(0x38,0);//功能开关(38H)
        WriteLcd(0x0C,0);//显示开关(0CH)
        WriteLcd(0x06,0);//输入模式(06H)
        WriteLcd(0x01,0);//清除显示(01H)
        WriteLcd(0x02,0);//光标返回指令(02H or 03H)
}
void StatusLCD(void)
{
        if(!MotoStatus)  //˳顺时针CWD
        {        
                FirstLine[11]=' ';
                FirstLine[12]='C';
                FirstLine[13]='W';
                FirstLine[14]='D';
        }
        else//逆时针
        {
          FirstLine[11]='C';
                FirstLine[12]='C';
                FirstLine[13]='W';
                FirstLine[14]='D';
        }
                if(NumChange<100)
                SecondLine[4]= ' ';
                else    //取占空比百位转换ASCLL码
                SecondLine[4]=NumChange/100+0x30;
        if(NumChange<10)
                SecondLine[5]= ' ';
                else  //取占空比十位转换ASCLL码
                SecondLine[5]=NumChange%100/10+0x30;
                SecondLine[6]=NumChange%10+0x30;
}




void         InitInt0T0( void)
{       
                TMOD=0X02;
                EA=1;
                EX0=1;
                ET0=1;
                PX0=1;
                PT0=0;
                IT0=1;
                TH0=6;
                TL0=6;
                TR0=1;
}

void KeyScan(void)
{
        if(!FuncKey)
        {
                Delayms(10);
                if(!FuncKey)
                {
                        while(!FuncKey);
                        MotoStatus=~MotoStatus;
                }
        }
        if(!IncKey)
        {
                Delayms(10);
                if(!IncKey)
                {
                        while(!IncKey);
                        NumChange+=10;
                        if(NumChange>=100)NumChange=100;
                }
        }
        if(!DecKey)
        {
                Delayms(10);
                if(!DecKey)
                {
                        while(!DecKey);
                        NumChange-=10;
                        if ((NumChange<10)|(NumChange>100))NumChange=0;
                }
        }
       
}

void Int0Serv( ) interrupt 0
{
        KeyScan();
}
void T0Serv()interrupt 1
{
        if(!PulseStatus)
        {
                if(HPulseNum--!=0)
                {
                        if(!MotoStatus)
                        {
                                CWD;
                        }
                        else
                        {
                                CCWD;
                        }
                }
                else
                {
                        PulseStatus=!PulseStatus;
                        LPulseNum=100-NumChange;
                }
        }
        else
        {
                if(LPulseNum--!=0)
                {
                        stop;
                }
                else
                {
                        PulseStatus=!PulseStatus;
                        HPulseNum=NumChange;
                }
        }
}



void main()
{
        uchar y;
        InitLCD();
        InitInt0T0();
        HPulseNum=NumChange;
       
        while(1)
        {
                StatusLCD();
                WriteLcd(0x80,0);
                for(y=0; y<15; y++)
                WriteLcd(FirstLine[y],1);
       
                WriteLcd(0xc0,0);
                for(y=0; y<8; y++)
                        WriteLcd(SecondLine[y],1);
               
        }

}


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

使用道具 举报

沙发
ID:1 发表于 2015-10-14 13:56 来自手机 | 只看该作者
楼主能分享一下电路图吗?
回复

使用道具 举报

板凳
ID:92134 发表于 2015-10-14 15:31 | 只看该作者
admin 发表于 2015-10-14 13:56
楼主能分享一下电路图吗?

就这个了

电路图.PNG (57.01 KB, 下载次数: 156)

按键+1602

按键+1602
回复

使用道具 举报

地板
ID:74784 发表于 2015-10-14 21:17 | 只看该作者
感觉H桥电路有问题
不知楼主实际试验过吗?
回复

使用道具 举报

5#
ID:92134 发表于 2015-10-15 17:45 | 只看该作者
没有,只仿真了
回复

使用道具 举报

6#
ID:36525 发表于 2015-10-15 21:05 | 只看该作者
对1602一直不熟悉
回复

使用道具 举报

7#
ID:91888 发表于 2015-10-15 22:35 | 只看该作者
看得不怎么明白
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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