单片机RGB调色程序 要求基于PWM(STC系列单片机c语言)可以实现至少60种颜色调节,有多种模

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单片机RGB调色程序 要求基于PWM(STC系列单片机c语言)可以实现至少60种颜色调节,有多种模相关的知识,希望对你有一定的参考价值。

单片机RGB调色程序 要求基于PWM(STC系列单片机c语言)可以实现至少60种颜色调节,有多种模式选择,程序有详细注释简单易懂

选用STC12C56XX的单片机,利用三路PWM来调色就简单了,再多的颜色无非是把表格做的大点,利用查表法,来获取颜色的PWM寄存器的初装值就可以了。追问

能给个参考程序吗?

参考技术A

用定时器做出三路PWM

追问

能给个示范程序吗?

追答

新建文本文档里有程序例子

追问

闪烁 没有颜色变化

追答

你在主程序里调节r,g,b三个变量的值就能变颜色了

追问

三种颜色的灯在闪烁

完全没有到达调节颜色的目的

还是三基色

追答

void time0_int() interrupt 1

PWM++;
if(r>PWM)
PWM1 = 0;//当r大于PWM时管脚输出低电平
else
PWM1 = 1;//当r不大于PWM时管脚输出高电平

if(g>PWM)
PWM2 = 0;
else
PWM2 = 1;

if(b>PWM)
PWM3 = 0;
else
PWM3 = 1;


if里面的条件忘了改了

追问

无法调节颜色

只是亮度在改变

追答

三个值不要调一样,另外三个管脚你怎么连接的

追问

1.0接r1.1g1.2b

公共端接电源

追答

如果闪烁比较严重可以把TH0和TL0的值调大些,TH0等于TL0

追问

如何做到这种效果

你的程序看起来三基色还是彼此分离的

没有组合成新颜色

本回答被提问者和网友采纳

STC15系列CCP/PWM/PCA介绍

STC15系列CCP/PWM/PCA介绍


  • CCP:是英文单词的缩写Capture(捕获),Compare(比较),PWM(脉宽调制)

STC15系列部分单片机集成了3路可编程计数器阵列(CCP/PCA)模块,可用于软件定时器外部脉冲的捕捉高速脉冲输出以及脉宽调制(PWM)输出


与CCP/PWM/PCA应用有关的特殊功能寄存器

  • STC15系列 1T 8051单片机 CCP/PCA/PWM特殊功能寄存器表

PCA控制寄存器:CCON

  • PCA控制寄存器
  • CF:PCA计数器阵列溢出标志位。当PCA计数器溢出时 CF由硬件置位。如果CMOD寄存器
    的ECF位置位, CF标志可用来产生中断。CF位可通过硬件或软件置位, 但只可通过软件清零。
  • CR:PCA计数器阵列 位通过软件置位, 用来起动PCA计数器阵列计数。该位通过软件清零, 用来关闭PCA计数器。
  • CCF2:PCA模块2中断标志。当出现匹配或捕获时该位由硬件置位。该位必须通过软件清零。
  • CCF1:PCA模块1中断标志。当出现匹配或捕获时该位由硬件置位。该位必须通过软件清零。
  • CCF0:PCA模块0中断标志。当出现匹配或捕获时该位由硬件置位。该位必须通过软件清零。

PCA工作模式寄存器:CMOD

  • PCA工作模式寄存器(PCA时钟源设置寄存器)
  • CIDL:空闲模式下是否停止PCA计数的控制位。

当CIDL=0时, 空闲模式下PCA计数器继续工作
当CIDL=1时,空闲模式下 PCA计数器停止工作。

  • CPS2、CPS1、CPS0:PCA计数脉冲源选择控制位。PCA计数脉冲选择如下表所示。
  • 例如,CPS2/CPS1/CPS0 = 1/0/0时,CCP/PCA/PWM的时钟源是SYSclk,不用定时器0,PWM的频率为SYSclk/256.
  • 如果要用系统时钟/3来作为PCA的时钟源,应选择TO的溢出作为CCP/PCA/PWM的时钟源,此时应让T0工作在1T模式,计数3个脉冲即产生溢出。用TO的溢出可对系统时钟进行1~65536级分频(T0工作在16位重装载模式)。
  • ECF:PCA计数溢出中断使能 。

