找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么这个单片机程序在protues仿真时 单片机P1^3能工作,但p1^4和p1^5一直是高电平呢

[复制链接]
ID:771216 发表于 2020-6-18 22:07 | 显示全部楼层 |阅读模式
uchar time1=0;
uchar time2=0;
uchar Power = 50;

sbit PWM2 = P1^3;// P1.3输出pwm,控制M2调整功率
sbit PWM3 = P1^5;// P1.5输出pwm,控制M3放电
sbit PWM1 = P1^4;// P1.4输出pwm,控制可控硅充电

/********pwm控制模块********/
//初始化定时器
void int_timer()
{
        TMOD = 0x11;//定时器0工作方式1
        TH0 = 0xFC;//(65536-10)/256;//赋初值定时
        TL0 = 0x18;//(65536-10)%256;//1ms  
        TH1 = 0xFF;//(65536-10)/256;//赋初值定时
        TL1 = 0xF6;//(65536-10)%256;//0.01ms  
        EA = 1;//开总中断
        ET0 = 1;//开定时器0中断
        TR0 = 1;//启动定时器0
        ET1 = 1;
        TR1 = 1;
}
//定时器0中断,pwm1和pwm3脉
void tim0() interrupt 1
{
        TR0 = 0;//赋初值时,关闭定时器
        TH0 = 0xFC;//(65536-1000)/256;//赋初值定时
        TL0 = 0x18;//(65536-1000)%256;//1ms
        TR0 = 1;//打开定时器
        time1 ++;
    if(time1 >= 1000) //1hz
    {                                                                                                                                                                                       
                time1 = 0;
        }
        else if(time1 <= 980) //占空比%98
        {
            PWM1 = 1;
                PWM3 = 0;
        }
        else if((time1 > 985)&&(time1 <= 995))
        {
                PWM1 = 0;
                PWM3 = 1;
        }
    else
    {
                PWM1 = 0;
                PWM3 = 0;
        }
}

/*****定时器1中断,改变PWM占空比******/
void tim1() interrupt 3
{
        TR1 = 0;//赋初值时,关闭定时器
        TH1 = 0xff;//(65536-10)/256;//赋初值定时
        TL1 = 0xf6;//(65536-10)%256;//0.01ms
        TR1 = 1;//打开定时器
        time2 ++;
        if(time2 >= 100) //1khz
                time2 = 0;
        if(time2 <= Power) //占空比
                PWM2 = 1;
        else PWM2 = 0;
}


/****主函数****/
void main()
{
    while(1)
    {
                int_timer();         
        }  
}

回复

使用道具 举报

ID:213173 发表于 2020-6-19 07:30 | 显示全部楼层
由于int_timer(); 在main中位置错误,导致定时器不断被重置,PWM1和PWM3没有机会运行。完成定时器1中断函数任务的时间远大于10us,事实PWM2也不能正常运行。
/****主函数****/
void main()
{
        int_timer();
        while(1)
        {
        
        }  
}
回复

使用道具 举报

ID:771216 发表于 2020-6-19 20:30 来自手机 | 显示全部楼层
wulin 发表于 2020-6-19 07:30
由于int_timer(); 在main中位置错误,导致定时器不断被重置,PWM1和PWM3没有机会运行。完成定时器1中断函数 ...

你说的对,非常感谢!我是初学者,如果你有时间,能不能指正一下我这两个中断函数的错误之处,十分感谢。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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