用C51编写由T0T1口输出PWM波,占空比在19,频率可调的的程序,急

用C51编写由T0T1口输出PWM波,占空比在19,频率可调的的程序,急,第1张

调其中的speed,即时调整占空比,调t即是调周期的长短

/ 晶振采用110592M,产生的PWM的频率约为91Hz /

#include<reg51h>

#include<mathh>

#define uchar unsigned char

#define uint unsigned int

sbit en1=P1^0; / L298的Enable A /

sbit s1=P1^2; / L298的Input 1 /

sbit s2=P1^3; / L298的Input 2 /

uchar t=0; / 中断计数器 /

uchar m1=0; / 电机1速度值 /

uchar tmp1,tmp2; / 电机当前速度值 /

/ 电机控制函数 index-电机号(1,2); speed-电机速度(-100—100) /

void motor(uchar index, char speed)

{

if(speed>=-100 && speed<=100)

{

if(index==1) / 电机1的处理 /

{

m1=abs(speed); / 取速度的绝对值 /

if(speed<0) / 速度值为负则反转 /

{

s1=0;

s2=1;

}

else / 不为负数则正转 /

{

s1=1;

s2=0;

}

}

}

}

void delay(uint j) / 简易延时函数 /

{

for(j;j>0;j--);

}

void main()

{

uchar i;

TMOD=0x02; / 设定T0的工作模式为2 /

TH0=0x9B; / 装入定时器的初值 / 定时101us

TL0=0x9B;

EA=1; / 开中断 /

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

TR0=1; / 启动定时器0 /

while(1) / 电机实际控制演示 /

{

for(i=0;i<=100;i++) / 正转加速 /

{

motor(1,i);

delay(5000);

}

for(i=100;i>0;i--) / 正转减速 /

{

motor(1,i);

delay(5000);

}

for(i=0;i<=100;i++) / 反转加速 /

{

motor(1,-i);

delay(5000);

}

for(i=100;i>0;i--) / 反转减速 /

{

motor(1,-i);

delay(5000);

}

}

}

void timer0() interrupt 1 / T0中断服务程序 /

{

if(t==0) / 1个PWM周期完成后才会接受新数值 /

{

tmp1=m1;

tmp2=m2;

}

if(t<tmp1) en1=1; else en1=0; / 产生电机1的PWM信号 /

t++;

if(t>=100) t=0; / 1个PWM信号由100次中断产生 /

}

编程主要看懂计数器的工作方式就行了,MEGA48的计数器本身就有PWM工作模式,你仔细看看MEGA48的资料就行了。编译环境用AvrStudio4xx版本,下载软件可使用AVRISPL、PonyProg2000、USBISP等。如果是初学,建议采购一块开发板,或者去双龙电子网站下载相关技术资料。

viod function(PORT,PWM)