当ECF = 0时,禁止寄存器CCON中CF位的中断;
当ECF = 1时,允许寄存器CCON中CF位的中断.

3.PCA比较/捕获寄存器CCAPM0、CCAPM1和CCAPM2

  • B7:保留为将来之用。
  • ECOM0:允许比较器功能控制位
    当ECOM0=1时,允许
  • CAPP0: 正捕获控制位
    当CAPP0=1时,允许
  • CAPN0:负捕获控制位
    当CAPN0=1时 下降
  • MAT0: 匹配控制位
    当MAT0=1时,PCA计数值与模块的比较/捕获寄存器的值的匹配将置位CCON寄存器的中断标志位CCF0。
  • TOG0: 翻转控制位
    当TOG0=1时,工作在PCA高速脉冲输出 PCA计数器的值与模块的比较/捕获
    寄存器的值的匹配将使CCP0脚翻转。
    (CCP0/PCA0/PWM0/P1.1或CCP0_2/PCA0/PWM0/P3.5或CCP0_3/PCA0/PWM0/P2.5)
  • PWM0: 脉宽调节模式。
    当PWM0=1时, CCP0脚用作脉宽调节输出。
    (CCP0/PCA0/PWM0/P1.1或CCP0_2/PCA0/PWM0/P3.5或CCP0_3/PCA0/PWM0/P2.5)
    ECCF0: 使能CCF0中断。使能寄存器CCON的比较/捕获标志CCF0, 用来产生中断。

还有 CCAPM1 ,CCAPM2与上面的CCAPM0差不多

4. PCA的16位计数器 — 低8位CL和高8位CH

  • CL和CH地址分别为E9H和F9H,复位值均为00H,用于保存PCA的装载值。

5. PCA捕捉/比较寄存器 — CCAPnL(低位字节)和CCAPnH(高位字节)

当PCA模块用于捕获或比较时,它们用于保存各个模块的16位捕捉计数值;当PCA模块用
于PWM模式时,它们用来控制输出的占空比。其中,n=0、1、2,分别对应模块0、模块1和模
块2。复位值均为00H。它们对应的地址分别为:

CCAP0L — EAH、CCAP0H — FAH:模块0的捕捉/比较寄存器。
CCAP1L — EBH、CCAP1H — FBH:模块1的捕捉/比较寄存器。
CCAP2L — ECH、CCAP2H — FCH:模块2的捕捉/比较寄存器。

6. PCA模块PWM寄存器PCA_PWM0、PCA_PWM1和PCA_PWM2


  • EPC0H:在PWM模式下,与CCAP0H组成9位数。
  • EPC0L:在PWM模式下,与CCAP0L组成9位数。

PCA模块的工作模式设定表如下表所列:

将单片机的CCP/PWM/PCA功能在3组管脚之间切换的寄存器AUXR1(P_SW1)

  • 辅助寄存器1的格式



