步进电机转速控制
步进电机转速控制求助!
小弟学步进电机,哪位大虾可以发给我一个步进电机转速控制的程序,最好有注解的,C语
言的更好,定时器控制的要!
/**********************************************************
步进电机正转(转n*30度)
**********************************************************/
void motor_ffw(unsigned int time)
{
unsigned int i,j;
ms30_count=time;
TR1=1;
for (j = 0; j
//转n*30度
{
for (i = 0; i
//一个周期转30度
{
if(ms30_count
{
P3 = Ffw_Change; //取数据
ms30_count=time;
TR1=0;
}
else P3=Ffw_Change;
//delayms(time); //调节转速
}
}
// P3 = 0xf0; //使步进电机掉电
}
/**********************************************************
步进电机反转(转n*30度)
**********************************************************/
void motor_rev(unsigned int time)
{
unsigned int i,j;
ms30_count=time;
TR1=1;
for (j = 0; j
//转n*30度
{
for (i = 0; i
//一个周期转30度
{
if(ms30_count
{
P3 = Rev_Change; //取数据
ms30_count=time;
TR1=0;
}
else P3=Ffw_Change;
//delayms(time); //调节转速
}
}
// P3 = 0xf0; //使步进电机掉电
}
void Motor_Control()
{
ad_display();
if(receivebuf[0]>receivebuf[1])
{
if(sub
motor_rev(10);
else if((sub>=1)&& (sub
motor_rev(5);
else if((sub>3)&&(sub
motor_rev(1);
}
else if(receivebuf[0]
{
if(sub
motor_ffw(10);
else if((sub>=1)&& (sub
motor_ffw(5);
else if((sub>3)&&(sub
motor_ffw(1);
}
else P3=0xf0;
}
/*********************************************
定时中断服务程序
**********************************************/
void timer1_int(void) interrupt 3
{
TH1=0xdc;
TL1=0x00;
ms10_count++;
ms30_count--;
}
其中sub=abs(receivebuf[0]-receivebuf[1]);
ad_display函数得出AD两个通道receivebuf[0]和receivebuf[1]的值,根据这两个值的差去控制步进电机转速。用定时器1控制转速,可是电压值在LCD上显示是有差的,但步进
电机就是不转!这是为啥呢?
TOP
2# 大 中 小 发表于 2011-3-2 10:22 只看该作者
;/***********************************************
*********************************
;* 标题: xl系列单片机实验仪演示程序 LCD1602显示
管理员
版主
∙
∙
∙ 步进电机控制器速度方向圈数可调* ;* 文件: lcd1602dj.asm * ;* 日期: 2006-1-5 *
;* 版本: 3.0 (试验通过版)可用xl600-xl1000单片个人空间 发短消息 加为好友
当前离线 机综合试验仪试验 *
;* 邮
*
;* 网站:
http://www.51c51.com www.8951.com
*
;************************************************
********************************
;* 描述: LCD1602显示 步进电机控制
器速度方向圈数可调 *
;K1-启动与停止步进电机运行;K2-设定步进电机运行
圈数 (1-20圈) *
;K3-设定步进电机转动方向;K4-设定步进电机运行速
度 *
;步进电机的转速控制分16档,数字越小,转速越
快。 *
;7.5度步进电机;周期7.5×4=30度,电机转动一圈需
12个周期? *
;资源:p1.0-p1.3接反向器74ls14,输出后接步进电机
p3.7接小喇叭提供按键音 *
;p1.4-p1.7接端口按键:lcd1602插入实验
仪 * ;************************************************
********************************
;* 【版权】 Copyright(C)深圳市学林电子有限公司
www.51c51.com *
;* 【声明】 此程序仅用于学习与参考,引用请注明版权
和作者信息! *
;* 【技术支持】请访问
http://www.51c51.com/bbs/index.asp 官方论
坛 *
;************************************************
********************************/
K1 EQU P1.4 ;K1键
K2 EQU P1.5 ;K2键
K3 EQU P1.6 ;K3键
K4 EQU P1.7 ;K4键
BA EQU P1.0 ;步进电机A端 BB EQU P1.1 ;步进电机B端 BC EQU P1.2 ;步进电机C端 BD EQU P1.3 ;步进电机D端
BEEP EQU P3.7 ;蜂鸣器
RS EQU P2.0
RW EQU P2.1
EN EQU P2.2
LCD_X EQU 2FH
RATE EQU 32H ;转速档次 D_BUF1 EQU 33H ;显示缓存1 D_BUF2 EQU 34H ;显示缓存2 TEMP EQU 35H ;临时过渡 TURN_NUM EQU 36H ;存放运行圈数 CYCLE EQU 37H ;存放周期数 ;--------------------------------------------
ORG 0000H
JMP MAIN
ORG 000BH
JMP INTT0
ORG 0080H
;---------------------------------------------
MAIN:
MOV SP,#60H
ACALL SET_LCD ;显示启动画面
MOV R4,#0FH
MAIN1 :
MOV R5,#25 ;延时5S
CALL DELAY2
DJNZ R4,MAIN1
ACALL SET_LCD0
CLR 20H.0 ;转速设置加减标
记
SETB 20H.1 ;正转、逆转标记 SETB 20H.2 ;圈数设置加减标
记
SETB 20H.3 ;运行与停止标记
SETB 20H.4
MOV R0,#00H
MOV R1,#00H
MAIN2:
MOV TURN_NUM,#5 ;默认转5圈
MOV A,TURN_NUM
MOV LCD_X,#04H
ACALL DATA_CONV ;显示圈数 ACALL SET_LCD1 ;显示STOP
MOV R2,TURN_NUM
MOV CYCLE,#12 ;12个周期,电机转
一圈。
MOV RATE,#08H ;预设为中速
MOV A,RATE
MOV LCD_X,#0DH
ACALL DATA_CONV ;显示转速比例
MOV P1,#0F0H
MOV TMOD,#01H
MOV TL0,#33H
MOV TH0,#0F5H
SETB EA
SETB ET0
M_LOOP:
MOV A,CYCLE ;12个周期,电机
转一圈。
CJNE A,#00H,LOOP0
MOV CYCLE,#12
DEC R2
MOV A,R2
MOV LCD_X,#04H ;显示剩余圈数
ACALL DATA_CONV
CJNE R2,#00H,LOOP0
CLR TR0
MOV P1,#0F0H
MOV R2,TURN_NUM ;重新送圈数
SETB 20H.3 ;STOP
MOV A,R2
MOV LCD_X,#04H ;显示圈数
ACALL DATA_CONV
ACALL SET_LCD1
LOOP0:
JB 20H.1,LOOP0A
ACALL SET_LCDR ;
JMP LOOP0B
LOOP0A:
ACALL SET_LCDF ;>>
LOOP0B:
JB K1,LOOP1
JNB 20H.3,LOOP0C
ACALL SET_LCD2 ;RUNNING SETB TR0 ;启动步进电机运
行
CLR 20H.3 ;停止运行标记
CALL BEEP_BL
JMP LOOP1
LOOP0C:
CLR TR0 ;停止步进电机运
行
SETB 20H.3 ;启动运行标记
MOV P1,#0F0H
MOV CYCLE,#12
MOV R2,TURN_NUM
ACALL SET_LCD1 ;STOP
CALL BEEP_BL
JMP M_LOOP
LOOP1:
JB K2,LOOP2
CALL BEEP_BL
JNB 20H.2,LOOP1B
MOV A,TURN_NUM ;增加圈数
INC A
MOV TURN_NUM,A
MOV LCD_X,#04H ;显示设定圈数
ACALL DATA_CONV
MOV R2,TURN_NUM
MOV A,TURN_NUM
CJNE A,#20,LOOP1A
CLR 20H.2
LOOP1A:
JMP LOOP2
LOOP1B:
MOV A,TURN_NUM ;减少圈数
DEC A
MOV TURN_NUM,A
MOV LCD_X,#04H ;显示设定圈数
ACALL DATA_CONV
MOV R2,TURN_NUM
MOV A,TURN_NUM
CJNE A,#01H,LOOP2
SETB 20H.2
LOOP2:
JB K3,LOOP3 ;换向
CLR TR0
MOV P1,#0F0H
SETB 20H.3 ;STOP标志
ACALL SET_LCD1
CPL 20H.1 ;换向标志 JB 20H.1,LOOP2A ;根据换向标志来
显示转动方向
ACALL SET_LCDR
JMP LOOP2B
LOOP2A:
ACALL SET_LCDF
LOOP2B:
CALL BEEP_BL
MOV R2,TURN_NUM ;换向后,从设定
值开始运行
MOV A,R2
MOV LCD_X,#04H ;显示设定圈数
ACALL DATA_CONV
LOOP3:
JB K4,LOOP4
CLR 20H.4 ;在运行过程调整
速率时,要使步进电机先停止转动
CALL BEEP_BL
JNB 20H.0,LOOP5
mov temp,CYCLE
MOV A,RATE ;减速过程
INC A
MOV RATE,A
MOV LCD_X,#0DH
ACALL DATA_CONV
MOV A,RATE
CJNE A,#10H,LOOP4
CLR 20H.0
LOOP4:
SETB 20H.4
JMP M_LOOP
LOOP5:
MOV A,RATE ;加速过程
DEC A
MOV RATE,A
MOV LCD_X,#0DH
ACALL DATA_CONV
MOV A,RATE
CJNE A,#01H,LOOP6
SETB 20H.0
LOOP6:
SETB 20H.4
JMP M_LOOP
;---------------------------------------------
;步进电机正转走一步子程序
;---------------------------------------------
FFW:
MOV A,R0
MOV DPTR,#TABLE_F
MOVC A,@A+DPTR
CJNE A,#00H,FFW1
MOV R0,#00H
DEC CYCLE ;每8步为一个周期
JMP FFW2
FFW1:
MOV P1,A
INC R0
FFW2:
RET
;---------------------------------------------
;步进电机逆转走一步子程序
;---------------------------------------------
REV:
MOV A,R0
MOV DPTR,#TABLE_R
MOVC A,@A+DPTR
CJNE A,#00H,REV1
MOV R0,#00H
DEC CYCLE ;每8步为一个周期
JMP REV2
REV1:
MOV P1,A
INC R0
REV2:
RET
;---------------------------------------------
;中断服务子程序
;中断定时2ms
;20H.1=1 正转,20H.1=0 反转
;---------------------------------------------
INTT0:
PUSH ACC
CLR TR0
MOV TL0,#33H
MOV TH0,#0F5H
SETB TR0
JNB 20H.4,INTT0B ;K4键按下时,停
止步进电机运行
INC R3
MOV B,R3
MOV A,RATE ;中断次数来调整
延时时间的长短
CJNE A,B,INTT0B
MOV R3,#00H
JNB 20H.1,INTT0A
LCALL FFW ;步进电机正转
JMP INTT0B
INTT0A:
LCALL REV ;步进电机逆转
INTT0B:
POP ACC
RETI
;------------------------------------------------
-----
;
;------------------------------------------------
-----
DATA_CONV:
MOV B,#10
DIV AB
JZ D_CONV1 ;高位为0,不显示
ADD A,#30H
JMP D_CONV2
D_CONV1:
MOV A,#20H
D_CONV2:
MOV D_BUF1,A ;高位
MOV A,B
ADD A,#30H
MOV D_BUF2,A ;低位
MOV B,LCD_X
MOV A,D_BUF1
CALL LCDP2
INC LCD_X
MOV B,LCD_X
MOV A,D_BUF2
CALL LCDP2
RET
;------------------------------------------------
-----
; LCD 初始化设置
;------------------------------------------------
-----
SET_LCD:
CLR EN
CALL INIT_LCD ;初始化 LCD
CALL DELAY1
MOV DPTR,#INFO1 ;指针指到显示信息1
MOV A,#1 ;显示在第一行
CALL LCD_SHOW
MOV DPTR,#INFO2 ;指针指到显示信息2
MOV A,#2 ;显示在第二行
CALL LCD_SHOW
;------------------------------------------------
-----
INFO1: DB " STEPPING MOTOR ",0 ;LCD 第一行显示
信息
INFO2: DB "CONTROL PROCESS",0 ;LCD 第二行显示
信息
;------------------------------------------------
-----
SET_LCD0:
CLR EN
CALL INIT_LCD ;初始化 LCD
CALL DELAY1
MOV DPTR,#INFO3 ;指针指到显示信息1
MOV A,#1 ;显示在第一行
CALL LCD_SHOW
MOV DPTR,#INFO4 ;指针指到显示信息2
MOV A,#2 ;显示在第二行
CALL LCD_SHOW
RET
INFO3: DB " STOP ",0
INFO4: DB "NUM: RATE: ",0 ;LCD 第二行显示
信息
SET_LCD1:
MOV DPTR,#INFO5 ;指针指到显示信息1
MOV A,#1 ;显示在第一行
CALL LCD_SHOW
RET
INFO5: DB " STOP ",0
SET_LCD2:
MOV DPTR,#INFO6 ;指针指到显示信息1
MOV A,#1 ;显示在第一行
CALL LCD_SHOW
INFO6: DB " RUNNING ",0
SET_LCD3:
MOV DPTR,#INFO7 ;指针指到显示信息1
MOV A,#1 ;显示在第一行
CALL LCD_SHOW
RET
INFO7: DB " RUNNING ",0
SET_LCDF:
MOV LCD_X,#0CH
MOV A,#3EH ;显示>>
ACALL LCDP1
INC LCD_X
ACALL LCDP1
RET
SET_LCDR:
MOV LCD_X,#0CH
MOV A,#3CH ;显示
ACALL LCDP1
INC LCD_X
ACALL LCDP1
RET
LCD_CLR:
MOV LCD_X,#0CH
MOV A,#20H ;显示
ACALL LCDP1
INC LCD_X
ACALL LCDP1
RET
;------------------------------------------------
--------
INIT_LCD: ;8位I/O控制 LCD 接口初
始化
MOV A,#38H ;双列显示,字形5*7点阵
CALL WCOM
CALL DELAY1
MOV A,#38H ;双列显示,字形5*7点阵
CALL WCOM
CALL DELAY1
MOV A,#38H ;双列显示,字形5*7点阵
CALL WCOM
CALL DELAY1
MOV A,#0CH ;开显示,关光标,
CALL WCOM
CALL DELAY1
MOV A,#01H ;清除 LCD 显示屏
CALL WCOM
CALL DELAY1
RET
;------------------------------------------------
----
LCD_SHOW: ;在LCD的第一行或第二行显示信息字
符
CJNE A,#1,LINE2 ;判断是否为第一行
LINE1:
MOV A,#80H ;设置 LCD 的第一行地
址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#80H ;设置 LCD 的第一行地
址
CALL WCOM ;写入命令
JMP FILL
LINE2:
MOV A,#0C0H ;设置 LCD 的第二行地
址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#0C0H ;设置 LCD 的第二行地
址
CALL WCOM
FILL:
CLR A ;填入字符
MOVC A,@A+DPTR ;由消息区取出字符
CJNE A,#0,LC1 ;判断是否为结束码
RET
LC1:
CALL WDATA ;写入数据
INC DPTR ;指针加1
JMP FILL ;继续填入字符
RET
;------------------------------------------------
---
CLR_LINE: ;清除该行 LCD 的字符
MOV R0,#24
CL1:
MOV A,#' '
CALL WDATA
DJNZ R0,CL1
RET
;------------------------------------------------
----
MENU1: ;LCD 显示工作菜单信息
MOV DPTR,#MENU2
MOV A,#1 ;在第一行显示信息
CALL LCD_SHOW
RET
MENU2: DB " REMOTE CONTROL ",0
;------------------------------------------------
-----
; 写指令使能子程序
;RS=L,RW=L,D0-D7=指令码,E=高脉冲
;------------------------------------------------
-----
WCOM:
MOV P0,A
CLR RS
CLR RW
SETB EN
CALL DELAY0
CLR EN
RET
;------------------------------------------------
-----
;写数据使能子程序
;RS=H,RW=L,D0-D7=数据,E=高脉冲
;------------------------------------------------
----
WDATA:
MOV P0,A
SETB RS
CLR RW
SETB EN
CALL DELAY0
CLR EN
RET
DELAY0:
MOV R7,#250 ;延时500微秒
DJNZ R7,$
RET
;------------------------------------------------
---
;在 LCD 显示字符
;A=ASC DATA, B=LINE X POS
;------------------------------------------------
---
LCDP1: ;在LCD的第一行显示字符
PUSH ACC ;
MOV A,LCD_X ;设置显示地址
ADD A,#80H ;设置LCD的第一行地址
CALL WCOM ;写入命令
POP ACC ;由堆栈取出A
CALL WDATA ;写入数据
RET
LCDP2: ;在LCD的第二行显示字符
PUSH ACC ;
MOV A,B ;设置显示地址
ADD A,#0C0H ;设置LCD的第二行地址
CALL WCOM ;写入命令
POP ACC ;由堆栈取出A
CALL WDATA ;写入数据
RET
;-----------------------------------------------
;蜂鸣器响一声子程序
;-----------------------------------------------
BEEP_BL:
MOV R6,#100
BL1:
CALL DEX1
CPL BEEP
DJNZ R6,BL1
MOV R5,#25
CALL DELAY2
RET
DEX1:
MOV R7,#180
DEX2:
NOP
DJNZ R7,DEX2
RET
DELAY2: ;延时R5×10MS
MOV R6,#50
D1:
MOV R7,#100
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,DELAY2
RET
;-----------------------------------------------
;延时5MS
;-----------------------------------------------
DELAY1:
MOV R6,#25
DL2:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DL2
RET
TABLE_F:
DB 0F1H,0F3H,0F2H,0F6H,0F4H,0FCH,0F8H,
0F9H
DB 00
TABLE_R:
DB 0F9H,0F8H,0FCH,0F4H,0F6H,0F2H,0F3H,
0F1H
DB 00
;----------------------------------------------
;TABLE_F:
DB 0F3H,0F6H,0FCH,0F9H
DB 00
;TABLE_R:
DB 0F9H,0FCH,0F6H,0F3H
DB 00
;----------------------------------------------
END
新人报道注意事项:
1 给大家送一个见面礼, 比如自己收藏的程序代
码资料等
2 如果有可能请认真回复5个贴子 活跃本论坛的
气氛
3 不要发类似: 请给编一个***代码发到***邮箱
的贴子,天下没有免费午餐 双核心51mini独立usb仿真器仅99.9元促销
TOP
3# 大 中 小 发表于 2011-3-2 10:23 只看该作者
/*******************************************************************
*************
* 标题: xl系列单片机实验仪演示程序LCD1602显示 步进电机控制器速度方
向圈数可调 *
* 文
件: lcd1602dj.C
*
* 日
期: 2006-1-5
*
* 版本: 3.0 (试验通过版)可用xl600-xl1000单片机综合试验仪试
管理员
版主
∙ 验 * * 邮箱: [email protected] 个 *
* 网站: 人空间
∙ 发http://www.51c51.com www.8951.com
* 短消息
∙ 加********************************************************************
************
* 描述: LCD1602显示 步进电机控制器速度方向圈数可
调 *
*K1-启动与停止步进电机运行;K2-设定步进电机运行圈数 (1-20
圈) *
*K3-设定步进电机转动方向;K4-设定步进电机运行速
度 *
*步进电机的转速控制分16档,数字越小,转速越
快。 *
*7.5度步进电机;周期7.5×4=30度,电机转动一圈需12个周为好友 ∙ 当前离线
期? *
*资源:p1.0-p1.3接反向器74ls14,输出后接步进电机 p3.7接小喇叭提供按
键音 *
*p1.4-p1.7接端口按键:lcd1602插入实验
仪 *
********************************************************************
************
* 【版权】 Copyright(C)深圳市学林电子有限公司
www.51c51.com *
* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信
息! *
* 【技术支持】请访问http://www.51c51.com/bbs/index.asp 官方论
坛 *
********************************************************************
************/
#include //51芯片管脚定义头文件
#include //内部包含延时函数 _nop_();
#define uchar unsigned char
#define uint unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
char code SST516[3] _at_ 0x003b;
uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};
sbit K1 = P1^4; //运行与停止
sbit K2 = P1^5; //设定圈数
sbit K3 = P1^6; //方向转换
sbit K4 = P1^7; //速率调整
sbit BEEP = P3^7; //蜂鸣器
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
bit on_off=0; //运行与停止标志
bit direction=1; //方向标志
bit rate_dr=1; //速率标志
bit snum_dr=1; //圈数标志
uchar code cdis1[ ] = {" STEPPING MOTOR "};
uchar code cdis2[ ] = {"CONTROL PROCESS"};
uchar code cdis3[ ] = {" STOP "};
uchar code cdis4[ ] = {"NUM: RATE: "};
uchar code cdis5[ ] = {" RUNNING "};
uchar m,v=0,q=0;
uchar number=0,number1=0;
uchar snum=5,snum1=5; //预设定圈数
uchar rate=8; //预设定速率
uchar data_temp,data_temp1,data_temp2;
/********************************************************/
/*
/* 延时t毫秒
/* 11.0592MHz时钟,延时约1ms
/*
/********************************************************/
void delay(uint t)
{
uchar k;
while(t--)
{
for(k=0; k
{ }
}
}
/********************************************************/
void delayB(uchar x) //x*0.14MS
{
uchar i;
while(x--)
{
for (i=0; i
{ }
}
}
/********************************************************/
void beep()
{
uchar j;
for (j=0;j
{
delayB(4);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
delay(170);
}
/********************************************************/
/* /*检查LCD忙状态
/*lcd_busy为1时,忙,等待。为0时,闲,可写指令与数据。 /*
/********************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/********************************************************/
/* /*写指令数据到LCD /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 /*
/********************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/********************************************************/
/* /*写显示数据到LCD /*RS=H,RW=L,E=高脉冲,D0-D7=数据。
/*
/********************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/********************************************************/
/* /* LCD初始化设定 /*
/********************************************************/
void lcd_init()
{
delay(30);
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x0c); //显示开,关光标
delay(5);
lcd_wcmd(0x06); //移动光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
/********************************************************/
/* /* 设定显示位置 /*
/********************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
}
/********************************************************/
/*
/* LCD1602初始显示子程序
/*
/********************************************************/
void LCD_init_DIS()
{
delay(10); //延时
lcd_init(); //初始化LCD
lcd_pos(0); //设置显示位置为第一行的第1个字符
m = 0;
while(cdis1[m] != '\0')
{ //显示字符
lcd_wdat(cdis1[m]);
m++;
}
lcd_pos(0x40); //设置显示位置为第二行第1个字符
m = 0;
while(cdis2[m] != '\0')
{
lcd_wdat(cdis2[m]); //显示字符
m++;
}
delay(3000); //延时
lcd_pos(0); //设置显示位置为第一行的第1个字符
m = 0;
while(cdis3[m] != '\0')
{ //显示字符
lcd_wdat(cdis3[m]);
m++;
}
lcd_pos(0x40); //设置显示位置为第二行第1个字符
m = 0;
while(cdis4[m] != '\0')
{
lcd_wdat(cdis4[m]); //显示字符
m++;
}
for(m=0;m
{
lcd_pos(0x0c+m); //显示方向符号
lcd_wdat(0x3e);
}
}
/********************************************************/
/*
/*数据转换子程序
/*
/********************************************************/
void data_conv()
{
data_temp1=data_temp/10; //高位
if(data_temp1==0)
{data_temp1=0x20;} //高位为0不显示
else
{data_temp1=data_temp1+0x30;}
data_temp2=data_temp%10; //低位
data_temp2=data_temp2+0x30;
}
/********************************************************/
/*
/*数据显示子程序
/*
/********************************************************/
void data_dis()
{
data_temp = snum; //显示圈数
data_conv();
lcd_pos(0x44);
lcd_wdat(data_temp1);
lcd_pos(0x45);
lcd_wdat(data_temp2);
data_temp = rate; //显示速率
data_conv();
lcd_pos(0x4d);
lcd_wdat(data_temp1);
lcd_pos(0x4e);
lcd_wdat(data_temp2);
}
/********************************************************
/*
/* 显示运行方向符号
/*
/********************************************************/
void motor_DR()
{
if(direction==1) //正转方向标志
{ for(m=0;m
{
lcd_pos(0x0c+m); //显示方向符号
lcd_wdat(0x3e);
}
}
else
{ for(m=0;m
{
lcd_pos(0x0c+m); //显示方向符号
lcd_wdat(0x3c);
}
}
}
/********************************************************
/*
/* 显示运行状态
/*
/********************************************************/
void motor_RUN()
{
if(on_off==1)
{ TR0=1;
lcd_pos(0); //设置显示位置为第一行的第1个字符
m = 0;
while(cdis5[m] != '\0')
{ lcd_wdat(cdis5[m]); //RUNNING
m++; }
motor_DR(); //
}
else
{ TR0=0; P1 =0xf0;
lcd_pos(0); //设置显示位置为第一行的第1个字符
m = 0;
while(cdis3[m] != '\0')
{ lcd_wdat(cdis3[m]); //STOP
m++; }
motor_DR(); //
snum=snum1; //
number1=0; //清圈数计数器
}
}
/********************************************************
*
* 主程序
*
*********************************************************/
main()
{
LCD_init_DIS();
TMOD = 0x01; //T0定时方式1
TL0 = 0x33;
TH0 = 0xf5;
EA = 1;
ET0 = 1;
P1 = 0xf0;
while(1)
{
if(K1==0)
{
beep();
while(K1==0); //等待键释放
on_off=~on_off;
motor_RUN();
} //K1 end
/********************************************************/
if(K2==0)
{
beep();
if(snum_dr==1)
{ snum++;
snum1=snum;
if(snum==0x14)
{ snum_dr=~snum_dr;}
}
else
{snum--;
snum1=snum;
if(snum==0x01)
{ snum_dr=~snum_dr; }
}
} //K2 end
/********************************************************/
if(K3==0)
{
beep();
direction=~direction;
motor_DR();
}//K3 end
/********************************************************/
if(K4==0)
{
beep();
if(rate_dr==1)
{ rate++;
if(rate==0x10)
{ rate_dr=~rate_dr;}
else
{
rate--;
if(rate==0x01)
{ rate_dr=~rate_dr; }
}
} //K4 end
/********************************************************/
if(number1==snum1) //与设定圈数是否相等
{ number1=0;
on_off=0;
TR0=0;
snum=snum1;
P1 =0xf0;
motor_RUN();
}
data_dis();
} // while(1) end
} //main end
/********************************************************/
/*
/* 定时器 0 中断
/*
/********************************************************/
void motor_onoff() interrupt 1
{
TL0 = 0x33;
TH0 = 0xf5;
q++;
if(q
{ return; }
else
number++; //脉冲计数
if(number==96) //96个脉冲电机转一圈
{ snum--;
number=0;
number1++; } //电机转动圈数
if(direction==1) //方向标志
{ if(v
{P1 = FFW[v];v++;} //取数据,正转
if(v==8)
{ v=0; }
}
else
{ if(v
{P1 = REV[v];v++;} //取数据,反转
if(v==8)
{ v=0; }
}
}
}
/********************************************************/