{

int i=0;

while(1)

{

i++;

if(i<PWM)

{PORT=1;

}

if(PWM<i<100)

{PORT=0;

}

if(i=100)

{i=0;

}

}

子程序,初始化什么的,自己参照教程加进去,在main()函数里调用这个子程序,通过改变PWM,和100的值可以改变PWM频率

PWMH DATA 30H ;高电平脉冲的个数

PWM DATA 31H ;PWM周期

COUNTER DATA 32H

TEMP DATA 33H

ORG 0000H

AJMP MAIN

ORG 000BH

AJMP INTT0

ORG 0100H

MAIN:

MOV SP,#60H ;给堆栈指针赋初值

MOV PWMH,#02H ;

MOV COUNTER,#01H

MOV PWM,#15H

MOV TMOD,#02H ;定时器0在模式2下工作

MOV TL0,#38H ;定时器每200us产生一次溢出

MOV TH0,#38H ;自动重装的值

SETB ET0 ;使能定时器0中断

SETB EA ;使能总中断

SETB TR0 ;开始计时

KSCAN:

JNB P11,K1CHECK ;扫描KEY1,

JNB P12,K2CHECK ;扫描KEY2,如果按下KEY2,跳转到KEY2处理程序

SJMP KSCAN

K1CHECK:

JB P11,K1HANDLE ;去抖动,如果按下KEY1,跳转到KEY1处理程序

SJMP K1CHECK

K1HANDLE:

MOV A,PWMH

CJNE A,PWM,K1H0 ;判断是否到达上边界

SJMP KSCAN ;是,则不进行任何 *** 作

K1H0:

MOV A,PWMH

INC A

CJNE A,PWM,K1H1 ;如果在加1后到达最大值

CLR TR0 ;定时器停止

SETB P10 ;P10为高电平

SJMP K1H2

K1H1:

CJNE A,#02H,K1H2 ;如果加1后到达下边界

SETB TR0 ;重开定时器

K1H2:

INC PWMH ;增加占空比

SJMP KSCAN

K2CHECK:

JB P12,K2HANDLE ;去抖动,如果按下KEY2,跳转到KEY2处理程序

SJMP K2CHECK

K2HANDLE:

MOV A,PWMH

CJNE A,#01H,K2H0 ;判断是否到达下边界

SJMP KSCAN ;是,则不进行任何 *** 作

K2H0:

MOV A,PWMH

MOV TEMP,PWM

DEC A

CJNE A,#01H,K2H1 ;如果在减1后到达下边界

CLR TR0 ;定时器停止

CLR P10 ;P10为低电平

SJMP K2H2

K2H1:

DEC TEMP

CJNE A,TEMP,K2H2 ;如果到达上边界

SETB TR0 ;启动定时器

K2H2:

DEC PWMH ;降低占空比

SJMP KSCAN

INTT0:

PUSH PSW ;现场保护

PUSH ACC

INC COUNTER ;计数值加1

MOV A,COUNTER

CJNE A,PWMH,INTT01 ;如果等于高电平脉冲数

CLR P10 ;P10变为低电平

INTT01:

CJNE A,PWM,INTT02 ;如果等于周期数

MOV COUNTER,#01H ;计数器复位

SETB P10 ;P10为高电平

INTT02:

POP ACC ;出栈

POP PSW

RETI

END

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;

//TIM3设置

TIM_DeInit(TIM3);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //clock

//定时器pwm模式

TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); //其它默认值

TIM_TimeBaseStructureTIM_Period = 20000-1; //重载定时器周期,ARPE=1时更新事件时//

TIM_TimeBaseStructureTIM_Prescaler = 0; //定时器时钟分频数,下次更新事件时采用//

TIM_TimeBaseStructureTIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割//

TIM_TimeBaseStructureTIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

TIM_OCStructInit(&TIM_OCInitStructure); //其它默认值

TIM_OCInitStructureTIM_OCMode = TIM_OCMode_PWM1;

TIM_OCInitStructureTIM_OutputState =TIM_OutputState_Enable; //输出禁止

TIM_OCInitStructureTIM_Pulse = 11000; //延时时间

TIM_OC1Init(TIM3, &TIM_OCInitStructure);

//TIM_OC1FastConfig(TIM3, TIM_OCFast_Enable);

//TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable); //通道预装载使能

TIM_Cmd(TIM3, ENABLE);

时钟频率72M,pwm频率=72M/20000=36K

55%=11000/20000

以上就是关于用C51编写由T0/T1口输出PWM波,占空比在1/9,频率可调的的程序,急全部的内容,包括:用C51编写由T0/T1口输出PWM波,占空比在1/9,频率可调的的程序,急、需要用MEGA48芯片编写一个PWM程序,就是脉宽300us,占空比10%的脉冲,希望有人能教我下,怎么写程序。、C8051的C语言编程产生占空比可调的PWM波等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/zz/10211420.html

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

发表评论

登录后才能评论

评论列表(0条)

保存