CCP/PWM/PCA模块的结构

  • STC15系列部分单片机有3路可编程计数器阵列CCP/PCA/PWM(通过AUXR1/P_SW1寄存器可以设置CCP/PCA/PWM从P1口切换到P2口切换到P3口)。
  • PCA含有一个特殊的16位定时器,有3个16位的捕获/比较模块与之相连 ,如下图所示。
  • 每个模块可编程工作在4种模式下:上升/下降沿捕获、软件定时器,高速脉冲输出或可调制脉冲输出。

  • 寄存器CH和CL的内容是正在自由递增计数的16位PCA定时器的值。PCA定时器是3个模块的公共时间基准,可通过编程工作在:1/12系统时钟、1/8系统时钟、1/6系统时钟、1/4系统时钟、1/2系统时钟、系统时钟、定时器0溢出或ECI脚的输入(STC15W4K60S4系列在P1.2或P2.4或P3.4口)。定时器的计数源由CMOD特殊功能寄存器中的CPS2,CPS1和CPS0位来确定(见CMOD特殊功能寄存器说明)。
  • CMOD特殊功能寄存器还有2个位与PCA相关。它们分别是:CIDL,空闲模式下允许停止PCA;ECF,置位时,使能PCA中断,当PCA定时器溢出将PCA计数溢出标志CF(CC0ON.7)置位。
  • CCON特殊功能寄存器包含PCA的运行控制位(CR)和PCA定时器标志(CF)以及各个模块的标志(CCF2/CCF1/CCFO)。通过软件置位CR位(CCON.6)来运行PCA。CR位被清零时PCA关闭。
  • 当PCA计数器溢出时,CF位(CCON.7)置位,如果CMOD寄存器的ECF位置位,就产生中断。CF位只可通过软件清除。CCON寄存器的位0~2是PCA各个模块的标志(位0对应模块0,位1对应模块1,位2对应模块2),当发生匹配或比较时由硬件置位。这些标志也只能通过软件清除。所有模块共用一个中断向量。PCA的中断系统如图所示。
  • PCA的每个模块都对应一个特殊功能寄存器。它们分别是:模块0对应CCAPMO,模块1对应CCAPM1,模块2对应CCAPM2,特殊功能寄存器包含了相应模块的工作模式控制位。
  • 当模块发生匹配或比较时,ECCFn位(CCAPMn.0,n=0,1,2由工作的模块决定)使能CCON特殊功能寄存器的CCFn标志来产生中断。
  • PWM(CCAPMn.1)用来使能脉宽调制模式。
  • 当PCA计数值与模块的捕获/比较寄存器的值相匹配时,如果T0G位(CCAPMn.2)置位,模块的CCPn输出将发生翻转。
  • 当PCA计数值与模块的捕获/比较寄存器的值相匹配时,如果匹配位MATn(CCAPlMn.3)置位,CCON寄存器的CCFn位将被置位。
  • CAPNn(CCAPMn.4)和CAPPn(CCAPMn.5)用来设置捕获输入的有效沿。CAPNn位使能下降沿有效,CAPPn位使能上升沿有效。如果两位都置位,则两种跳变沿都被使能,捕获可在两种跳变沿产生。
  • 通过置位CCAPMn寄存器的ECOMn位(CCAPMn.6)来使能比较器功能。
  • 每个PCA模块还对应另外两个寄存器,CCAPnH和CCAPnL。当出现捕获或比较时,它们用来保存16位的计数值。当PCA模块用在PWM模式中时,它们用来控制输出的占空比。

CCP/PCA模块的工作模式

捕获模式

PCA模块工作于捕获模式的结构图如下图所示。要使一个PCA模块工作在捕获模式,寄存器CCAPMn的两位(CAPNn和CAPPn)或其中任何一位必须置1。PCA模块工作于捕获模式时,对模块的外部CCPn输入(CCPO/P1.1,CCP1/P1.0,CCP2/P3.7)的跳变进行采样。当采样到有效跳变时,PCA硬件就将PCA计数器阵列寄存器(CH和CL)的值装载到模块的捕获寄存器中(CCAPnL和CCAPnH)。

如果CCON特殊功能寄存器中的位CCFn和CCAPMn特殊功能寄存器中的位ECCFn位被置位,将产生中断。可在中断服务程序中判断哪一个模块产生了中断,并注意中断标志位的软件清零问题。

16位软件定时器模式

