利用单片机定时器产生的占空比可调的PWM程序,采用C51(AT89s51)编写的C语言程序,输出口为P1.7

利用单片机定时器产生的占空比可调的PWM程序,采用C51(AT89s51)编写的C语言程序,输出口为P1.7,第1张

我有一个可以借鉴一下:

//

// 利用定时器控制产生占空比可变的 PWM 波

// 按K5,PWM值增加,则占空比减小,LED 灯渐暗。

// 按K6,PWM值减小,则占空比增加,LED 灯渐亮。

// 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。

//

#include < reg51h >

#include < intrinsh >

sbit K5 =P3^2 ; //增加键

sbit K6 =P3^3 ; //减少键

sbit BEEP =P3^7 ; //蜂鸣器

unsigned char PWM=0x7f ; //赋初值

void Beep();

void delayms(unsigned char ms);

//

void main()

{

P2=0xff;

TMOD=0x21 ;

TH0=0xfc ; //1ms延时常数 12M

TL0=0x18 ; //频率调节

// TH1=PWM ; //脉宽调节

// TL1=0 ;

EA=1;

ET0=1;

ET1=1;

TR0=1 ;

while(1)

{

do{

if(PWM!=0xff)

{PWM++ ;delayms(10);}

else Beep() ;

}

while(K5==0);

do{

if(PWM!=0x00)

{PWM-- ;delayms(10);}

else Beep() ;

}

while(K6==0);

}

}

//

// 定时器0中断服务程序

//

void timer0() interrupt 1

{

// TR1=0 ;

TH0=0xfc ;

TL0=0x66 ;

TR1=1 ;

P2=0x00 ; //启动输出

}

//

// 定时器1中断服务程序

//

void timer1() interrupt 3

{

TH1=PWM ; //用定时器的方式2,是数据重装TH-TL中,改变PWM的值即该变定时器的初值

TR1=0 ;

P2=0xff ; //结束输出

}

//

//蜂鸣器子程序

//

void Beep()

{

unsigned char i ;

for (i=0 ;i<100 ;i++)

{

delayms(2) ;

BEEP=!BEEP ; //Beep取反

}

BEEP=1 ; //关闭蜂鸣器

delayms(100);

}

//

// 延时子程序

//

void delayms(unsigned char ms)

{

unsigned char i ;

while(ms--)

{

for(i = 0 ; i < 120 ; i++) ;

}

}

//

你想让输出口是P1^7,我这用的是P2口为输出,将其变化一下即可,希望对你有用!!!!!!!

使用一个定时器,在定时中断里面定义一个变量t,每次中断时这个变量t+1,当t到需要的频率周期cycle_time时,这个变量清t=0;而另外一个就是占空比Ton,当t到Ton时对某端口取反,而这个端口在t=0时复原。

上面的cycle_time是全局变量,随时根据程序更新,从而达到频率调整,当然Ton也是随时更新。

先要调用T IM_OC1Init() 初始化 TIMx

再调用 TIM_OC1PreloadConfig() 使能TIMx通道1

TIMx->ARR =TIM_Period; //调节周期

TIMx->CCR1 =TIM_Pulse;//调节占空比的时间

ORG 00H

AJMP GO

ORG 0BH

AJMP TIME0_1

ORG 30H

GO:

MOV SP,#60H

MOV TMOD,#01H

MOV TH0,#0B0H

MOV TL0,#3CH ;50MS

MOV R5,#5 ;中断间隔计次

MOV R6,#2 ;2中断为100MS

MOV R7,#0 ;取表序号数

LOOP:

MOV DPTR,#TAB

MOV A,R7

MOVC A,@A+DPTR

MOV P3,A

AJMP LOOP

TIME0_1:

PUSH ACC

DJNZ R6,RTT

MOV R6,#2 ;2次中断为100ms

INC R7 ;取表加1

DJNZ R5,RTT ;中断间隔次5次,2次为高电平,3次低电平,40%占空比

MOV R5,#5

MOV R7,#0

RTT:

POP ACC

RETI

TAB:

DB 80H,80H,00H,00H,00H

END

周期20毫秒,占空比5%~10%,所以高电平为1ms~2ms,以1%变化为调节量(200us)计算来设计程序。

#include<reg51h>

#define uchar unsigned char

sbit pwm=P1^0;

uchar u_p=5,num=0;

void t0isr() interrupt 1

{

num++;

if(num<=u_p)pwm=1;

if(num>u_p)pwm=0;

num%=100;

}

void uart() interrupt 4

{

if(RI)

{

RI=0;

u_p=SBUF;

}

}

main()

{

TMOD=0x22;

TH0=56;

TL0=56;

TH1=0xfd;

TL1=0xfd;

TR0=1;

TR1=1;

ET0=1;

ES=1;

EA=1;

pwm=1;

while(1);

}

以上就是关于利用单片机定时器产生的占空比可调的PWM程序,采用C51(AT89s51)编写的C语言程序,输出口为P1.7全部的内容,包括:利用单片机定时器产生的占空比可调的PWM程序,采用C51(AT89s51)编写的C语言程序,输出口为P1.7、如何用软件控制方波占空比及频率、32单片机怎样调占空比CCR1在哪个地方调呀等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存