标题: 51单片机,按键控制电动机+1602显示 [打印本页]

作者: moose    时间: 2015-10-14 13:45
标题: 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);
               
        }

}



作者: admin    时间: 2015-10-14 13:56
楼主能分享一下电路图吗?
作者: moose    时间: 2015-10-14 15:31
admin 发表于 2015-10-14 13:56
楼主能分享一下电路图吗?

就这个了

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

按键+1602

按键+1602

作者: lxa0    时间: 2015-10-14 21:17
感觉H桥电路有问题
不知楼主实际试验过吗?
作者: moose    时间: 2015-10-15 17:45
没有,只仿真了
作者: ls0899    时间: 2015-10-15 21:05
对1602一直不熟悉
作者: fyang    时间: 2015-10-15 22:35
看得不怎么明白




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1