怎么可能搞不了三路独立的呢楼下那位是被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波形等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)