求51单片机PWM程序(一个定时器产生三路PWM 可独立运作) 简单来说就是用三路独立的pwm控制三个LED

求51单片机PWM程序(一个定时器产生三路PWM 可独立运作) 简单来说就是用三路独立的pwm控制三个LED,第1张

怎么可能搞不了三路独立的呢楼下那位是被STC12C5A60S2的硬件蒙蔽了视线,他认为,STC12C只有两路PWM,无法实现3路,你却忘记了最原始的办法,不要说STC12有PWM功能,即使是传统的AT89S52这类没有PWM功能的单片机也一样能够实现楼主的要求

下面我简单的分析一下我的思路,楼主尝试编程,如果不懂,再追问:

你是用三路独立的PWM调光用的,PWM调光,为了保证不让人眼产生闪烁,理论上PWM的频率要大于20Hz,而在实际的测试用,一般PWM要大于25Hz才能保证不闪烁为了保险起见,我们将PWM的频率设定在30Hz左右,那么,周期就是33333333ms,假设,我们实现10级调光,那个 每级的时间是333333ms

然后设置三个变量和一个计数器,我描述不太清楚,你看一下程序:

sbit P1_0 = P1^0; //---P10,P11,P12是三路PWM输出

unsigned char Set_PWM0 = 0; //--Set_PWM0 Set_PWM1 Set_PWM2

//--分别是低电平占整个脉冲的百分比

//--他们最小取0,最大取9

unsigned char counter = 0;//--用于计数的

void ISR_Timer0(void) interrupt 1 //---我们就用定时器0来做,不用PWM硬件

{ //----33333ms中断一次

counter++;

if(counter >= 10) counter = 0;

if(counter >= Set_PWM0) P1_0 = 0; else P1_0 = 1;

if(counter >= Set_PWM1) P1_1 = 0; else P1_1 = 1;

if(counter >= Set_PWM2) P1_2 = 0; else P1_2 = 1;

}

这样,定时器0用于决定PWM的反占空比,你只要设置 Set_PWM0等三个参数就可以了

怎么会实现不了呢

给你发一个我以前的,产生PWM输出的在定时time0中断里进行判断,你进行一些更改吧

;FINT0 EQU 20H1 ;全局标志位

;;;;;;;;定时时间;;;;;;;

time0_h EQU 40H;#0ffh 定时器高位

time0_l EQU 41H;#0f6h 定时器低位

PWM_TIME EQU 42H;#0x0c9总脉宽的数据

t_0 EQU 30H;进入定时中断的次数

motor_r EQU 31H;右电机PWM数据 大于#64H反转小于#64H正转

motor_l EQU 32H;左电机PWM数据 大于#64H反转小于#64H正转

;;;;;;;;声音;;;;;;;;;;;

sound bit P2^0;声音端口

;;;;;;;;电机控制;;;;;;;

PWM1 bit P2^1;右电机速度

PWM2 bit P2^2;左电机速度

EN1 bit P2^6;右电机使能

EN2 bit P2^7;左电机使能

;;;;;;;启动安扭;;;;;;;;

start bit P3^2;开始按键

;;;;;;;输入;;;;;;;;;;;;

S1 bit P1^4;IN1输入 传感器1输入

S2 bit P1^5;IN2输入 传感器2输入

S3 bit P1^6;IN3输入 传感器3输入

S4 bit P1^7;IN4输入 传感器4输入

;;;;;;输出;;;;;;;;;;;;

out1 bit P1^0;OUT1输出

out2 bit P1^1;OUT2输出

out3 bit P1^2;OUT3输出

out4 bit P1^3;OUT4输出

;;;;;;机构电机;;;;;;;;;;

J_Z bit P2^3;机构电机正转 01 10 11

J_F bit P2^4;机构电机反转

ORG 0000H ;程序开始

AJMP MAIN ;跳转到主程序

ORG 0003H ;中断0开始地址

AJMP INT_0 ;跳转到中断0子程序

ORG 000BH ;T0中断入口地址

AJMP INT_T0 ;跳转到定时中断0子程序

ORG 0100H ;主程序开始地址

MAIN: ;主程序标号

CLR EN1 ;关电机始能

CLR EN2

CLR EA ;关总始能

CALL DLY_200MS ;延时

CALL INIT ;初始化

JB start,$ ;查询开始键

CALL DLY_200MS ;

CLR sound ;发声

CALL DLY_200MS

SETB sound ;停止发声

SETB EA ;开全局中断

MOV R0,#20H

CALL motorr_z

MOV R0,#20H

CALL motorl_z

MAIN_M:

JNB S1,TURNLEFT

JNB S2,TURNRIGHT

MOV R0,#20H

CALL motorr_z

CALL motorl_z

JMP MAIN_M

;===================================

TURNLEFT:

JB S1,MAIN_M

CALL DELAY

JB S1,MAIN_M

MOV R0,#30H

CALL motorr_z

CLR EN2

JMP MAIN_M

;===================================

TURNRIGHT:

JB S2,MAIN_M

CALL DELAY

JB S2,MAIN_M

MOV R0,#30H

CALL motorl_z

CLR EN1

JMP MAIN_M

