单片机驱动带编码器直流电机 源程序

2020-01-23来源: 51hei关键字:单片机驱动  编码器  直流电机

#include

//单片机头文件,储存一些殊寄存器的地址声明

#include        

//intrins头文件储存51编程中需要使用到空指令_nop_()、字符循环移位指令_crol_等

#include

//stdio : "standard input & output"(标准输入输出),C/C++头文件,把多个编译单元(.c或者.cpp文件)公用的内容,单独放在一个文件里减少整体代码尺寸


#define usint unsigned short int        //符号短整型

#define uchar unsigned char                        //无符号字符型

#define uint unsigned int                          //无符号整型

#define VALID        0                                        //0

#define INVALID        1                                        //1

#define LCD_data P0                            //LCD数据端口P0


sbit LCD_RS = P2^7;                        //LCD命令和数据控制位,1:写数据位,0:写命令

sbit LCD_RW = P2^6;                        //LCD读写控制位

sbit LCD_EN = P2^5;                        //LCD使能位


sbit IN1 = P2^0;                        //电机

sbit IN2 = P2^1;

sbit ENA = P2^3;


uchar code title2[] = {"电机转速:"};

uchar code ascii[] = 

{0x31,0x32,0x33,0x41,0x34,0x35,0x36,0x42,0x37,0x38,0x39,0x43,0x2A,0x30,0x23,0x44};   //数字和常用字符的ascii码

uint n = 0;                                        //T0定时中断响应次数

uint n_pwm = 0;                                //用于调节pwm占空比

uint c = 0;                                        //外部计数中断响应次数

uint flag_T0 = 0;                        //定时器T0溢出flag

uchar th = 0;                                //脉冲计数计算时的临时变量高位

uchar tl = 0;                                //……………………………………………低位

uint num_pulse;                                //脉冲个数

void delay_1ms(uint z){     //延时函数1ms  

        uint x,y; 

        for(x = z; x > 0; x--) 

                for(y = 920; y > 0; y--); 

}

void write_cmd(uchar cmd){  //LCD写命令函数 

        LCD_RS = 0; 

        LCD_RW = 0; 

        LCD_EN = 0; 

        P0 = cmd; 

        delay_1ms(6); 

        LCD_EN = 1; 

        delay_1ms(6); 

        LCD_EN = 0; 

}

