实现直流电机正转、反转、停止控制,用LED显示电机运行状态的c语言程序

实现直流电机正转、反转、停止控制,用LED显示电机运行状态的c语言程序,第1张

10分太少了,知卖掘识是很贵的。

#include<reg51.h>//这个我就不解释了^^

keil编译

#define

LED_CW

P0=0xfe

#define

LED_CCW

P0=0xfd

#define

LED_STOP

P0=0xfb

#define

KEY_CW

P3^0

#define

KEY_CCW

P3^1

#define

KEY_STOP

P3^2

#define

MOTOR_A

P1^0

//无用,只为标记

#define

MOTOR_B

P1^1

#define

MOTOR_CW

P1=0xfe

#define

MOTOR_CCW

P1=0xfd

#define

MOTOR_STOP

P1=0Xff

void

main(void)

{

P0=0xfb

P1=0xff

P2=0xff

while(1)

{

if(KEY_CW==0)

{

LED_CW

MOTOR_CW

}

if(KEY_CCW==0)

{

LED_CCW

MOTOR_CCW

}

if(KEY_STOP==0)

{

LED_STOP

MOTOR_STOP

}

}

}

以上程序通过编译空配晌,未实测,不排除有错误。

都是很简单的程序,我就不斗锋帮你一句一句的翻译了。

一楼说的是PWM调速,稍微麻烦些,等你先看会了上面的,在学习一下PWM吧。

祝你好运

电子单片机团===步行者

开关控制指示灯显示

MY8255_AEQU 0A860H;8255A口地址

MY8255_BEQU 0A861H;8255B口地址

MY8255_CEQU 0A862H;8255C口地址

MY8255_MODE EQU 0A863H;8255控制口地址

CODE SEGMENT

ASSUME CS:CODE

START: MOV DX,MY8255_MODE

MOV AL,82H

OUT DX,AL;将控制字82H写入8255控制口,A口方式0输出,B口方式0输入, C口未用到。

A1:MOV DX,MY8255_B

IN AL,DX ;读8255 B口内容

MOV DX,MY8255_A

OUT DX,AL ; 将前面读到的B口内容送到A口,即A口内容=B口内容

CALL BREAK;调用子程序BREAK

JMP A1;跳转到A1

BREAK PROC NEAR ;BREAK子程序

MOV AH,1

INT 16H

JZ RETURN ;读按键字符,ZF=1,则返回;ZF=0,则AL=字符

MOV AX,4C00H

INT 21H ;返回DOS 

RETURN:RET

BREAK ENDP

CODE ENDS 皮氏渗

END START

流水灯显示

MY8255_AEQU 0b860H;8255A口地址

MY8255_BEQU 0b861H;8255B口地址

MY8255_CEQU 0b862H;8255C口地址

MY8255_MODE EQU 0b863H;8255控制口地址

DATA SEGMENT

LA DB ?;留出1个字节

LB DB ?;留出1个字节

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV DX,MY8255_MODE

MOV AL,80H

OUT DX,AL ;控制字80H送入8255控制口,A口、B口都是方式0输出,C口未用到。

MOV DX,MY8255_A

MOV AL,7FH

OUT DX,AL ;将7FH送入A口

MOV LA,AL ;将7FH送入LA存储单元燃脊

MOV DX,MY8255_B

MOV AL,0FEH

OUT DX,AL;将FEH送入B口

MOV LB,AL ;将FEH送入LB存储单元

CALL DALLY

A1:MOV AL,LA

ROR AL,1;LA内容循环右移1次

MOV LA,AL

MOV DX,MY8255_A

OUT DX,AL ;将循环右移后的LA内容送A口,其目的是让A口连接的LED灯依次向右循环点亮

MOV AL,LB

ROL AL,1 ;LB内容循环左移1次

MOV LB,AL

MOV DX,MY8255_B

OUT DX,AL ;将循环左移后的LB内容送B口,核如其目的是让B口连接的LED灯依次向左循环点亮

CALL DALLY ;延时,让一个LED灯发光稳定之后再点亮另一个

CALL BREAK ;调用BREAK子程序,看是否有键按下

JMP A1 ;跳转到A1

DALLY: MOV CX,3FFH ;延时子程序

D1:MOV AX,0FFFFH

D2:DEC AX

JNZ D2

LOOP D1

RET

BREAK PROC NEAR ;是否有键按下

MOV AH,06H

MOV DL,0FFH

INT 21H

JE RETURN ;若无,则转RETURN

MOV AX,4C00H

INT 21H ;返回DOS

RETURN:RET

BREAK ENDP

CODE ENDS

END START


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12308219.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存