STC15F2K60S2系列主要性能:
●大容量2048字节片内RAM数据存储器
●高速:1个时钟/机器周期,增强型8051内核(STC Y5),速度比传统8051快7~12倍
速度也比STC早期的1T系列单片机(如STC12/11/10系列)的速度快20%
●宽电压:5.5~3.8V,2.4~3.6V(STC15L2K60S2系列)
●低功耗设计:低速模式,空闲模式,掉电模式(可由外部中断或内部掉电唤醒定时器唤醒)
内部高精度R/C时钟,±1% 温飘(-40℃~+85℃),常温下温飘5‰,可彻底省掉外部昂贵的晶体时钟,内部时钟从5MHz~35MHz可选
●内部高可靠复位,ISP编程时8级复位门槛电压可选,彻底省掉外部复位电路
●支持掉电唤醒的资源有:INT0/INT1(上升沿/下降沿中断均可),-INT2/-INT3/-INT4(下降沿中断);CCP0/CCP1/CCP2/RxD/RxD2/T0/T1/T2 管脚;内部掉电唤醒专用定时器
●工作频率:5~35MHz,相当于普通8051:60~420MHz
●8/16/24/32/40/48/56/60/61K字节片内Flash程序存储器,擦写次数10万次以上
●大容量片内EEPROM(FLASH)功能,擦写次数10万次以上
●ISP/IAP(在系统可编程/在应用可编程),无需编程器/仿真器
●高速ADC,8通道10位,速度可达30万次/秒。3路PWM还可当3路D/A使用
●3通道捕获/比较单元(CCP/PCA/PWM)
----也可用来再实现3路D/A 3个定时器或3个外部中断(支持上升沿/下降沿中断)
●6个定时器,2个16位可重装载定时器T0和T1兼容普通8051的定时器,新增了一个16位的定时器T2,并可实现时钟输出,3路CCP/PCA可再实现3个定时器
●可编程时钟输出功能(对内部系统时钟或外部管脚的时钟输入进行时钟分频输出):
① T0 在P3.5 输出时钟;
② T1 在P3.4 输出时钟;
③ T2 在P3.0 输出时钟,以上3个定时器/计数器输出时钟均可1~65536级分频输出;
④ 内部主时钟在P5.4/MCLKO 对外输出时钟(STC15系列8-pin单片机的主时钟在P3.4/MCLKO 对外输出时钟)
●SPI高速同步串行通信接口
●双串口/UART,两个完全独立的高速异步串行通信端口,分时切换可当5组串口使用
●先进的指令集结构,兼容普通8051指令集,有硬件乘法/除法指令
●通用I/O口(42/38/30/26个),复位后为:准双向口上拉(8051传统I/O口)
可设置四种模式:准双向口上拉、强推挽上拉、仅为输入/高阻和开漏
每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过120mA
●如果I/O口不够用可以用3根普通I/O口线外接74HC595(¥0.21元)来扩展I/O口,并可多芯片级联扩展几十个I/O口,还可用A/D作按键扫描来节省I/O口
选择STC15F2K60S2系列单片机理由:
★片内大容量2048字节SRAM
★超级加密,宏晶第八代加密技术
★超强抗干扰:
1.高抗静电保护(ESD)整机轻松过2万伏静电测试
2.轻松过4KV 快速脉冲干扰(EFT测试)
3.宽电压,不怕电源抖动
4.宽温度范围,-40℃~+85℃
★大幅降低EMI(电磁辐射),内部可配置时钟,1个时钟/机器周期,可用低频时钟
----出口欧美的有力保证
超低功耗:
1.掉电模式:外部中断唤醒功耗《0.1uA
2.空闲模式:典型功耗《1mA,
3.正常工作模式:4mA~6mA,
4.掉电模式可由外部中断或内部掉电唤醒专用定时器唤醒,适用于电池供电系统,如水表、气表、便携设备等
★在系统可编程(ISP),无需编程器,无需仿真器,可远程升级 可送STC-ISP下载编程器,1万片/人/天
★可彻底省掉外部昂贵复位电路,内部集成高可靠复位电路、ISP编程时8级复位门槛电压可选 当然也可以继续用外部复位电路
★可彻底省掉外部昂贵的晶体时钟,内部集成高精度R/C时钟,±1%温飘(-40℃~+85℃),常温下温飘5‰
STC15F2K60S2芯片PWM的应用
1.目的
脉宽调制(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模式。
2.与CCP/PWM/PCA应用有关的特殊功能寄存器 符号 CCON CMOD CCAPM0 CCAPM1 CCAPM2 CL CH CCAP0L 描述 PCA Control Register PCA Mode Register PCA Module 0 Mode Register PCA Module 1 Mode Register PCA Module 2 Mode Register PCA Base Timer Low PCA Base Timer High PCA Module-0 Capture Register Low PCA Module-0 Capture Register High PCA Module-1 Capture Register Low PCA Module-1 Capture Register High PCA Module-2 Capture Register Low PCA Module-2Capture Register High PCA PWM Mode Auxiliary Register 0 PCA PWM Mode Auxiliary Register 1 PCA PWM Mode Auxiliary Register 2 位地址及其符号 地址 D8H B7 CF B6 CR - B5 - - B4 - - CAPN0 CAPN1 CAPN2 B3 - B2 CCF2 B1 CCF1 B0 CCF0 复位值 00xx xx00 0xxx 0000 x000 000 x000 0000 x000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00xx xx00 00xx xx00 00xx xx00 0100 0000 D9H CIDL DAH DBH DCH E9H F9H EAH - - - CPS2 CPS1 CPS0 ECF MAYPWMECCFTOG0 0 0 0 MAYPWMECCFTOG1 1 1 1 MAYPWMECCFTOG2 2 2 2 ECOCAPPM0 0 ECOCAPPM1 1 ECOCAPPM2 2 CCAP0H FAH CCAP1L EBH CCAP1H FBH CCAP2L ECH CCAP2H PCA_PWM0 PCA_PWM1 PCA_PWM2 AUXRI P_SW1 FCH F2H EBS0EBS0_1 _0 EBS1EBS1_1 _0 EBS2EBS2_1 _0 - - - - EPC0EPC0H L EPC1EPC1H L EPC2EPC2H L - DPS F3H - - - - F4H - - - SP1_S1 - SP1_S0 Auxiliary Register CCP_CCP_A2H S1_S1 S1_S0 1 S1 S0 2.1.PCA工作模式寄存器CMOD PCA工作模式寄存器的格式如下: CMOD:PCA工作模式寄存器 SFR name CCON Address D9H bit name B7 CIDL B6 - B5 - B4 - B3 CPS2 B2 CPS1 B1 CPS0 B0 ECF CIDL:空闲模式下是否停止PCA计数的控制位。 当CIDL = 0时,空闲模式下PCA计数器继续工作; 当CIDL = 1时,空闲模式下PCA计数器停止工作; CPS2、CPS1、CPS0:PCA计数脉冲源选择控制位。 PCA计数脉冲选择如下表所示。 CPS2 CPS1 CPS0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 选择PCA/PWM时钟源输入 0,系统时钟,SYSclk/12 1,系统时钟,SYSclk/2 2,定时器0的溢出脉冲。由于定时器0可以工作在T1模式,所以可以达到记一个时钟就溢出,从而达到最高频率CPU工作时钟SYSclk,通过改变定时器0的溢出率,可以实现可调频率的PWM输出 3,ECI/P1.2(或P4.1)脚输入的外部时钟(最大速率=SYSclk/2) 4,系统时钟,SYSclk 5,系统时钟/4,SYSclk/4 6,系统时钟/6,SYSclk/6 7,系统时钟/8,SYSclk/8 例如,CPS2/CPS1/CPS0 = 1/0/0时,CCP/PCA/PWM的时钟源是SYSclk,不用定时器0,
PWM的频率为SYSclk/256.
如果要用系统时钟/3来作为PCA的时钟源,应选择T0的溢出作为CCP/PCA/PWM的时钟源,此时应让T0工作在1T模式,计数3个脉冲即产生溢出。用T0的溢出可对系统时钟进行1~65536级分频(T0工作在16为重装载模式)。
ECF:PCA计数溢出中断使能位。
当ECF = 0时,禁止寄存器CCON中CF位的中断; 当ECF = 1时,允许寄存器CCON中CF位的中断。
2.2.PCA控制寄存器CCON
PCA控制寄存器的格式如下: CCON:PCA控制寄存器 SFR name CCON Address D8H bit name B7 CF B6 CR B5 - B4 - B3 - B2 - B1 CCF1 B0 CCF0 CF:PCA计数器阵列溢出标志位。当PCA计数器溢出时,CF由硬件置位。如果CMOD寄存器的ECF位置位,则CF标志可用来产生中断。CF位可通过硬件或软件置位,但只能通过软件清零。
CR:PCA计数器阵列运行控制位。该位通过软件置位,用来启动计数器阵列计数。该位通过软件清零,用来 关闭PCA计数器。
CCF2:PCA模块2中断标志。当出现匹配或捕捉时该位由硬件置位。该位必须通过软件清零。
CCF1:PCA模块1中断标志。当出现匹配或捕捉时该位由硬件置位。该位必须通过软件清零。
CCF0:PCA模块0中断标志。当出现匹配或捕捉时该位由硬件置位。该位必须通过软件清零。
2.3.PCA比较/捕获寄存器CCAPM0、CCAPM1和CCAPM2
PCA模块0的比较/捕获寄存器的格式如下: CCAPM0:PCA模块0的比较/捕获寄存器 SFR name Address CCAPM0 DAH Bit name B7 - B6 ECOM0 B5 CAPP0 B4 CAPN0 B3 MAT0 B2 TOG0 B1 PWM0 B0 ECCF0 B7:保留为将来之用。 ECOM0:允许比较器功能控制位。
当ECOM0 = 1时,允许比较器功能。 CAPP0: 正捕获控制位。
当CAPP0 = 1时,允许上升沿捕获。 CAPN0: 负捕获控制位。
当CAPN0 = 1时,允许下降沿捕获。 MAT0: 匹配控制位。
当MAT0 = 1时,PCA计数值与模块的比较/捕获寄存器的值的匹配将置位CCON寄存器的中断标志位CCF0。
TOG0:翻转控制位。
当TOG0 = 1时,工作在PCA高速脉冲输出模式,PCA计数器的值与模块的比较/捕获寄存器的值的匹配将使CCP0脚翻转。 PWM0: 脉宽调制模式。
当PWM0 = 1时,允许CCP0脚用作脉宽调节输出。
ECCF0:使能CCF0中断。使能寄存器CCON的比较/捕获标志CCF0,用来产生中断。
PCA模块1的比较/捕获寄存器的格式如下: CCAPM1:PCA模块1的比较/捕获寄存器 SFR name Address Bit CCAPM1 DBH B7 B6 B5 B4 B3 B2 B1 B0 name - ECOM1 CAPP1 CAPN1 MAT1 TOG1 PWM1 ECCF1 B7:保留为将来之用。 ECOM1:允许比较器功能控制位。
当ECOM1 = 1时,允许比较器功能。 CAPP1: 正捕获控制位。
当CAPP1 = 1时,允许上升沿捕获。 CAPN1:负捕获控制位。
当CAPN1 = 1时,允许下降沿捕获。 MAT1:匹配控制位。
当MAT1 = 1时,PCA计数值与模块的比较/捕获寄存器的值的匹配将置位CCON寄存器的中断标志位CCF1。 TOG1:翻转控制位。
当TOG1 = 1时,工作在PCA高速脉冲输出模式,PCA计数器的值与模块的比较/捕获寄存器的值的匹配将使CCP1脚翻转。 PWM1: 脉宽调制模式。
当PWM1 = 1时,允许CCP1脚用作脉宽调节输出。
ECCF1:使能CCF1中断。使能寄存器CCON的比较/捕获标志CCF1,用来产生中断。 PCA模块2的比较/捕获寄存器的格式如下: CCAPM2:PCA模块2的比较/捕获寄存器 SFR name Address CCAPM2 DCH Bit name B7 - B6 B5 B4 B3 B2 B1 B0 ECOM2 CAPP2 CAPN2 MAT2 TOG2 PWM2 ECCF2 B7:保留为将来之用。 ECOM2:允许比较器功能控制位。
当ECOM2 = 1时,允许比较器功能。 CAPP2: 正捕获控制位。
当CAPP2 = 1时,允许上升沿捕获。 CAPN2:负捕获控制位。
当CAPN2 = 1时,允许下降沿捕获。 MAT2:匹配控制位。
当MAT2 = 1时,PCA计数值与模块的比较/捕获寄存器的值的匹配将置位CCON寄存器的中断标志位CCF2。 TOG2:翻转控制位。
当TOG2 = 1时,工作在PCA高速脉冲输出模式,PCA计数器的值与模块的比较/捕获寄存器的值的匹配将使CCP2脚翻转。 PWM2:脉宽调制模式。
当PWM2 = 1时,允许CCP2脚用作脉宽调节输出。
ECCF2:使能CCF2中断。使能寄存器CCON的比较/捕获标志CCF2,用来产生中断。 2.4.PCA的16位计时器 — 低8位CL和高8位CH
CL和CH地址分别为E9H和F9H,复位值均为00H,用于保存PCA的装载值。2.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的捕捉/比较寄存器。 2.6.PCA模块PWM寄存器PCA_PWM0、PCA_PWM1和PCA_PWM2
PCA模块0的PWM寄存器的格式如下: PCA_PWM0:PCA模块0的PWM寄存器 SFR name PCA_PWM0 Address F2H Bit name B7 EBS0_1 B6 EBS0_0 B5 B4 B3 B2 - - - - B1 EPC0H B0 EPC0L EBS0_1,EBS0_0:当PCA模块0工作于PWM模式时的功能选择位。 0,0:PCA模块0工作于8位PWM功能; 0,1:PCA模块0工作于7位PWM功能; 1,0:PCA模块0工作于6位PWM功能;
1,1:无效,PCA模块0工作于8位PWM模式。 EPC0H:在PWM模式下,与CCAP0H组成9位数。 EPC0L:在PWM模式下,与CCAP0L组成9位数。
PCA模块1的PWM寄存器的格式如下: PCA_PWM1:PCA模块1的PWM寄存器 SFR name PCA_PWM1 Address F3H Bit B7 B6 EBS2_0 B5 B4 B3 B2 - - - - B1 EPC1H B0 EPC1L name EBS2_1 EBS1_1,EBS1_0:当PCA模块1工作于PWM模式时的功能选择位。 0,0:PCA模块1工作于8位PWM功能; 0,1:PCA模块1工作于7位PWM功能; 1,0:PCA模块1工作于6位PWM功能;
1,1:无效,PCA模块1工作于8位PWM模式。 EPC1H:在PWM模式下,与CCAP1H组成9位数。 EPC1L:在PWM模式下,与CCAP1L组成9位数。
PCA模块2的PWM寄存器的格式如下: PCA_PWM2:PCA模块2的PWM寄存器 SFR name PCA_PWM2 Address F4H Bit name B7 EBS2_1 B6 EBS2_0 B5 - B4 - B3 - B2 - B1 EPC2H B0 EPC2L EBS2_1,EBS2_0:当PCA模块2工作于PWM模式时的功能选择位。 0,0:PCA模块2工作于8位PWM功能; 0,1:PCA模块2工作于7位PWM功能; 1,0:PCA模块2工作于6位PWM功能;
1,1:无效,PCA模块2工作于8位PWM模式。 EPC2H:在PWM模式下,与CCAP2H组成9位数。 EPC2L:在PWM模式下,与CCAP2L组成9位数。
PCA模块的工作模式设定表如下表所列: ECOMn 0 1 1 1 1 X CAPPn 0 0 1 0 1 1 CAPNn 0 0 0 1 1 0 MATn 0 0 0 0 0 0 TOGn PWMn ECCFn 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 1 1 X 模块功能 无此操作 8位PWM,无中断 8位PWM输出,由低变高产生中断 8位PWM输出,由高变低产生中断 8位PWM输出,由高变低或由低到高 16位捕获模式,由CEXn/PCAn的上升沿触发 X X 1 1 0 1 0 0 1 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 X X X X 16位捕获模式,由CEXn/PCAn的下降沿触发 16位捕获模式,由CEXn/PCAn的跳变触发 16位软件定时器 16位高速输出 PCA模块工作模式设定(CCAPMn寄存器,n = 0、1、2) 3.原理图
3.1 8位脉宽调节模式(PWM)
当[EBSn_1,EBSn_0]=[0,0]或[1,1]时,PCA模块n工作8位PWM模式,此时将{0,CL[7:0]}与捕获寄存器[EPCnL,CCAPnL[7:0]]进行比较。
PWM模式的结构如下图所示。
EPCnHCCAPnHEPCnLCCAPnL[7:0]输出0enable9位比较器(0,CL[7:0])《(EPCnL,CCPnL[7:0])(0,CL[7:0])》=(EPCnL,CCPnL[7:0])输出10CL[7:0]PWMnCL overflow—ECOMn1CAPPn0CAPNn0MATn0TOGn0PWMn1ECCFn0CCAPMn,n=0,1,2地址:Dah,DBh,DCh
PCA PWM mode/可调制脉冲宽度输出模式结构图(PCA模块工作于8位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位必须置位。
PCA时钟输入源频率
当PWM是8位的时:PWM的频率=
256
PCA时钟输入源可以从以下8中中选择一种:SYSclk,SYSclk/2,SYSclk/4,SYSclk/6,
SYSclk/8,SYSclk/12,定时器0的溢出,ECI/P1.2输入。
如果要实现可调频率的PWM输出,可选择定时器0的溢出率或者ECI脚的输入作为PCA/PWM的时钟输入源
当EPCnL = 0及CCAPnL = 00H时,PWM固定输出高 当EPCnL = 1及CCAPnL = 0FFH时,PWM固定输出低 当某个I/O作为PWM使用时,该口的状态: PWM之前口的状态 弱上拉/准双向 强推挽输出/强上拉输出 仅为输入/高阻 开漏 PWM输出时的状态 强推挽输出/强上拉输出,要加输出限流电阻1K~10K 强推挽输出/强上拉输出,要加输出限流电阻1K~10K PWM无效 开漏 3.2 7位脉宽调节模式(PWM)
当[EBSn_1,EBSn_0]=[0,1]时,PCA模块n工作7位PWM模式,此时将{0,CL[6:0]}与捕获寄存器[EPCnL,CCAPnL[6:0]]进行比较。PWM模式的结构如下图所示。
EPCnHCCAPnHEPCnLCCAPnL[6:0]输出0enable8位比较器(0,CL[6:0])《(EPCnL,CCPnL[6:0])(0,CL[6:0])》=(EPCnL,CCPnL[6:0])输出10CL[6:0]PWMnCL overflow—ECOMn1CAPPn0CAPNn0MATn0TOGn0PWMn1ECCFn0CCAPMn,n=0,1,2地址:Dah,DBh,DCh
PCA PWM mode/可调制脉冲宽度输出模式结构图(PCA模块工作于7位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位必须置位。
PCA时钟输入源频率
当PWM是7位的时:PWM的频率=
128
PCA时钟输入源可以从以下8中中选择一种:SYSclk,SYSclk/2,SYSclk/4,SYSclk/6, SYSclk/8,SYSclk/12,定时器0的溢出,ECI/P1.2输入。
如果要实现可调频率的PWM输出,可选择定时器0的溢出率或者ECI脚的输入作为PCA/PWM的时钟输入源
当EPCnL = 0及CCAPnL = 80H时,PWM固定输出高 当EPCnL = 1及CCAPnL = 0FFH时,PWM固定输出低 3.2 6位脉宽调节模式(PWM)
当[EBSn_1,EBSn_0]=[1,0]时,PCA模块n工作6位PWM模式,此时将{0,CL[5:0]}与捕获寄存器[EPCnL,CCAPnL[5:0]]进行比较。PWM模式的结构如下图所示。
EPCnHCCAPnHEPCnLCCAPnL[5:0]输出0enable7位比较器(0,CL[5:0])《(EPCnL,CCPnL[5:0])(0,CL[5:0])》=(EPCnL,CCPnL[5:0])输出10CL[5:0]PWMnCL overflow—ECOMn1CAPPn0CAPNn0MATn0TOGn0PWMn1ECCFn0CCAPMn,n=0,1,2地址:Dah,DBh,DCh
PCA PWM mode/可调制脉冲宽度输出模式结构图(PCA模块工作于6位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位必须置位。
PCA时钟输入源频率
当PWM是6位的时:PWM的频率= 64
PCA时钟输入源可以从以下8中中选择一种:SYSclk,SYSclk/2,SYSclk/4,SYSclk/6, SYSclk/8,SYSclk/12,定时器0的溢出,ECI/P1.2输入。
如果要实现可调频率的PWM输出,可选择定时器0的溢出率或者ECI脚的输入作为PCA/PWM的时钟输入源
当EPCnL = 0及CCAPnL = 0C0H时,PWM固定输出高 当EPCnL = 1及CCAPnL = 0FFH时,PWM固定输出低 4.程序
//P3.7输出PWM波形 #include sfr CCON = 0xd8; sfr CMOD = 0xd9; sfr CCAPM2 = 0xdc; sfr CL = 0xe9; sfr CH = 0xf9;
sfr CCAP2L = 0xec; sfr CCAP2H = 0xfc; sfr PCA_PMW2 = 0xf4;
code unsigned char seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char cp1,cp2 = 255; unsigned int cp0;
sbit P3_4 = P3^4; sbit P3_5 = P3^5; sbit P3_6 = P3^6;
void timer0_isr(void) interrupt 1 {
TH0 = (65536 - 1000) / 256; //重装初值 TL0 = (65536 - 1000) % 256; //重装初值 cp0++; //中断1次,变量加1 if(cp0 》= 100) //1秒到了 {
cp0 = 0;
cp2--; //cp2为脉宽控制变量 if(cp2 《= 1) cp2 = 255; }
P2 = 0xff;
P3 = 0xff; switch(cp1) {
case 0: P2 = seven_seg[cp2 % 100 % 10]; P3_6 = 0;break; case 1: P2 = seven_seg[cp2 % 100 / 10]; P3_5 = 0;;break; case 2: P2 = seven_seg[cp2 / 100]; P3_4 = 0;break; }
cp1++;
if(cp1》= 3)cp1 = 0; }
/*********************Timer0初始化函数***********************/ void timer0_init(void) {
TMOD = 0x01; //T0工作方式1
TH0 = (65536 - 1000) / 256; //对机器脉冲计数1000个计满溢出引发中断 TL0 = (65536 - 1000) % 256;
EA = 1; //开总中断 ET0 = 1; //开T0中断 TR0 = 1; //启动定时器T0 }
void pwm0_init(void) {
CCON = 0x00; CL = 0x00; CH = 0x00;
PCA_PMW2 = 0x00; //8位PMW,占空比的第九位EPC0L为0 CCAPM2 = 0x42; //允许比较,P3.7输出 CCON = 0x40; //允许PAC计数 }
void main(void) {
timer0_init(); pwm0_init(); while(1) {
if(CL == 0xff) {
CCAP2L = cp2; CCAP2H = cp2; } } }
评论
查看更多