找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2182|回复: 8
打印 上一主题 下一主题
收起左侧

使用单片机定时器输出pwm,按键控制占空比,为什么端口没有输出pwm波形?求大佬们帮忙

[复制链接]
跳转到指定楼层
楼主
本帖最后由 qwettyuio 于 2022-1-7 09:00 编辑

单片机源程序如下:
#define uchar unsigned char
sbit key1 = P3^2;   
sbit key2 = P3^0;   
sbit pin1 = P1^4;
sbit led1 = P3^1;
uchar condition=0,time;
void Time0_Init()
{
        mTimer0Clk12DivFsys();                                     //T0定时器时钟设置
        mTimer_x_ModInit(0,1);                                     //T0定时器模式设置16位定时器
        mTimer_x_SetData(0,0xC350);                                //T0定时器赋值5MS
        mTimer0RunCTL(1);                                          //T0定时器启动
        ET0   = 1;                                                 //T0定时器中断开启
        EA    = 1;
}
void        mTimer0Interrupt( void ) interrupt INT_NO_TMR0 using 1           //timer0中断服务程序,使用寄存器组1
{
        mTimer_x_SetData(0,0xC350);                                          //非自动重载方式需重新给TH0和TL0赋值        
        time++;
        if(time<condition)
        {
                pin1=1;
        }
        else
                pin1=0;
        if(time>=100)
        {
                time=0;
        }
}
void main( )
{
        CfgFsys( );                                                                //CH554时钟选择配置   
        mDelaymS(5);                                                               //配置时钟后,建议延时稳定时钟
        Time0_Init();
        mDelaymS(5);
        while(1)
        {               
                if(key1==0)
                {
                        mDelaymS(50);
                        if(key1==0)
                        {
                                led1=0;
                                condition+=10;
                                if(condition>=100)
                                {
                                        condition=100;
                                }
                        }
                }
                if(key2==0)
                {
                        mDelaymS(50);
                        if(key2==0)
                        {
                                led1=1;
                                condition-=10;
                                if(condition<=0)
                                {
                                        condition=0;
                                }
                        }
                }
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:624769 发表于 2022-1-6 21:45 | 只看该作者
我是真的很不理解, CH554 明明有硬件PWM, 为什么非要模拟?

明明  unsigned int condition=0
偏偏要  if(condition<=0)    无符号,你还指望能 < 0 ?

明明  condition  取值范围 0~100  非要 int, 再配上无符号, = 0 之后 直接 跳到 65526 翻回来要 按6552次
回复

使用道具 举报

板凳
ID:979299 发表于 2022-1-6 22:30 | 只看该作者
这个程序怎么组合到一起的,看不大懂
回复

使用道具 举报

地板
ID:858009 发表于 2022-1-7 08:45 | 只看该作者
188610329 发表于 2022-1-6 21:45
我是真的很不理解, CH554 明明有硬件PWM, 为什么非要模拟?

明明  unsigned int condition=0

用uchar condition=0,也是不可以,ch554硬件的PWM不太会用,所以用模拟的,模拟没有输出
回复

使用道具 举报

5#
ID:301191 发表于 2022-1-7 20:18 | 只看该作者
顶一下
回复

使用道具 举报

6#
ID:624769 发表于 2022-1-7 21:37 | 只看该作者
qwettyuio 发表于 2022-1-7 08:45
用uchar condition=0,也是不可以,ch554硬件的PWM不太会用,所以用模拟的,模拟没有输出

CH554的PWM已经简单的不能再简单了, 总共就4个寄存器,其中两个是设置频占比的,一个是系统分频的, PWM的所有控制开关,等于都限定在一个寄存器里了,比定时器都简单,说得不好听一点,随便把这4个寄存器瞎猜尝试设置一下,做个十来次实验也就出来了。




就这么点内容,不难设置吧?


最后提一下,CH554 我记得IO 是默认开漏的。 你非要IO模拟的话,你要把IO设置成 输出,推挽,

回复

使用道具 举报

7#
ID:858009 发表于 2022-1-11 11:16 | 只看该作者
188610329 发表于 2022-1-7 21:37
CH554的PWM已经简单的不能再简单了, 总共就4个寄存器,其中两个是设置频占比的,一个是系统分频的, PWM ...

谢谢,解决l
回复

使用道具 举报

8#
ID:858009 发表于 2022-1-11 11:38 | 只看该作者
188610329 发表于 2022-1-7 21:37
CH554的PWM已经简单的不能再简单了, 总共就4个寄存器,其中两个是设置频占比的,一个是系统分频的, PWM ...

没有配置端口推挽输出,问题解决了
回复

使用道具 举报

9#
ID:858009 发表于 2022-1-11 11:42 | 只看该作者
188610329 发表于 2022-1-7 21:37
CH554的PWM已经简单的不能再简单了, 总共就4个寄存器,其中两个是设置频占比的,一个是系统分频的, PWM ...

我想问一下ch554定时器1控制定时器0启动的问题,单片机步骤配置控制不了,想请教一下原因
void Time0_Init()
{
        count = 0;
        min   = 1;
        sec   = 0;
        mTimer0Clk12DivFsys();                                     //T0定时器时钟设置
        mTimer1Clk12DivFsys();                                     //T1定时器时钟设置
        mTimer_x_ModInit(0,1);                                     //T0定时器模式设置16位定时器
        mTimer_x_ModInit(1,2);                                     //T1定时器模式设置8位自动重装定时器
        mTimer_x_SetData(0,0xC350);                                //T0定时器赋值5MS
        mTimer_x_SetData(1,0x0038);                                //T1定时器赋值5MS
        mTimer0RunCTL(1);                                          //T0定时器启动
        mTimer1RunCTL(1);                                          //T1定时器启动
        ET0   = 1;                                                 //T0定时器中断开启
        ET1   = 1;                                                 //T1定时器中断开启
        EA    = 1;
}
void        mTimer0Interrupt( void ) interrupt INT_NO_TMR0 using 1           //timer0中断服务程序,使用寄存器组1
{
        mTimer_x_SetData(0,0xC350);                                          //非自动重载方式需重新给TH0和TL0赋值       
        count++;
        if(count==20)
        {
                count=0;
                if(sec==0)
                {
                        if(min!=0)
                        {
                                sec=59;
                                min--;
                        }
                        else
                        {
                                mTimer0RunCTL(0);                                          //T0定时器停止
                        }
                }
                else sec--;
        }
}
void        mTimer1Interrupt( void ) interrupt INT_NO_TMR1 using 2
{
        cnt++;
        if(cnt>=15)     //计时3s
        {
                cnt=0;
                if(key1==1&&key2==1&&(min>0||sec>0))
                {
                        mTimer0RunCTL(1);  //开启定时器0;
                }
        }
}
void main( )
{
        Time0_Init();
        Init_1621();       //初始化HT1621
        HT1621_all_off();  //清空LCD显示       
        while(1)
        {
                Write_1621(0,0xF0,4);               
                if(key1==0)
                {
                        delay_ms(100);
                        if(key1==0)
                        {
                                if(min!=999)
                                {
                                        min++;
                                }
                        }
                        while(!key2);
                        delay_ms(1000);
                        while(!key2);
                }
                if(key2==0)
                {
                        delay_ms(100);
                        if(key2==0)
                        {
                                if(min!=0)
                                {
                                        min--;
                                }
                        }
                        while(!key1);
                        delay_ms(1000);
                        while(!key1);
                }
                min0=min/100%10;
                min1=min/10%10;
                min2=min/1%10;
                sec1=sec/10%10;
                sec2=sec/1%10;
                Display_Init(min0,min1,min2,sec1,sec2);
        }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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