找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机利用定时器生成10K的PWM,可实际只有2500Hz是怎么回事?

  [复制链接]
跳转到指定楼层
楼主
源程序如下,用示波器看,PWM频率是2500Hz,不知道哪里出了问题。晶振设置的是11.0592MHz

#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit PWM=P0^0;
sbit k1=P2^0;
uchar time=0;

void main()
{
TMOD=0x01;
TH0=(65536-10)/256;
TL0=(65536-10)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
}
}

void time1() interrupt 1
{
    TR0=0;
    TH0=(65536-10)/256;
    TL0=(65536-10)%256;
    TR0=1;
    time++;
    if(time>=10)                                
    time=0;                                       
    if(time<3)
    PWM=1;
    else
    PWM=0;
    }                                      



PWM.jpg (48.59 KB, 下载次数: 32)

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

使用道具 举报

沙发
ID:395176 发表于 2019-4-8 10:58 | 只看该作者
设置成50us电平翻转试试
回复

使用道具 举报

板凳
ID:468240 发表于 2019-4-8 11:41 | 只看该作者
飞机翻筋斗 发表于 2019-4-8 10:58
设置成50us电平翻转试试

设置了其他的,也是一样的。我程序没写错吧
回复

使用道具 举报

地板
ID:46065 发表于 2019-4-8 12:15 | 只看该作者
可以用现成的定时器生成器!
void Timer0Init(void)                //100微秒@11.0592MHz
{      EA=1;
        ET0=1;
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TMOD |= 0x01;                //设置定时器模式
        TL0 = 0xA4;                //设置定时初值
        TH0 = 0xFF;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
}
回复

使用道具 举报

5#
ID:451718 发表于 2019-4-8 12:40 | 只看该作者
中断里面除法运算,你以为这些都不占用时间的么?
回复

使用道具 举报

6#
ID:451718 发表于 2019-4-8 12:49 | 只看该作者
另外,你的计时器初值好像也不对, 试试
回复

使用道具 举报

7#
ID:74585 发表于 2019-4-8 15:19 | 只看该作者
这个你需要考虑下进入中断的最小时间,如果最小时间计算不能做到10Khz,那就是不可以
回复

使用道具 举报

8#
ID:74585 发表于 2019-4-8 15:19 | 只看该作者
你这个是模拟PWM
回复

使用道具 举报

9#
ID:213173 发表于 2019-4-8 16:16 | 只看该作者
你首先算一下10us的中断周期,CPU执行中断里的语句时间够不够就明白是怎么回事了。
回复

使用道具 举报

10#
ID:388197 发表于 2019-4-8 17:55 | 只看该作者
定时器初值问题吧.下载工具里就有定时器代码生成器,输入参数直接复制就行了.
回复

使用道具 举报

11#
ID:468240 发表于 2019-4-8 21:02 | 只看该作者
robinsonlin 发表于 2019-4-8 12:49
另外,你的计时器初值好像也不对, 试试

初值怎么不对了,大佬。
回复

使用道具 举报

12#
ID:468240 发表于 2019-4-8 21:03 | 只看该作者

模拟的就做不到10K吗
回复

使用道具 举报

13#
ID:468240 发表于 2019-4-8 21:04 | 只看该作者
wxxl 发表于 2019-4-8 12:15
可以用现成的定时器生成器!
void Timer0Init(void)                //100微秒@11.0592MHz
{      EA=1;

不太懂
回复

使用道具 举报

14#
ID:451718 发表于 2019-4-9 13:10 | 只看该作者
assor 发表于 2019-4-8 21:02
初值怎么不对了,大佬。

昨天回车键敲快了。 图片没有贴上去。  

STC.jpg (206.75 KB, 下载次数: 20)

STC.jpg
回复

使用道具 举报

15#
ID:468240 发表于 2019-4-9 20:15 | 只看该作者
robinsonlin 发表于 2019-4-9 13:10
昨天回车键敲快了。 图片没有贴上去。

我就是定的0.1ms啊
回复

使用道具 举报

16#
ID:508245 发表于 2019-4-9 20:51 | 只看该作者
可以用现成的定时器生成器!
void Timer0Init(void)                //100微秒@11.0592MHz
{      EA=1;
        ET0=1;
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TMOD |= 0x01;                //设置定时器模式
        TL0 = 0xA4;                //设置定时初值
        TH0 = 0xFF;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
}
这个很正确!
回复

使用道具 举报

17#
ID:468240 发表于 2019-4-10 11:05 | 只看该作者
LIZHIZHI1 发表于 2019-4-9 20:51
可以用现成的定时器生成器!
void Timer0Init(void)                //100微秒@11.0592MHz
{      EA=1;
...

我试试
回复

使用道具 举报

18#
ID:468240 发表于 2019-4-10 11:05 | 只看该作者
LIZHIZHI1 发表于 2019-4-9 20:51
可以用现成的定时器生成器!
void Timer0Init(void)                //100微秒@11.0592MHz
{      EA=1;
...

这个程序放那里?大佬
回复

使用道具 举报

19#
ID:491577 发表于 2019-4-10 13:30 | 只看该作者
只是51单片机速度太慢造成的,中断时间太短还没有运算完。改成1kHZ频率,如果仿真正常就说明这个判断是对的,或者把单片机晶振改成30MHZ,如果这时示波器检测的频率大于2500HZ也能说明是51单片机速度太慢造成的。
回复

使用道具 举报

20#
ID:468240 发表于 2019-4-11 09:23 | 只看该作者
hhh402 发表于 2019-4-10 13:30
只是51单片机速度太慢造成的,中断时间太短还没有运算完。改成1kHZ频率,如果仿真正常就说明这个判断是对的 ...

多谢
回复

使用道具 举报

21#
ID:530343 发表于 2019-5-9 08:40 | 只看该作者
可以用现成的定时器生成器!
void Timer0Init(void)                //100微秒@11.0592MHz
{      EA=1;
        ET0=1;
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TMOD |= 0x01;                //设置定时器模式
        TL0 = 0xA4;                //设置定时初值
        TH0 = 0xFF;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
}

EA=1;
ET0=1;   这两句在开始位,如在结束位,有什么不同.
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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