;===================================

STOP:

CLR EN2

CLR EN1

RET

;===================================

;;电机1正转

motorr_z:

MOV A,R0

ADD A,#64H

MOV motor_r,A

SETB EN1

RET

;===================================

;;电机1反转

motorr_f:

MOV A,#64H

SUBB A,R0

MOV motor_r,A

SETB EN1

RET

;===================================

;;电机2正转

motorl_z:

MOV A,#64H

SUBB A,R0

MOV motor_l,A

SETB EN2

RET

;===================================

;;电机2反转

motorl_f:

MOV A,R0

ADD A,#64H

MOV motor_l,A

SETB EN2

RET

;===============初始化==============

INIT:

MOV SP,#60H

MOV TMOD, #21H

;MOV SCON, #52H

MOV TCON, #69H

;MOV TH1, #FDH

MOV 40H,#0ffh

MOV 41H,#0f6h

MOV TH0,time0_h

MOV TL0,time0_l

MOV 42H,#0x0c9 ;1---201 大于100反转小于100正转

SETB EX0 ;INT0中断开

CLR IT0 ;INT0下降沿触发(为0则为低电平触发)

SETB TR0

SETB ET0

RET

;==============T0中断子程序

INT_T0:

PUSH ACC

PUSH PSW

CLR TR0

MOV TH0,time0_h

MOV TL0,time0_l

INC t_0

MOV A,t_0

CLR C

SUBB A,motor_r ;pwm1

JC PWM_2

CLR PWM1

PWM_2:

MOV A,t_0

CLR C

SUBB A,motor_l

JC HIGHT

CLR PWM2

HIGHT:

MOV A,t_0

CJNE A,#0C9H,EXIT

CLR A

MOV t_0,A

SETB PWM1

SETB PWM2

EXIT:

SETB TR0

POP PSW

POP ACC

RETI

;;=========================外中断

INT_0:

CLR EN1

CLR EN2

CLR EA

;CLR FINT0

JMP $

RETI

DLY_200MS:

MOV R5,#01H

DLY_200MS1:

MOV R6,#00H

DLY_200MS2:

MOV R7,#00H

DLY_200MS3:

NOP

DJNZ R7,DLY_200MS3

DJNZ R6,DLY_200MS2

DJNZ R5,DLY_200MS1

RET

DELAY: MOV R5,#20 ;

D2: MOV R7,#248

DJNZ R7,$

DJNZ R5,D2

RET

END

单片机产生PWM波形波形的方法:

主要是采用软件控制,控制2个时间。

具体就是由单片机的引脚输出PWM波形;单片机引脚

如P17

控制其输出高电平的时间T1

和输出低电平的时间T2。

PWM波形的周期T=T1+T2

PWM波形的占空比=(100T1/T)%

PWM波形实现的算法:

1

根据PWM波形的频率f,计算出PWM波形的周期T=1/f;

2

根据PWM波形的占空比

计算出高电平时间

T1=占空比×T

3

计算出低电平时间

T2=T-T1

4

按上述时间去控制

单片机引脚高低电平的时间就可以了。

呵呵

赶快自己写程序吧

别忘了给俺加分呀

用EVA事件管理器产生 重点看哈那张的内容 占空比有公式计算 自己动手做了才知道是怎么回事

/

文件名:EvPwm02c

功 能:PWM1和PWM2输出频率为1KHz的PWM波形。波形的占空比每隔1s变化5%,范围在10%

到90%之间。

说 明:EVA下面的通用定时器T1工作于连续增/减计数模式,产生对称的PWM波形。通过

T1的周期中断来计时,每隔1s钟改变1次占空比。死区时间为427us。

/

#include "DSP28_Deviceh"

#include "DSP28_Globalprototypesh"

Uint32 intcount;

int increase;

int decrease;

/

名 称:main()

功 能:初始化系统和各个外设

入口参数:无

出口参数:无

/

void main(void)

{

InitSysCtrl(); //初始化系统函数

DINT;

IER = 0x0000; //禁止CPU中断

IFR = 0x0000; //清除CPU中断标志

InitPieCtrl(); //初始化PIE控制寄存器

InitPieVectTable(); //初始化PIE中断向量表

InitGpio(); //初始化Gpio口

InitEv(); //初始化EV

intcount=0; //T1定时器周期中断计数器

increase=0; //占空比逐渐变小的变化趋势标志位

decrease=1; //占空比逐渐变大的变化趋势标志位

PieCtrlPIEIER2bitINTx4=1; //使能PIE中断,T1定时器中断位于INT24

IER|=M_INT2;

EINT; //开全局中断

ERTM; //开实时中断

EvaRegsT1CONbitTENABLE=1; //使能定时器T1计数 *** 作

while(1)

{

}

}

以上就是关于求51单片机PWM程序(一个定时器产生三路PWM 可独立运作) 简单来说就是用三路独立的pwm控制三个LED全部的内容,包括:求51单片机PWM程序(一个定时器产生三路PWM 可独立运作) 简单来说就是用三路独立的pwm控制三个LED、C51产生PWM波形汇编程序,哪位大仙帮帮我呀~、怎么用单片机产生PWM波形等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存