找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1089|回复: 2
收起左侧

stc15单片机pwm输出影响中断吗?

[复制链接]
ID:706567 发表于 2023-4-14 23:18 | 显示全部楼层 |阅读模式
按理解,配置好pwm输出不应该影响中断的,但是我设置的T0定时器,总是不能正常工作,麻烦大神看看,是哪个寄存器没设置好?

void delay(unsigned char i) //延时
        {
                unsigned int j,k;
                for (j=i; j>0; j--)
                for(k=0;k<2500;k++);
        }
void PWMT_Init()//中断初始化                        
        {
                AUXR=0x80;
               
                AUXR1=0x20;//输出,P2.5,P2.6,P2.7
                CMOD=0x01; //定时器T1模式益出中断
                //CMOD=0x00;//时钟源配置00,系统频率/12
               
                CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010)
                CCAP0L=0x00; //设置PWM0初始值与CCAP0H相同
                CCAP0H=0x00; // PWM0初始时为0
                CCAPM1=0x42; //PWM1设置PCA工作方式为PWM方式
                CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同
                CCAP1H=0x00; // PWM1初始时为0
                CCAPM2=0x42; //PWM2设置PCA工作方式为PWM方式
                CCAP2L=0x00; //设置PWM2初始值与CCAP0H相同
                CCAP2H=0x00; // PWM2初始时为0

                CR=1; //启动PCA定时器                                                                                
        }

void Time_Init()//中断初始化                        
        {
                        
                        TMOD=0x01;//设置16位 计时方式
                        TH0=0xb1; //设置初值
                        TL0=0xe0;
                                          
                           TR0=0;//开定时器T0
                        ET0=1;//启动定时器T0
                        EA=1;//开总中断
               
                                
                        
        }         
        
void PWM0_Set (unsigned char Ddata)
        {
                unsigned char Hdata,Ldata;
                Ldata=Ddata%256;
                Hdata=Ddata/256;
                CCAP0L= Ldata; //设置值直接写入CCAP0L
                CCAP0H= Hdata; //设置值直接写入CCAP0H
        }
void PWM1_Set (unsigned char Ddata)
        {
                unsigned char Hdata,Ldata;
                Ldata=Ddata%256;
                Hdata=Ddata/256;
                CCAP1L= Ldata; //设置值直接写入CCAP1L
                CCAP1H= Hdata; //设置值直接写入CCAP1H
        }
void PWM2_Set (unsigned char Ddata)
        {
                unsigned char Hdata,Ldata;
                Ldata=Ddata%256;
                Hdata=Ddata/256;
                CCAP2L= Ldata; //设置值直接写入CCAP2L
                CCAP2H= Hdata; //设置值直接写入CCAP2H
        }
        

void Time0_Int() interrupt 1 //中断
        {
                TH0=0xb1; //设置初值即20MS
                TL0=0xe0;
                count++;
                if(count>4000)count=0;
               
        }

void main (void)
        {
                PWMT_Init(); //PWM初始化
                Time_Init();//中断初始化
                TR0=1;//启动定时器
                //TR1=1; //启动定时器1
                PWM0_Set(0x00); //设置PWM占空比P2.5
                PWM1_Set(0x00); //设置PWM占空比P2.6
                PWM2_Set(0x00); //设置PWM占空比P2.7
               
                while(1)
                        {
                                if(count<2000)A=0;
                                   else A=1;
                                
                        }
        }        

实际工作是PWM输出口可以正常工作,但是定时器T0,不工作? 为何~~~~~~~~~
回复

使用道具 举报

ID:213173 发表于 2023-4-15 08:18 | 显示全部楼层
1.STC15单片机的定时器与PWM是互为独立的硬件模块。原则上互不影响正常工作。问题出在楼主设置使用不当。楼主设置PWM时钟源为T0溢出脉冲,那么两者唯一的关联就是TF0。正常情况下当定时器0溢出触发中断,CPU响应后TF0被系统自动清0。那么 TF0 与 PWM 关联后,TF0是在哪个步骤被清0,未经测试不得而知。如果不是使用PWM任意频率可调功能,建议改用系统时钟源。
2.楼主设置20msT0中断,又设置AUXR=0x80;1T模式是无法正常工作的。在12M时钟条件下1T模式最多只能定时5.46ms。
3.此PCA模块PWM是8位,操控占空比只要赋值CCAPnH即可,CCAPnL是自动读取CCAPnH的数据工作,不需要另外赋值。楼主PWM想用20ms作时钟源,再除256,约0.2Hz,PWM频率如此之低想干嘛?

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:1034262 发表于 2023-4-15 13:58 | 显示全部楼层
PWM是硬件外设,自动工作,不会影响别的程序(包括中断)。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表