单片机C语言编程:用PWM控制直流电机转速

Python018

单片机C语言编程:用PWM控制直流电机转速,第1张

#include

<AT89X51.H>

#define

uchar

unsigned

char

/*****************************************************************************

*

TH0和TL0是计数器0的高8位和低8位计数器,计算办法:TL0=(65536-C)%256

*

*

TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器*

*

工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时

*

*

间为1ms*65536=65.536ms

*

******************************************************************************/

#define

V_TH0

0XFF

#define

V_TL0

0XF6

#define

V_TMOD

0X01

void

init_sys(void)

/*系统初始化函数*/

void

Delay5Ms(void)

unsigned

char

ZKB1,ZKB2

void

main

(void)

{

init_sys()

ZKB1=40

/*占空比初始值设定*/

ZKB2=70

/*占空比初始值设定*/

while(1)

{

if

(!P1_1)

//如果按了+键,增加占空比

{

Delay5Ms()

if

(!P1_1)

{

ZKB1++

ZKB2=100-ZKB1

}

}

if

(!P1_2)

//如果按了-键,减少占空比

{

Delay5Ms()

if

(!P1_2)

{

ZKB1--

ZKB2=100-ZKB1

}

}

/*对占空比值限定范围*/

if

(ZKB1>99)

ZKB1=1

if

(ZKB1<1)

ZKB1=99

}

}

/******************************************************

*函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/

void

init_sys(void)

/*系统初始化函数*/

{

/*定时器初始化*/

TMOD=V_TMOD

TH0=V_TH0

TL0=V_TL0

TR0=1

ET0=1

EA=1

}

//延时

void

Delay5Ms(void)

{

unsigned

int

TempCyc

=

1000

while(TempCyc--)

}

/*中断函数*/

void

timer0(void)

interrupt

1

using

2

{

static

uchar

click='0'

/*中断次数计数器变量*/

TH0=V_TH0

/*恢复定时器初始值*/

TL0=V_TL0

++click

if

(click>=100)

click='0'

if

(click<=ZKB1)

/*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/

P1_3=0

else

P1_3=1

if

(click<=ZKB2)

P1_4=0

else

P1_4=1

}只是调占空比的,希望对你有帮助,调试好的

给个我自己写的程序你,我试过了,通过!

#include

#define

uchar

unsigned

char

#define

uint

unsigned

int

sbit

P0_0=P0^0

uchar

a

/*********************************************

*

TH0和TL0是计数器0的高8位和低8位计数器,

*

计算办法:TL0=(65536-C)%256

*

TH0=(65536-C)/256,

*

其中C为所要计数的次数即多长时间产生一次中断;

*

TMOD是计数器工作模式选择,0X01表示选用模式1,

*

它有16位计数器,最大计数脉冲为65536,最长时间

*

为1ms*65536=65.536ms

*

*********************************************/

void

init_sys(void)

/*系统初始化函数*/

void

main

(void)

{

init_sys()

while(1)

}

void

init_sys(void)

{

TMOD=0x01

TH0=(65536-10000)/256

TL0=(65536-10000)%256

EA=1

ET0=1

TR0=1

}

void

timer0(void)

interrupt

1

{

TH0=(65536-100)/256

TL0=(65536-100)%256

a++

if(a<=3)

{

P0_0=1

if(a==3)

//改变低电平持续时间

{

//也即改变占空比

P0_0=~P0_0

}

}

else

{

P0_0=0

if(a==5)

//改变周期

{

a=0

}

}

}