通过置位CCAPMn寄存器的ECOM和MAT位,可使PCA模块用作软件定时器(上图)。PCA定时器的值与模块捕获寄存器的值相比较,当两者相等时,如果位CCFn(在CCON特殊功能寄存器中)和位ECCFn(在CCAPMn特殊功能寄存器中)都置位,将产生中断。
[CH,CL]每隔一定的时间自动加1,时间间隔取决于选择的时钟源。例如,当选择的时
钟源为SYSclk/12,每12个时钟周期[CH,CL]加1。当[CH,CL]增加到等于[CCAPnH, CCAPnL]
时,CCFn=1,产生中断请求。如果每次PCA模块中断后,在中断服务程序中断给[CCAPnH,
CCAPnL]增加一个相同的数值,那么下次中断来临的间隔时间T也是相同的,从而实现了定时
功能。定时时间的长短取决于时钟源的选择以及PCA计数器计数值的设置。下面举例说明PCA
计数器计数值的计算方法。
假设,系统时钟频率SYSclk = 18.432MHz,选择的时钟源为SYSclk/12,定时时间T为5ms,则
PCA计数器计数值为:
PCA计数器的计数值 = T / (( 1 / SYSclk )×12 ) = 0.005 / (( 1 / 18432000)×12 ) = 7680 (10进制数)
= 1E00H (16进制数)
也就是说,PCA计数器计数1E00H次,定时时间才是5ms,这也就是每次给[CCAPnH,
CCAPnL]增加的数值(步长)。

高速脉冲输出模式

该模式中(下图),当PCA计数器的计数值与模块捕获寄存器的值相匹配时,PCA模块的CCPn输出将发生翻转。要激活高速脉冲输出模式,CCAPMn寄存器的TOGn,MATn和ECOMn位必须都置位。

CCAPnL的值决定了PCA模块n的输出脉冲频率。当PCA时钟源是SYSclk/2时,输出脉冲的
频率F为:
f = SYSclk / ( 4×CCAPnL )
其中,SYSclk为系统时钟频率。由此,可以得到CCAPnL的值CCAPnL = SYSclk / ( 4×f ).
如果计算出的结果不是整数,则进行四舍五入取整,即
CCAPnL = INT (SYSclk / ( 4×f ) + 0.5 )
其中,INT( )为取整运算,直接去掉小数。例如,假设SYSclk = 20MHz,要求PCA高速脉
冲输出125kHz的方波,则CCAPnL中的值应为:
CCAPnL = INT (20000000 / ( 4×125000 ) + 0.5 ) = INT ( 40 + 0.5 ) = 40 = 28H

脉宽调节模式(PWM)

  • 脉宽调制(PWM,Pulse Width Modulation)是一种使用程序来控制波形占空比、周期、相位
    波形的技术,在三相电机驱动、D/A转换等场合有广泛的应用。

STC15系列单片机的PCA模块可以通过设定各自的寄存器PCA_PWMn (n=0,1,2.下同)中的位EBSn_1/PCA_PWMn.7及EBSn_0/PCA_PWMn.6,使其工作于8位PWM或7位PWM或6位PWM模式。

  • 8位脉宽调节模式(PWM)

当[EBSn_1,EBSn_0]=[0,0]或[1,1]时,PCA模块n工作于8位PWM模式,此时将0,CL[7:0]与捕获寄存器[EPCnL,CCAPnL[7:0]]进行比较。PWM模式的结构如下图所示。

  • 当PCA模块工作于8位PWM模式时,由于所有模块共用仅有的PCA定时器,所有它们的输出频率相同。各个模块的输出占空比是独立变化的,与使用的捕获寄存器EPCnL,CCAPnL[7:0]有关。当0,CL[7:0]的值小于EPCnL,CCAPnL[7:0]时,输出为低; 0,CL[7:0]的值等于或大于EPCnL,CCAPnL[7:0]时,输出为高。当CL的值由FF变为00溢出时,EPCnH,CCAPnH[7:0]的内容装载到EPCnL,CCAPnL[7:0]中。这样就可实现无干扰地更新PWM。要使能PWM模式,模块CCAPMn寄存器的PWMn和ECOMn位必须置位。
  • 当PWM是8位的时:

