#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
sbit DIR=P1^0;
sbit STEP=P1^1;
sbit K1=P3^1;
sbit K2=P3^0;
typedef unsigned int u16; //對數據類型進行聲明定義
typedef unsigned 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 EncoderCount=0 ;
void delay(u16 i)
{
while(i--);
}
void Lcd1602_Delay1ms(uint c) //誤差 0us
{
uint a,b;
for(a=c;a>0;a--)
for(b=114;b>0;b--);
}
#ifndef LCD1602_4PINS //當沒有定義這個LCD1602_4PINS時
void LcdWriteCom(uchar com) //寫入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; //選擇發送命令
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = com; //放入命令
Lcd1602_Delay1ms(1); //等待數據穩定
LCD1602_E = 1; //寫入時序
Lcd1602_Delay1ms(5); //保持時間
LCD1602_E = 0;
}
#else
void LcdWriteCom(uchar com) //寫入命令
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 0; //選擇寫入命令
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = com; //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫入時序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = com << 4; //發送低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫入時序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 數 名 : LcdWriteData
* 函數功能 : 向LCD寫入一個字節的數據
* 輸 入 : dat
* 輸 出 : 無
*******************************************************************************/
#ifndef LCD1602_4PINS
void LcdWriteData(uchar dat) //寫入數據
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //選擇輸入數據
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = dat; //寫入數據
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫入時序
Lcd1602_Delay1ms(5); //保持時間
LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat) //寫入數據
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //選擇寫入數據
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = dat; //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫入時序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = dat << 4; //寫入低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫入時序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
#ifndef LCD1602_4PINS
/*=================================================
*函數名稱: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;
LcdWriteCom(x);
LcdWriteData(dat);
}
#endif
/*=================================================
*函數名稱:LCD1602_Dis_Str
*函數功能:在指定位置顯示字符串
*調用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();
*輸入:x:要顯示的橫坐標取值0-40,y:要顯示的行坐標取值0-1(0為第一行,1為第二行)
*str:需要顯示的字符串
=================================================*/
#ifndef LCD1602_4PINS
void LCD1602_Dis_Str(uchar x, uchar y, uchar *str)
{
if(y) x |= 0x40;
x |= 0x80;
LcdWriteCom(x);
while(*str != '\0')
{
LcdWriteData(*str++);
}
}
#endif
/*******************************************************************************
* 函 數 名 : LcdInit()
* 函數功能 : 初始化LCD屏
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
#ifndef LCD1602_4PINS
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x38); //開顯示
LcdWriteCom(0x0c); //開顯示不顯示光標
LcdWriteCom(0x06); //寫一個指針加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //設置數據指針起點
}
#else
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x32); //將8位總線轉為4位總線
LcdWriteCom(0x28); //在四位線下的初始化
LcdWriteCom(0x0c); //開顯示不顯示光標
LcdWriteCom(0x06); //寫一個指針加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //設置數據指針起點
}
#endif
void keypros1()
{
if(K1==0) //檢測按鍵K1是否按下
{
delay(1); //消除抖動
if(K1==0)
{
while(1)
{
TMOD=0x01;
TH0=(65535-2000)/256;
TL0=(65535-2000)%256;
EA=1;
ET0=1;
TR0=1;
DIR=0;
}
while(!K1);
}
}
}
由于內容有限,這只是部分代碼,需要完整版,請下載附件
29.81 KB, 下載次數: 133, 下載積分: 黑幣 -5
QQ截圖20181217094801.png (86.73 KB, 下載次數: 63)
原理圖
389156621 發表于 2019-7-18 09:07
怎樣在程序里面調節電機速度??
歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |