1、 第12章 IAP15W4K58S4单片机的 PWM模块单片机原理及应用系统设计单片机PWM模块的结构单片机PWM模块的应用单片机PWM模块的控制 IAP15W4K58S4单片机内部集成了一组(各自独立单片机内部集成了一组(各自独立6路)路)增强型的增强型的PWM波形发生器。波形发生器。增强型增强型PWM发生器大大增加了发生器大大增加了PWM控制的灵活性。控制的灵活性。第第1212章章 IAP15W4K58S4 IAP15W4K58S4单片机单片机PWMPWM模块模块p PWM波形发生器内部有一个波形发生器内部有一个15位的位的PWM计数器供计数器供6路路PWM使用,用户可以设置每路使用,用户
2、可以设置每路PWM的初始电平。的初始电平。p 另外另外,PWM波形发生器为每路波形发生器为每路PWM又设计了两个用于控制又设计了两个用于控制波形翻转的计数器波形翻转的计数器T1/T2,可以非常灵活的每,可以非常灵活的每路路PWM 的高的高低电平宽度,从而达到对低电平宽度,从而达到对PWM 的占空比以及的占空比以及PWM 的输出的输出延迟进行控制的目的延迟进行控制的目的。p 由于由于6路路PWM是各自独立的,且每路是各自独立的,且每路PWM 的初始状态可以的初始状态可以进行设定,所以用户可以将其中的任意两路配合起来使用,进行设定,所以用户可以将其中的任意两路配合起来使用,即可实现补对称输出以及死
3、区控制等特殊应用即可实现补对称输出以及死区控制等特殊应用。12.1 IAP15W4K58S412.1 IAP15W4K58S4单片机单片机PWMPWM模块的结构模块的结构 增强型的增强型的PWM波形发生器还设计了对外部异常事件(包括波形发生器还设计了对外部异常事件(包括外部端口外部端口P2.4的电平异常的电平异常、比较器比较结果异常)进行监控、比较器比较结果异常)进行监控的功能,可用于紧关闭的功能,可用于紧关闭PWM输出输出。PWM波形发生器还可在波形发生器还可在15 位的位的PWM计数器归零时触发外计数器归零时触发外部事件(触发外部事件部事件(触发外部事件、外部事件外部事件、ADC转换)。转
4、换)。12.1 IAP15W4K58S412.1 IAP15W4K58S4单片机单片机PWMPWM模块的结构模块的结构 -IAP15W4K58S4单片机单片机PWM模块的结构模块的结构 12.1 IAP15W4K58S4单片机PWM模块的结构图图12-1 PWM波形发生器结构框图波形发生器结构框图 表12-1 端口配置寄存器各位的定义 12.2 IAP15W4K58S4单片机PWM模块的控制位号位号B7B6B5B4B3B2B1B0位名称EAXSFR000-S4_SS3_SS2_S EAXSFR:扩展SFR 访问控制使能。EAXSFR=0:MOVX A,DPTR/MOVX DPTR,A指令的操作
5、对象为扩展RAM(XRAM)。EAXSFR=1:MOVX A,DPTR/MOVX DPTR,A指令的操作对象为扩展SFR(XSFR)。注意:若要访问注意:若要访问PWMPWM在扩展在扩展RAMRAM区的特殊功能寄存器,必须先将区的特殊功能寄存器,必须先将EAXSFR EAXSFR 位置为位置为1 1;BIT6,BIT5,BIT4BIT6,BIT5,BIT4为内部测试使用,用户必须填为内部测试使用,用户必须填0 0。1.1.端口配置寄存器端口配置寄存器P_SW2P_SW2 该寄存器地址为该寄存器地址为BAHBAH,复位值为,复位值为00H00H。各位定义如表各位定义如表12-112-1所示:所示
6、:12.2 IAP15W4K58S4单片机PWM模块的控制位号位号B7B6B5B4B3B2B1B0位名称位名称-CBTADCC7INIC6INIC5INIC4INIC3INIC2INI表表12-2 PWM12-2 PWM配置寄存器配置寄存器PWMCFGPWMCFG各位定义各位定义2.PWM配置寄存器配置寄存器PWMCFG该寄存器地址为该寄存器地址为F1H,复位值为,复位值为00H。各位定义如表。各位定义如表12-2所示。所示。CBTADC:PWM计数器归零时(计数器归零时(CBIF=1 时)触发时)触发ADC转换转换 0:PWM计数器归零时不触发计数器归零时不触发ADC转换。转换。1:PWM计
7、数器归零时自动触发计数器归零时自动触发ADC转换。转换。(注:前提条件是(注:前提条件是PWM和和ADC必须被使能,即必须被使能,即ENPWM=1,且,且ADCON=1)CnINI:设置:设置PWM 输出端口的初始电平,输出端口的初始电平,n=27。0:PWM7 输出端口的初始电平为低电平。输出端口的初始电平为低电平。1:PWM7 输出端口的初始电平为高电平。输出端口的初始电平为高电平。CBTADC:PWM计数器归零时(计数器归零时(CBIF=1 时)触发时)触发ADC转换转换 0:PWM计数器归零时不触发计数器归零时不触发ADC转换。转换。1:PWM计数器归零时自动触发计数器归零时自动触发A
8、DC转换。(注:前转换。(注:前提条件是提条件是PWM和和ADC必须被使能,即必须被使能,即ENPWM=1,且,且ADCON=1)CnINI:设置:设置PWM 输出端口的初始电平,输出端口的初始电平,n=27。0:PWM7 输出端口的初始电平为低电平。输出端口的初始电平为低电平。1:PWM7 输出端口的初始电平为高电平。输出端口的初始电平为高电平。12.2 IAP15W4K58S4单片机PWM模块的控制 ENPWM ENPWM :使能增强型:使能增强型PWMPWM波形发生器波形发生器 0 0:关闭:关闭PWMPWM波形发生器。波形发生器。1 1:使能:使能PWMPWM波形发生器,波形发生器,P
9、WMPWM计数器开始计数。计数器开始计数。ECBI ECBI:PWMPWM计数器归零中断使能位计数器归零中断使能位 0 0:关闭:关闭PWMPWM计数器归零中断(计数器归零中断(CBIFCBIF依然会被硬件置位)。依然会被硬件置位)。1 1:使能:使能PWMPWM计数器归零中断。计数器归零中断。ENCnO ENCnO:PWMn PWMn 输出使能位,输出使能位,n=2n=27 7。0 0:PWMPWM通道通道n n的端口为的端口为GPIOGPIO。1 1:PWMPWM通道通道n n的端口为的端口为PWMPWM输出口,受输出口,受PWMPWM波形发生器控制。波形发生器控制。12.2 IAP15W
10、4K58S4单片机PWM模块的控制位号位号B7B6B5B4B3B2B1B0位名称位名称ENPWMECBIENC70ENC60ENC50ENC40ENC30ENC203.PWM控制寄存器控制寄存器PWMCR该寄存器地址为该寄存器地址为F1H,复位值为,复位值为00H。各位定义如表。各位定义如表12-3所示。所示。表表12-3 PWM控制寄存器控制寄存器PWMCFG各位定义各位定义12.2 IAP15W4K58S4单片机PWM模块的控制4.4.PWM中断标志寄存器中断标志寄存器PWMIF 该寄存器地址为该寄存器地址为F6H,复位值为,复位值为00H。各位定义如表。各位定义如表12-4所示。所示。表
11、表12-4 PWM中断标志寄存器中断标志寄存器PWMIF各位定义各位定义。5.PWM外部异常控制寄存器外部异常控制寄存器PWMFDCR 该寄存器地址为该寄存器地址为F7H,复位值为,复位值为00H。各位定义如表。各位定义如表12-5所示。所示。表表12-5 PWM中断标志寄存器中断标志寄存器PWMIF各位定义各位定义。位号位号B7B6B5B4B3B2B1B0位名称-CBIFC7IFC6IFC5IFC4IFC3IFC2IF位号位号B7B6B5B4B3B2B1B0位名称位名称-ENFDFLTFLIOEFDIFDCMPFDIOFDIF12.2 IAP15W4K58S4单片机PWM模块的控制 5.PW
12、M外部异常控制寄存器外部异常控制寄存器PWMFDCR该寄存器地址为该寄存器地址为F7H,复位值为,复位值为00H。各位定义如表。各位定义如表12-5所示。所示。位号位号B7B6B5B4B3B2B1B0位名称-ENFDFLTFLIOEFDIFDCMPFDIOFDIF表表12-5 PWM中断标志寄存器中断标志寄存器PWMIF各位定义各位定义12.2 IAP15W4K58S4单片机PWM模块的控制 ENFD ENFD:PWMPWM外部异常检测功能控制位外部异常检测功能控制位 0 0:关闭:关闭PWMPWM的外部异常检测功能的外部异常检测功能。1 1:使能:使能PWMPWM的外部异常检测功能的外部异常
13、检测功能。F FLTFLIO LTFLIO:发生:发生PWMPWM外部异常时对外部异常时对PWMPWM输出口控制位输出口控制位 0 0:发生:发生PWMPWM外部异常时,外部异常时,PWMPWM的输出口不作任何改变的输出口不作任何改变。1 1:发生:发生PWMPWM外部异常时,外部异常时,PWMPWM的输出口立即被设置为高阻的输出口立即被设置为高阻输入模式(既不对外输出电流,也不对内输出电流)。输入模式(既不对外输出电流,也不对内输出电流)。【注】【注】只有只有ENCnO=1 ENCnO=1 所对应的端口才会被强制悬空;当所对应的端口才会被强制悬空;当PWMPWM外部外部异常状态取消时,相应的
14、异常状态取消时,相应的PWMPWM的输出口会自动恢复以前的的输出口会自动恢复以前的I/OI/O设置。设置。EFDI EFDI:PWMPWM异常检测中断使能位异常检测中断使能位 0 0:关闭:关闭PWMPWM异常检测中断(异常检测中断(FDIFFDIF依然会被硬件置位)依然会被硬件置位)。1 1:使能:使能PWMPWM异常检测中断异常检测中断。12.2 IAP15W4K58S4单片机PWM模块的控制 FDCMP FDCMP:设定:设定PWMPWM异常检测源为比较器的输出异常检测源为比较器的输出 0:比较器与PWM无关。1:当比较器正极P5.5/CMP+的电平比比较器负极P5.4/CMP-的电平高
15、或者比较器正极。P5.5/CMP+的电平比内部参考电压源1.28V高时,触发PWM异常。FDIO FDIO :设定:设定PWMPWM异常检测源为端口异常检测源为端口P2.4 P2.4 的状态的状态 0:P2.4 的状态与PWM无关。1:当P2.4 的电平为高时,触发 为高时,触发PWM异常。FDIF FDIF:PWMPWM异常检测中断标志位异常检测中断标志位 当发生PWM异常(比较器正极P5.5/CMP+的电平比比较器负极P5.4/CMP-的电平高 或比较器正极P5.5/CMP+的电平比内部参考电压源1.28V 高或者P2.4 的电平为高)时,硬件自动将此位置1。当EFDI=1 时,程序会跳转
16、到相应中断入口执行中断服务程序。需要软件清零。12.2 IAP15W4K58S4单片机PWM模块的控制 6.PWM6.PWM计数器计数器(1)PWM计数器高字节PWMCH(高7位)该寄存器地址为FFF0H(XSFR),复位值为00H。各位定义如表12-6所示。表12-6 PWM计数器高字节PWMCH各位定义位号位号B7B6B5B4B3B2B1B0位名称-PWMCH14:812.2 IAP15W4K58S4单片机PWM模块的控制(2)PWM计数器低字节PWMCL(低8位)该寄存器地址为FFF1H(XSFR),复位值为00H。各位定义如表12-7所示。表12-7 PWM计数器高字节PWMCH各位定
17、义 PWM计数器位一个15位的寄存器,可设定132767之间的任意值作为PWM 的周期。PWM 波形发生器内部的计数器从0开始计数,每个PWM 时钟周期递增1,当内部计数器的计数值达到PWMCH,PWMCL所设定的PWM周期时,PWM波形发生器内部的计数器将会从0重新开始开始计数,硬件会自动将PWM归零中断中断标志位CBIF置1,若ECBI=1,程序将跳转到相应中断入口执行中断服务程序。位号位号B7B6B5B4B3B2B1B0位名称PWM2CR7:07.PWM7.PWM时钟选择寄存器时钟选择寄存器PWMCKS PWMCKS 该寄存器地址为FFF2H(XSFR),复位值为00H。各位定义如表12
18、-8所示。表12-8 PWM时钟选择寄存器器PWMCKS各位定义SELT2:PWM时钟源选择 0:PWM时钟源为系统时钟经分频器分频之后的时钟。1:PWM时钟源为定时器2 的溢出脉冲PS3:0:系统时钟预分频参数。当SELT2=0时,PWM时钟为系统时钟/(PS3:0+1)。12.2 IAP15W4K58S4单片机PWM模块的控制位号位号B7B6B5B4B3B2B1B0位名称-PS3:012.2 IAP15W4K58S4单片机PWM模块的控制 8.PWMn8.PWMn的翻转计数器的翻转计数器(n=2(n=27)7)(1)PWMn的第一次翻转计数器的高字节PWMnT1H,复位值是00H。各位定义
19、如表12-9所示。表12-9 PWMn的第一次翻转计数器的高字节PWMnT1H(n=27)各位定义。位号位号B7B6B5B4B3B2B1B0位名称-PWM2T1H14:812.2 IAP15W4K58S4单片机PWM模块的控制(2)PWMn的第一次翻转计数器的低字节PWMn T1L,各位定义如表12-10所示。表12-10 PWMn的第一次翻转计数器的低字节PWMnT1L(n=27)各位定义。(3)PWMn的第二次翻转计数器的高字节PWMnT2H,复位值是00H。各位定义如表12-11所示。表12-11 PWMn的第一次翻转计数器的高字节PWMnT2H(n=27)各位定义。位号位号B7B6B5
20、B4B3B2B1B0位名称PWM2T1L7:0位号位号B7B6B5B4B3B2B1B0位名称-PWM2T1H14:812.2 IAP15W4K58S4单片机PWM模块的控制(4)PWMn的第二次翻转计数器的低字节PWMnT2L,各位定义如表12-12所示。表12-12 PWMn的第一次翻转计数器的低字节PWMnT2L(n=27)各位定义。PWM2的第二次翻转计数器的高字节:PWM2T2H,各位定义如表12-13所示。表12-13 PWMn的第二次翻转计数器的高字节PWMnT2H(n=27)各位定义。位号位号B7B6B5B4B3B2B1B0位名称PWM2T1L7:0SFR nameAddress
21、bitB7B6B5B4B3B2B1B0Reset ValuePWM2T2HFF02H(XSFR)name-PWM2T2H14:8x000,0000BPWM2T2HFF02H(XSFR)name-PWM2T2H14:8x000,0000B12.2 IAP15W4K58S4单片机PWM模块的控制PWM2PWM2的第二次翻转计数器的低字节:的第二次翻转计数器的低字节:PWM2T2LPWM2T2L,各位定义,各位定义如表如表12-1412-14所示。所示。SFR nameAddressbitB7B6B5B4B3B2B1B0Reset ValuePWM2CRFF03H(XSFR)namePWM2CR7:
22、00000,0000BPWMPWM波形发生器设计了两个用于控制波形发生器设计了两个用于控制PWMPWM波形翻转的波形翻转的1515位计数器,可设定位计数器,可设定13271327间的任意值。间的任意值。PWMPWM波形发生器内部的计数器的计数值与波形发生器内部的计数器的计数值与T1/T2T1/T2所设定的所设定的值相匹配时,值相匹配时,PWM PWM 的输出波形将发生翻转。的输出波形将发生翻转。表表12-14 PWMn12-14 PWMn的第二次翻转计数器的低字节的第二次翻转计数器的低字节PWMnT2H(n=2PWMnT2H(n=27)7)各位定义各位定义12.2 IAP15W4K58S4单片
23、机PWM模块的控制 9.PWMn9.PWMn的控制寄存器的控制寄存器PWMnCRPWMnCR 复位值为00H。各位定义如表12-15所示。表12-15 PWMn的控制寄存器PWMnCR各位定义。PWMn_PSPWMn_PS:PWMn输出引脚选择位 0:PWMn的输出引脚为第一组PWMn。1:PWMn的输出引脚为第二组PWMn_2。EPWMnI EPWMnI:PWMn中断使能控制位。0:关闭PWMn 中断。1:使能PWMn 中断,当CnIF被硬件置1时,程序将跳转到相应中断入口执行中断服务程序。bitB7B6B5B4B3B2B1B0name-PWMnPS EPWMn ECn2SI ECn1SI1
24、2.2 IAP15W4K58S4单片机PWM模块的控制 ECnT2SI ECnT2SI:PWMn PWMn 的的T2T2匹配发生波形翻转时的中断控制位匹配发生波形翻转时的中断控制位 0 0:关闭:关闭T2T2翻转时中断翻转时中断 。1 1:使能:使能T2T2翻转时中断,当翻转时中断,当PWMPWM波形发生器内部计数值与波形发生器内部计数值与T2T2计数器所设计数器所设定的值相匹配时,定的值相匹配时,PWM PWM 的波形发生翻转,同时硬件将的波形发生翻转,同时硬件将C2IFC2IF置置1 1,此时若,此时若EPWM2I=1 EPWM2I=1,则程序将跳转到相应中断入口执行中断服务程序。,则程序
25、将跳转到相应中断入口执行中断服务程序。ECnT1SI ECnT1SI:PWMn PWMn 的的T1T1匹配发生波形翻转时的中断控制位匹配发生波形翻转时的中断控制位 0 0:关闭:关闭T1T1翻转时中断翻转时中断 。1 1:使能:使能T1T1翻转时中断,当翻转时中断,当PWMPWM波形发生器内部计数值与波形发生器内部计数值与T1T1计数器所设计数器所设定的值相匹配时,定的值相匹配时,PWM PWM 的波形发生翻转,同时硬件将的波形发生翻转,同时硬件将CnIFCnIF置置1 1,此时若,此时若EPWMnI=1 EPWMnI=1,则程序将跳转到相应中断入口执行中断服务程序。,则程序将跳转到相应中断入
26、口执行中断服务程序。6 6路高低字节两次控制路高低字节两次控制PWMPWM波形翻转的波形翻转的1515位计数器和位计数器和PWMnPWMn控制寄存器。控制寄存器。PWMnCRPWMnCR地址如表地址如表12-1612-16所示。所示。12.2 IAP15W4K58S4单片机PWM模块的控制 表表12-16 PWM212-16 PWM2PWM7PWM7计数器和寄存器地址计数器和寄存器地址地址地址PWM2PWM3PWM4PWM5PWM6PWM7第一次翻第一次翻转计数器转计数器高字节高字节FF00HFF10HFF20HFF30HFF40HFF50H 低字节低字节FF01HFF11HFF21HFF31
27、HFF41HFF51H第二次翻第二次翻转计数器转计数器高字节高字节FF02HFF12HFF22HFF32HFF42HFF52H 低字节低字节FF03HFF13HFF23HFF33HFF43HFF53HPWMn控制寄存器控制寄存器PWMnCRFF04HFF14HFF24HFF34HFF44HFF54H12.2 IAP15W4K58S4单片机PWM模块的控制10.PWM10.PWM中断优先级控制寄存器中断优先级控制寄存器IP2IP2该寄存器地址为该寄存器地址为B5HB5H,复位值为,复位值为00H00H。各个中断源均为低优先级中断。各个中断源均为低优先级中断。不可位寻址,只能用字节操作指令更新相关
28、内容,各位定义如表不可位寻址,只能用字节操作指令更新相关内容,各位定义如表12-1712-17所所示。示。PPWMFDPPWMFD:PWMPWM异常检测中断优先级控制位。异常检测中断优先级控制位。PPWMFD=0 PPWMFD=0:PWMPWM异常检测中断为最低优先级中断异常检测中断为最低优先级中断(优先级优先级0)0)。PPWMFD=1 PPWMFD=1:PWMPWM异常检测中断为最高优先级中断异常检测中断为最高优先级中断(优先级优先级1)1)。PPWM:PWMPPWM:PWM中断优先级控制位。中断优先级控制位。PPWM=0 PPWM=0:PWMPWM中断为最低优先级中断中断为最低优先级中断
29、(优先级优先级0)0)。PPWM=1 PPWM=1:PWMPWM中断为最高优先级中断中断为最高优先级中断(优先级优先级1)1)。SFR nameAddressbitB7B6B5B4B3B2B1B0Reset ValueIP2B5Hname-PX4PPWMFDPPWMPSPIPS20000,0000B表表12-17 PWM12-17 PWM中断优先级控制寄存器中断优先级控制寄存器IP2IP2各位定义各位定义 12.3 IAP15W4K58S4单片机PWM模块的应用 【例【例12-112-1】利用利用IAP15W4K58S4IAP15W4K58S4单片机单片机PWMPWM模块,生成一个模块,生成一
30、个占空比可调的波形。占空比初始值为占空比可调的波形。占空比初始值为50%50%。设置。设置3 3个按键,个按键,分别控制占空比的加和减以及恢复至初始值。波形由引脚分别控制占空比的加和减以及恢复至初始值。波形由引脚P1.7P1.7输出,可使用示波器观察波形。请编写程序。输出,可使用示波器观察波形。请编写程序。解:C语言源程序代码:#include stc15w4k32s4.h /#include stc15w4k32s4.h /包含单片机头文件包含单片机头文件#define CYCLE 11059#define CYCLE 11059 /PWM /PWM计数值计数值unsigned int T2
31、Cnt=CYCLE/2;unsigned int T2Cnt=CYCLE/2;/PWM /PWM翻转计数值翻转计数值 void IO_Init(void);/void IO_Init(void);/函数声明函数声明void PWM_Init(void);void PWM_Init(void);void Key_Process(void);void Key_Process(void);void Delay_ms(unsigned int ms);void Delay_ms(unsigned int ms);void PWM7_SetPWMT2(unsigned int dat);unsigned
32、 char Key_Scan(void);12.3 IAP15W4K58S4单片机PWM模块的应用/*主函数主函数*/void main(void)IO_Init();/端口初始化端口初始化 PWM_Init();/PWM模块初始化模块初始化 while(1)Key_Process();/按键扫描按键扫描 12.3 IAP15W4K58S4单片机PWM模块的应用 void Delay_ms(unsigned int ms)void Delay_ms(unsigned int ms)/延时函数延时函数 unsigned int i;unsigned int i;while(ms-)!=0)whi
33、le(ms-)!=0)for(i=0;i 580;i+);for(i=0;i 580;i+);12.3 IAP15W4K58S4单片机PWM模块的应用 /*PWMPWM模块初始化函数模块初始化函数 */void PWM_Init(void)void PWM_Init(void)P1M1&=(17);/P1M1&=(17);/将将P17P17设置为准双向口设置为准双向口 P1M0&=(17);P1M0&=(17);P_SW2|=0 x80;P_SW2|=0 x80;/允许访问允许访问PWMPWM特殊功能寄存器特殊功能寄存器 PWMCR&=0 x7f;PWMCR&=0 x7f;/关闭关闭PWMPW
34、M发生器,进行发生器,进行PWMPWM设置设置 PWMCKS=0 x00;/PWM PWMCKS=0 x00;/PWM时钟选择:系统时钟,不分频时钟选择:系统时钟,不分频 PWMC=CYCLE;PWMC=CYCLE;/PWM /PWM计数器,设置计数器,设置PWMPWM周期周期 PWM7CR=0 x00;PWM7CR=0 x00;/PWM7 /PWM7输出到输出到P1.7P1.7,关闭中断,关闭中断 PWMCFG=0 x00;/PWMCFG=0 x00;/设置设置PWMPWM的初始输出低电平的初始输出低电平 PWMCR|=0 x20;PWMCR|=0 x20;/使能使能PWM7PWM7信号输出
35、信号输出 PWMCR|=0 x80;PWMCR|=0 x80;/设置完毕,启动设置完毕,启动PWMPWM发生器发生器 P_SW2&=0 x7f;P_SW2&=0 x7f;/关闭访问关闭访问PWMPWM特殊功能寄存器特殊功能寄存器 12.3 IAP15W4K58S4单片机PWM模块的应用/*设置设置PWMPWM中中T2T2计数器计数器 */void PWM7_SetPWMT2(unsigned int dat)void PWM7_SetPWMT2(unsigned int dat)PWMCR&=0 x7f;PWMCR&=0 x7f;/关闭关闭PWMPWM发生器,进行发生器,进行PWMPWM设置设
36、置P_SW2|=0 x80;/P_SW2|=0 x80;/允许访问允许访问PWMPWM特殊功能寄存器特殊功能寄存器PWM7T2=dat;PWM7T2=dat;P_SW2&=0 x7f;/P_SW2&=0 x7f;/关闭访问关闭访问PWMPWM特殊功能寄存器特殊功能寄存器PWMCR|=0 x80;PWMCR|=0 x80;/启动启动PWMPWM发生器发生器 unsigned char Key_Scan(void)unsigned char Key_Scan(void)/按键扫描函数按键扫描函数 unsigned char KeyTemp1,KeyTemp2;unsigned char KeyTe
37、mp1,KeyTemp2;unsigned char KeyValue;unsigned char KeyValue;KEYPORT|=(1KEY10)|(1KEY11)|(1KEY12);/KEYPORT|=(1KEY10)|(1KEY11)|(1KEY12);/读入端口先置高读入端口先置高,/P3.3 P3.3口置高口置高 KeyTemp1=KEYPORT|(1KEY10)|(1KEY11)|(1KEY12);KeyTemp1=KEYPORT|(1KEY10)|(1KEY11)|(1KEY12);/将读将读 /入端口不用的位屏蔽掉入端口不用的位屏蔽掉 if(KeyTemp1!=0 xff)
38、if(KeyTemp1!=0 xff)/如果有键按下如果有键按下 Delay_ms(20);Delay_ms(20);/延时,防抖动延时,防抖动KeyTemp1=KEYPORT|KeyTemp1=KEYPORT|(1KEY10)|(1KEY11)|(1KEY12)(1KEY10)|(1KEY11)|(1KEY12)if(KeyTemp1!=0 xff)if(KeyTemp1!=0 xff)while(KeyTemp1!=0 xff)while(KeyTemp1!=0 xff)/等待按键释放等待按键释放 KeyTemp2=KeyTemp1;KeyTemp2=KeyTemp1;KeyTemp1=K
39、EYPORT|KeyTemp1=KEYPORT|(1KEY10)|(1KEY10)|(1KEY11)|(1KEY12);/(1KEY11)|(1KEY12);/重重新读取新读取 12.3 IAP15W4K58S4单片机PWM模块的应用 switch(KeyTemp2)switch(KeyTemp2)case(1KEY10):/case(1KEY10):/占空比增加键占空比增加键S10S10按下按下 KeyValue=KEY10;KeyValue=KEY10;break;break;case(1KEY11):/case(1KEY11):/占空比减少键占空比减少键S11S11按下按下 KeyVal
40、ue=KEY11;KeyValue=KEY11;break;break;case(1KEY12):/case(1CYCLE /if(T2CntCYCLE /如果数值大于如果数值大于CYCLECYCLE,则设为,则设为0 0 T2Cnt=0;T2Cnt=0;12.3 IAP15W4K58S4单片机PWM模块的应用 PWM7_SetPWMT2(T2Cnt);PWM7_SetPWMT2(T2Cnt);ToDisplayT2Cnt(T2Cnt);ToDisplayT2Cnt(T2Cnt);break;break;case KEY11:case KEY11:/S11 /S11:减小键按下:减小键按下 P
41、WM7_SetPWMT2(CYCLE/2);PWM7_SetPWMT2(CYCLE/2);ToDisplayT2Cnt(CYCLE/2);ToDisplayT2Cnt(CYCLE/2);break;break;12.3 IAP15W4K58S4单片机PWM模块的应用 case KEY12:case KEY12:/S12 /S12:初始键按下:初始键按下 if(T2Cnt(0+100)if(T2Cnt(0+100)T2Cnt=CYCLE+100;T2Cnt=CYCLE+100;/减少到减少到CYCLECYCLE重新回到最大值重新回到最大值CYCLECYCLE T2Cnt=T2Cnt-100;T2
42、Cnt=T2Cnt-100;/数值减数值减100100 PWM7_SetPWMT2(T2Cnt);PWM7_SetPWMT2(T2Cnt);ToDisplayT2Cnt(T2Cnt);ToDisplayT2Cnt(T2Cnt);break;break;12.3 IAP15W4K58S4单片机PWM模块的应用/*单片机单片机IOIO端口模式初始化端口模式初始化 */void IO_Init(void)void IO_Init(void)P2M1&=(15)|(16)|(17);P2M1&=(15)|(16)|(17);/初始化初始化P2.5,P2.6,P2.7P2.5,P2.6,P2.7口为准双向口口为准双向口 P2M0&=(15)|(16)|(17);P2M0&=(15)|(16)|(17);P3M1&=(13)|(14)|(15);P3M1&=(13)|(14)|(15);/将将P3.3 P3.4 P3.5P3.3 P3.4 P3.5设置为准双向口设置为准双向口 P3M0&=(13)|(14)|(15);P3M0&=(13)|(14)|(15);P1M1&=(10)|(14);P1M1&=(10)|(14);P1M0&=(10)|(14);P1M0&=(10)|(14);