PCA时钟输入源可以从以下8种中选择一种:SYSclk, SYSclk/2, SYSclk/4,SYSclk/6,
SYSclk/8,SYSclk/12,定时器0的溢出,ECI/P1.2输入
举例: PCA模块工作于8位PWM模式。 PWM输出频率为38KHz,选SYSclk为PCA/
PWM时钟输入源,求出SYSclk的值
由计算公式38000=SYSclk/256 ,得到外部时钟频率SYSclk=38000 x 256 x 1=9,728,000
如果要实现可调频率的PWM输出,可选择定时器0的溢出率或者ECI脚的输入作为PCA/PWM
的时钟输入源。

  • 当EPCnL = 0及CCAPnL = 00H时,PWM固定输出高

  • 当EPCnL = 1及CCAPnL = FFH时,PWM固定输出低

  • 当某个I/O口作为PWM使用时,该口的状态:

  • 7位脉宽调节模式(PWM)

当[EBSn_1,EBSn_0]=[0,1]时,PCA模块n工作于7位PWM模式,此时将0,CL[6:0]与捕获寄存器[EPCnL,CCAPnL[6:0]]进行比较。PWM模式的结构如下图所示。

当PCA模块工作于7位PWM模式时,由于所有模块共用仅有的PCA定时器,所有它们的输出频率相同。各个模块的输出占空比是独立变化的,与使用的捕获寄存器EPCnL,CCAPnL[6:0]有关。当0,CL[6:0]的值小于EPCnL,CCAPnL[6:0]时,输出为低; 0,CL[6:0]的值等于或大于EPCnL,CCAPnL[6:0]时,输出为高。当CL的值由7F变为00溢出时,
EPCnH,CCAPnH[6:0]的内容装载到EPCnL,CCAPnL[6:0]中。这样就可实现无干扰地更新PWM。要使能PWM模式,模块CCAPMn寄存器的PWMn和ECOMn位必须置位。

  • 当PWM是7位的时:

PCA时钟输入源可以从以下8种中选择一种:SYSclk, SYSclk/2, SYSclk/4,SYSclk/6,
SYSclk/8,SYSclk/12,定时器0的溢出,ECI/P1.2输入。
举例:设PCA模块工作于7位PWM模式。要求PWM输出频率为38KHz,选SYSclk为PCA/
PWM时钟输入源,求出SYSclk的值。
由计算公式38000=SYSclk/128,得到外部时钟频率SYSclk=38000×128×1=4,864,000如果要实现可调频率的PWM输出,可选择定时器0的溢出率或者ECI脚的输入作为PCA/PWM的时钟输入源
当EPCnL=0及CCAPnL=80H时,PWM固定输出高当EPCnL=1及CCAPnL=OFFH时,PWM固定输出低

  • 6位脉宽调节模式(PWM)

当[EBSn_1,EBSn_0]=[1,0]时,PCA模块n工作于6位PWM模式,此时将0,CL[5:0]与捕获寄存器[EPCnL,CCAPnL[5:0]]进行比较。PWM模式的结构如下图所示。

当PCA模块工作于6位PWM模式时,由于所有模块共用仅有的PCA定时器,所有它们的输出频率相同。各个模块的输出占空比是独立变化的,与使用的捕获寄存器EPCnL,CCAPnL[5:0]有关。当0,CL[5:0]的值小于EPCnL,CCAPnL[5:0]时,输出为低; 0,CL[5:0]的值等于或大于EPCnL,CCAPnL[5:0]时,输出为高。当CL的值由3F变为00溢出时,
EPCnH,CCAPnH[5:0]的内容装载到EPCnL,CCAPnL[5:0]中。这样就可实现无干扰地更新PWM。要使能PWM模式,模块CCAPMn寄存器的PWMn和ECOMn位必须置位。

  • 当PWM是6位的时:
  • PCA时钟输入源可以从以下8种中选择一种:SYSclk,SYSclk/2,SYSclk/4,SYSclk/6,SYSclk/8,SYSclk/12,定时器0的溢出,ECI/P1.2输入。