void write_dat(uchar dat){  //LCD写数据函数 

        LCD_RS = 1; 

        LCD_RW = 0; 

        LCD_EN = 0; 

        P0 = dat; 

        delay_1ms(5); 

        LCD_EN = 1; 

        delay_1ms(5); 

        LCD_EN = 0; 

void lcd_pos(uchar X,uchar Y){  //X表示LCD的行数,Y表示LCD的列数 

        uchar pos; 

        if(X == 0){

                X = 0x80;

        } 

        else if(X == 1){

                         X = 0x90;

                 } 

                 else if(X == 2){

                                   X = 0x88;

                          } 

                          else if (X == 3){

                                                X = 0x98;

                                   } 

        pos = X+Y ; 

        write_cmd(pos);    //显示地址 

}

void lcd_init(){          

        uchar i = 0;                                   

        write_cmd(0x30);   //基本指令操作 

        delay_1ms(5); 

        write_cmd(0x0C);   //显示开,关光标

        delay_1ms(5); 

        write_cmd(0x01);   //清除LCD的显示内容

        delay_1ms(5);

        lcd_pos(0,0);       //将LCD光标定位到第一行第一列            

}

void pulse_dispaly(uint fe)                //显示脉冲个数

{

        uchar i = 0;

        uchar f[7];

                for(i = 0; i < 7; i++)

                        f[i] = '0';

                f[0] = ((fe)/100000)                     +0x30;//十万位的数字

                f[1] = ((fe)%100000)/10000                +0x30;//万位的数字

                f[2] = ((fe)%10000)/1000                +0x30;//千位的数字

                f[3] = ((fe)%1000 )/100                 +0x30;//百位的数字

                f[4] = ((fe)%100  )/10                  +0x30;//十位的数字

                f[5] = ((fe)%10   )                     +0x30;//个位的数字

                f[6] = '';

        i = 0;

        lcd_pos(1,5);                            //将光标定位到第2行第6列开始显示

        while(f[i] != ''){

                write_dat(f[i]);

                i++;

        }        

}

void display_text(int pos, uchar *text){        //显示一段字text、pos设置在第几行开头显示

        uchar j;

        lcd_pos(pos,0);

        while(text[j]!=''){

                write_dat(text[j]);

                j++;

        }

        j=0;

}

void INIT(){                                //初始化函数

        TMOD = 0X51;                        //定时器初始化0101_0001                                                

        TH0 = (65536-922)/256;        //定时器初值(1ms),0.001s/(1.085*10^(-6))s=922

        TL0 = (65536-922)%256;

        TH1 = 0X00;        //计数器初值

        TL1 = 0x00;

        ET0 = 1;                //允许中断T0

        ET1 = 1;

        EA = 1;                //总中断开放

        TR0 = 1;                //启动T0

TR1 = 1; //

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

上一篇:12864+DS1302+DS18B20大字符时钟原理图与源程序
下一篇:基于LD3320语音识别技术的小灯控制系统程序

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

推荐阅读

如何使用单片机驱动标准PC机键盘?C51程序详细说明
(noshift[i][0]==temp[1]) //功能键的通码在缓冲区的第二位  {  key=noshift[i][1];  ie=0x83;  return;  }  }  }  else //普通按键  {  for(i=0;i《80;i++)  {  if(noshift[i][0]==temp[0]) //普按键的通码在缓冲区的第一位  {  key=noshift[i][1];  ie=0x83;  return;  }  }  }  for(i=0;i《5;i++)  {  temp[i]=0;  }  }  PC机键盘按键通码与ASCII对照表  这个库要配合 单片机驱动标准pc机键盘的c51程序使用  unsigned
发表于 2020-02-02
如何使用单片机驱动标准PC机键盘?C51程序详细说明
单片机驱动TEA5767 FM立体声收音机C51通用源码
TEA5767 FM立体声收音机,C51单片机通用的源码。模块某宝上也就2元以内。推荐使用 Keil uVision5 编译,我是用这个版本编译通过的。电路原理图如下:单片机源程序如下:#include <REG52.H>#include "Radio.H"#include "Key_Handle.H"#include "Volume_Handle.H"extern void Delay_ms(unsigned int i);/********** System inition *************/void System_Init(void
发表于 2020-01-31
单片机驱动TEA5767 FM立体声收音机C51通用源码
使用AVR单片机驱动舵机
1.舵机驱动的基本原理  (可以参考http://blog.sina.com.cn/s/blog_8240cbef01018hu1.html)  "控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。"简单的来讲,就是输出一个周期为20Ms,不同的占空比对应舵机转过不同的角度。难点主要在于舵机控制信号需要保持,这样就比用脉冲控制步进电机要复杂一些
发表于 2020-01-03
使用AVR单片机驱动舵机
A4988步进电机单片机驱动程序
这是自己用4988步进电机驱动芯片做的,4988芯片一般用在3D打印机上,具有体积小等优点。下面有我的测试程序,希望可以给需要的人提供参考。单片机源程序如下:/**************************************************************** 实 验 名 :步进电机实验* 实验说明 :电机启动、停止、正转、反转* 实验平台 :51单片机开发板* 连接方式 :pulse接P10  DIR接P11 KYE1接P20 KYE2接P21 KYE3接P22 KYE4接P23 ENABLE接P12 MS1-3接P13-P14* 注    意 :本例程使用
发表于 2020-01-03
LCD1602液晶显示模块的单片机驱动深入详解之硬件篇
(本文以HD44780主控芯片的LCD1602为蓝本进行描述,其中的截图也来自HD44780数据手册,用户可自行搜索其datasheet,有部分整理网上的,但绝对要比你看到的要深入得多)一.接口 LCD1602是很多单片机爱好者较早接触的字符型液晶显示器,它的主控芯片是HD44780或者其它兼容芯片。刚开始接触它的大多是单片机的初学者。由于对它的不了解,不能随心所欲地对它进行驱动。经过一段时间的学习,我对它的驱动有了一点点心得,今天把它记录在这里,以备以后查阅。与此相仿的是LCD12864液晶显示器,它是一种图形点阵显示器,能显示的内容比LCD1602要丰富得多,除了普通字符外,还可以显示点阵图案,带有汉字库的还可以显示
发表于 2019-12-31
LCD1602液晶显示模块的单片机驱动深入详解之硬件篇
基于52单片机控制编码器显示程序
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
发表于 2020-02-08
小广播
何立民专栏 单片机及嵌入式宝典

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

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