52单片机直流电机正反转程序

52单片机直流电机正反转程序,第1张

52单片机如51单片机的指令集是一样的,写电机的正反转程序,就是用一个电桥啊,就是4个三极管组成桥B,然后对应的墙壁打通就可以让电系症状,另外的对对比对面的桥臂导通可以用电机反转,所以直接用单片机的io口引脚输出高低电平就可以控制电机的症状和反转的。

"测速直流电机的c程序"这是什么意思?直流电机测速还需要c程序?直流电机通电就转c程序可以通过PWM对其调速,但这与测速好像木有太大关系,下面是51单片机I/O模拟PWM程序:

/

声明: 在网上找的

Title: 模拟PWM输出

Description: 51单片机模拟PWM输出控制灯的100个档级

/

#include <reg51h>

#define uInt unsigned int

#define uchar unsigned char

uchar PWM_T = 0; //占空比控制变量

//////////////////主程序入口//////////////////////

void main(void)

{

bit flag = 1; //控制灯渐亮渐熄方式

uInt n;

TMOD=0x02; //定时器0,工作模式2,8位定时模式

TH0=210; //写入预置初值(取值1-255,数越大PWM频率越高)

TL0=210; //写入预置值 (取值1-255,数越大PWM频率越高)

TR0=1; //启动定时器

ET0=1; //允许定时器0中断

EA=1; //允许总中断

P1=0xff; //初始化P1

while(1)

{

for(n=0;n<600;n++); //延时,将响应定时器中断,灯会自动加/减一个档次的亮度

//取值0-65535,数字越大变化越慢

if(flag==1) //灯渐亮

PWM_T++;

else //灯渐熄

PWM_T--;

if(PWM_T>=100) //设置灯亮度级别为10

flag=0;

if(PWM_T==0) //限定最低亮度级别为0

flag = 1;

}

}

///////////////////定时器0中断模拟PWM////////////////////

timer0() interrupt 1 using 2

{

static uchar t ; //PWM计数

t++; //每次定时器溢出加1

if(t==100) //PWM周期

{

t=0; //使t=0,开始新的PWM周期

P1=0x00; //使LED灯亮

}

if(PWM_T==t) //按照当前占空比切换输出为高电平

P1=0xff; //使LED灯灭

}

这里我用的是独立按键,自己改成4x4矩阵键盘就好了

#include<reg52h>

#include<intrinsh>

#define uchar unsigned char

#define uint unsigned int

sbit start_stop=P1^0;

sbit speedup=P1^1;

sbit speeddown= P1^2;

sbit reverse=P1^3;

sbit direction=P0^0;

sbit pwm=P0^1;

sbit shiwei=P3^2;

sbit gewei=P3^3;

uint number1=0;

uchar number=0;

uchar code LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳数码管0到9码表

void initial()//T0,C1 定时器0和计数器1的初始设置

{

TMOD=0x51;//T0 工作方式1,C1工作方式1

TH0=(65536-46070)/256;//50ms 定时(在晶振为110592M下)

TL0=(65536-46070)%256;

TH1=0;

TL1=0;

TR0=1;//启动Timer0

TR1=1;//启动COUNTER 1

ET0=1; //定时器1开中断

EA=1; //全局中断允许

}

void timer0() interrupt 1 {

number++;

if(number==19){ // 1 second !19个50ms+中断程序处理时间

number=0;

number1=TL1+256TH1;

TH1=0;

TL1=0;

}

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

}

void delay(uchar i)//100us delay

{

for(;i>0;i--)

{

uchar j;

for(j=29;j>0;j--){

_nop_();

_nop_();

}

}

}

void display()

{

P2=LEDDis[number1/40];//送十位显示

gewei=1;

shiwei=0;

_nop_();

shiwei=1;

P2=LEDDis[number1/4%10];//送个位显示

gewei=0;

_nop_();

gewei=1;

}

void PWM( uchar count)

{

pwm=1;

delay(count);

//display();

pwm=0;

delay(100-count);

display();//转速显示

}

main()

{

static uchar count;//脉冲宽度数

static uchar on_off=0;//on_off设为启停标志位

pwm=0;

direction=0;

initial();

while(1){

PWM (count);

if(start_stop==0){ //启停按键扫描

delay(100); //按键消抖

if(start_stop==0){

while(!start_stop); //松手检测

if(on_off){

on_off=0;

count=0;

}

else{

on_off=1;

count=50;//启动是瞬时电流大,采用半电压启动

if(count>=60){

count=60;

}

else{

count++;

}

}

while(speedup&speeddown&reverse&start_stop){

PWM(count);

}

}

}

if(!speedup){ //加速检测

delay(100);

if(!speedup){

while(!speedup);

count++;

if(count>=100){

count=100;

}

while(speedup&start_stop&reverse&speeddown){

PWM(count);

}

}

}

if(!speeddown){ // 减速检测

delay(100);

if(!speeddown){

while(!speeddown);

if(count<=1){

count=0;

}

else{

count--;

}

while(speedup&start_stop&reverse&speeddown){

PWM(count);

}

}

}

if(!reverse){ // 换向检测

delay(100);

if(!reverse){

while(!reverse);

direction=!direction;

while(speedup&start_stop&reverse&speeddown){

PWM(count);

}

}

}

}

}

以上就是关于52单片机直流电机正反转程序全部的内容,包括:52单片机直流电机正反转程序、求测速直流电机的c程序、用单片机C51驱动直流电机,可调转速的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9381310.html

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

发表评论

登录后才能评论

评论列表(0条)

保存