举例:设PCA模块工作于6位PWM模式。要求PWM输出频率为38KHz,选SYSclk为PCA/PWM时钟输入源,求出SYSclk的值。
由计算公式38000=SYSclk/64,得到外部时钟频率SYSclk=38000×64x1=2,432,000如果要实现可调频率的PWM输出,可选择定时器0的溢出率或者ECI脚的输入作为PCA/PWM的时钟输入源

  • 当EPCnL=0及CCAPnL=0C0H时,PWM固定输出高当EPCnL=1及CCAPnL=0FFH时,PWM固定输出低。

示例程序

用CCP/PCA功能扩展外部中断的测试程序

//假定测试芯片的工作频率为18.432MHz
#include "reg51.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
sfr P_SW1 = 0xA2; //外设功能切换寄存器1
#define CCP_S0 0x10 //P_SW1.4
#define CCP_S1 0x20 //P_SW1.5
sfr CCON = 0xD8; //PCA控制寄存器
sbit CCF0 = CCON^0; //PCA模块0中断标志
sbit CCF1 = CCON^1; //PCA模块1中断标志
sbit CR = CCON^6; //PCA定时器运行控制位
sbit CF = CCON^7; //PCA定时器溢出标志
sfr CMOD = 0xD9; //PCA模式寄存器
sfr CL = 0xE9; //PCA定时器低字节
sfr CH = 0xF9; //PCA定时器高字节
sfr CCAPM0 = 0xDA; //PCA模块0模式寄存器
sfr CCAP0L = 0xEA; //PCA模块0捕获寄存器 LOW
sfr CCAP0H = 0xFA; //PCA模块0捕获寄存器 HIGH
sfr CCAPM1 = 0xDB; //PCA模块1模式寄存器
sfr CCAP1L = 0xEB; //PCA模块1捕获寄存器 LOW
sfr CCAP1H = 0xFB; //PCA模块1捕获寄存器 HIGH
sfr PCAPWM0 = 0xf2;
sfr PCAPWM1 = 0xf3;
sbit PCA_LED = P1^0; //PCA测试LED
void PCA_isr() interrupt 7 using 1

 CCF0 = 0; //清中断标志
 PCA_LED = !PCA_LED; //测试LED取反

void main()

 ACC = P_SW1;
 ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=0 CCP_S1=0
 P_SW1 = ACC; //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
 
// ACC = P_SW1;
// ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=1 CCP_S1=0
// ACC |= CCP_S0; //(P3.4/ECI_2, P3.5/CCP0_2, P3.6/CCP1_2, P3.7/CCP2_2)
// P_SW1 = ACC; 
// ACC = P_SW1;
// ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=0 CCP_S1=1
// ACC |= CCP_S1; //(P2.4/ECI_3, P2.5/CCP0_3, P2.6/CCP1_3, P2.7/CCP2_3)
// P_SW1 = ACC; 
CCON = 0; //初始化PCA控制寄存器
 //PCA定时器停止
 //清除CF标志
 //清除模块中断标志
 CL = 0; //复位PCA寄存器
 CH = 0;
 CMOD = 0x00; //设置PCA时钟源
 //禁止PCA定时器溢出中断
 CCAPM0 = 0x11; //PCA模块0为下降沿触发
// CCAPM0 = 0x21; //PCA模块0为上升沿沿触发
// CCAPM0 = 0x31; //PCA模块0为上升沿/下降沿触发
 CR = 1; //PCA定时器开始工作
 EA = 1;
 while (1);

以上是关于单片机RGB调色程序 要求基于PWM(STC系列单片机c语言)可以实现至少60种颜色调节,有多种模的主要内容,如果未能解决你的问题,请参考以下文章

STC12C系列单片机PWM脉宽调制

STC单片机通过ADC外部输入调节PWM占空比输出并串口打印当前脉冲值

stc12c5a60s2 51单片机区别

如何在keil+4+中添加STC单片机型号

11.STC15W408AS单片机CCP/PCA/PWM应用

11.STC15W408AS单片机CCP/PCA/PWM应用