历史上的今天
今天是:2024年11月09日(星期六)
2019年11月09日 | 51单片机+编码器+42步进电机的源程序
2019-11-09 来源:51hei
前几天帮别做一个51的小东西需要编码器,结果发现网上编码器的程序比较不好找,自己根据别人一个巧妙的思路写了一个读编码器读数的程序,用LCD1602显示出来。里边还有使用L298N驱动42步进电机部分,可以参考一下。
单片机源程序如下:
#include typedef unsigned char uchar; typedef unsigned int uint; //LCD1602定义 #define LCD1602_DB P0 //LCD1602数据总线 sbit LCD1602_RS = P2^7; //RS端 sbit LCD1602_RW = P2^6; //RW端 sbit LCD1602_EN = P2^5; //EN端 uchar code digit[ ]={"0123456789"}; //定义字符数组显示数字 uchar idata TEST[]="TEST"; //电机正反转二维数组 0为逆时针,1为顺时针 uchar code MotorCode[2][8]={{0x04,0x06,0x02,0x0a,0x08,0x09,0x01,0x05},{0x05,0x01,0x09,0x08,0x0a,0x02,0x06,0x04}}; uchar MotorStatus;//电机正反转标志位 sbit EncoderA=P3^2; //编码器A相 sbit EncoderB=P3^4; //编码器B相 uint EncoderCount=0 ; /* 毫秒软件延时函数*/ void delay_ms(uint x) { uint a,b; for(a=x;a>0;a--) for(b=114;b>0;b--); } /*================================================= *函数名称:Read_Busy *函数功能:判断1602液晶忙,并等待 =================================================*/ void Read_Busy() { uchar busy; LCD1602_DB = 0xff;//复位数据总线 LCD1602_RS = 0; //拉低RS LCD1602_RW = 1; //拉高RW读 do { LCD1602_EN = 1;//使能EN busy = LCD1602_DB;//读回数据 LCD1602_EN = 0; //拉低使能以便于下一次产生上升沿 }while(busy & 0x80); //判断状态字BIT7位是否为1,为1则表示忙,程序等待 } /*================================================= *函数名称:LCD1602_Write_Cmd *函数功能:写LCD1602命令 *调用:Read_Busy(); *输入:cmd:要写的命令 =================================================*/ void LCD1602_Write_Cmd(uchar cmd) { Read_Busy(); //判断忙,忙则等待 LCD1602_RS = 0; LCD1602_RW = 0; //拉低RS、RW操作时序情况1602课件下中文使用说明基本操作时序章节 LCD1602_DB = cmd;//写入命令 LCD1602_EN = 1; //拉高使能端 数据被传输到LCD1602内 LCD1602_EN = 0; //拉低使能以便于下一次产生上升沿 } /*================================================= *函数名称:LCD1602_Write_Dat *函数功能:写LCD1602数据 *调用:Read_Busy(); *输入:dat:需要写入的数据 =================================================*/ void LCD1602_Write_Dat(uchar dat) { Read_Busy(); LCD1602_RS = 1; LCD1602_RW = 0; LCD1602_DB = dat; LCD1602_EN = 1; LCD1602_EN = 0; } /*================================================= *函数名称:LCD1602_Clear *函数功能:LCD1602清屏 =================================================*/ void LCD1602_Clear() { Read_Busy(); LCD1602_Write_Cmd(0x01); //清屏 } /*================================================= *函数名称: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; LCD1602_Write_Cmd(x); LCD1602_Write_Dat(dat); } /*================================================= *函数名称:LCD1602_Dis_Str *函数功能:在指定位置显示字符串 *调用:LCD1602_Write_Cmd(); LCD1602_Write_Dat(); *输入:x:要显示的横坐标取值0-40,y:要显示的行坐标取值0-1(0为第一行,1为第二行) *str:需要显示的字符串 =================================================*/ void LCD1602_Dis_Str(uchar x, uchar y, uchar *str) { if(y) x |= 0x40; x |= 0x80; LCD1602_Write_Cmd(x); while(*str != '




