pic用pwm方式如何控制直流电机的程序 按键按一下增加转速 另一个按键按一下减少转速

pic用pwm方式如何控制直流电机的程序 按键按一下增加转速 另一个按键按一下减少转速,第1张

这几天在学PIC16F877A 参照郭天祥的按键检测 还有一个兄弟的PWM控制 学的

///////////////////////////////////////////////////////////////

////////A端口 数码管(共阴)的位选/////D端口数码管 段选

/////////RB0~3 按键(+上拉电阻) RC2 输出 蜂鸣器RE0

#include<pic.h>

#define uchar unsigned char

#define uint unsigned int

__CONFIG(0x3B31)

const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}

uchar key_num,a,b,c

int pwm

bit pwmflag=0

void delay(uint x)

void init()

void scan()

void didi(uchar num)

void disp(uchar num1,uchar num2,uchar num3,uchar num4,uchar num5,uchar num6)

void main()

{

init()

while(1)

{

T2CON=0X7f //打开定时器2

PR2=255 //PWM 的工作周期(可以调整频率1/T)=(PR2+1)*4*Tosc*TMR2预分频比

CCPR1L=pwm //PWM匹配初值,调整占空比:x/y-PR2(PR2设定)

CCP1CON=0X3C//设置CCP1 模块为PWM 工作方式

TRISC=0XFB//设置CCP1 引脚为输出方式

//delay(20)

//if(pwmflag=0){pwm++}

// if(pwm>=255){pwmflag=1}

// if(pwmflag=1){pwm--}

// if(pwm<=30){pwmflag=0}

a=pwm/100b=pwm%100/10c=pwm%10

scan()

disp(key_num,2,3,a,b,c)

}

}

void delay(uint x)

{

uint a,b

for(a=xa>0a--)

for(b=110b>0b--)

}

void init()

{

TRISB=0xff

TRISD=0

TRISA=0

TRISE0=0

RE0=0

PORTD=0

PORTA=0

}

void scan()

{

if(RB0==0)

{

delay(10)

if(RB0==0)

{ pwm++

if(pwm>=255){pwm=1}

didi(1)

while(!RB0)

{

disp(key_num,2,3,a,b,c)

key_num=1//PORTD=0x01

}

}

}

if(RB1==0)

{

delay(10)

if(RB1==0)

{ pwm--

if(pwm<=1){pwm=255}

didi(1)

while(!RB1)

{

disp(key_num,2,3,a,b,c)

key_num=2//PORTD=0x02}

}

}

}

if(RB2==0)

{

delay(10)

if(RB2==0)

{ pwm+=50

if(pwm>=255){pwm=1}

didi(1)

while(!RB2)

{

disp(key_num,2,3,a,b,c)

key_num=3//PORTD=0x04

}

}

}

if(RB3==0)

{

delay(10)

if(RB3==0)

{ pwm-=50

if(pwm<=1){pwm=255}

didi(1)

while(!RB3)

{

disp(key_num,2,3,a,b,c)

key_num=4//PORTD=0x08

}

}

}

}

void didi(uchar num) //蜂鸣器

{

uchar di_num

for(di_num=numdi_num>0di_num--)

{

RE0=1

delay(50)

RE0=0

delay(20)

}

}

////////A端口 数码管(共阴)的位选/////D端口数码管 段选

void disp(uchar num1,uchar num2,uchar num3,uchar num4,uchar num5,uchar num6)

{

PORTD=table[num1]//显示第一个数码管

PORTA=0x20//0010 0000

delay(2)

PORTD=table[num2]//显示第二个数码管

PORTA=0x10//0001 0000

delay(2)

PORTD=table[num3]//显示第三个数码管

PORTA=0x08//0000 1000

delay(2)

PORTD=table[num4]//显示第四个数码管

PORTA=0x04//0000 0100

delay(2)

PORTD=table[num5]//显示第五个数码管

PORTA=0x02//0000 0010

delay(2)

PORTD=table[num6]//显示第六个数码管

PORTA=0x01//0000 0001

delay(2)

}

我想说 如果你懂proteus 你完全可以按照 他的原理图 自己分解开然后到 proteus仿真

自己画 编程调试 。这样两样都可以学习。

据我目前了解 好像没有谁做过。感觉有模块是没法做到效果的 比如红外,超声波之类的。。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存