用单片机产生一个PWM波为啥周期不对啊?

2019-07-15 18:06发布

今天写了一个小程序,用单片机定时器产生一个PWM波,用定时器1产生一个波形,使P2^2口输出一个周期2秒的波,占空比是50%,可是为什么用proteus仿真是周期不对啊?是程序不对啊还是仿真不对啊?求高手指点,菜鸟在此感谢。。。下面是程序和图片。
#include<reg52.h>                                                         
#define uint unsigned int                                         
#define uchar unsigned char
sbit pwm=P2^2;
uint N;
void main()
{
   TMOD=0X01;               
   TH1=(65636-50000)/256;   
   TL1=(65636-50000)%256;
   EA=1;
   ET1=1;
   TR1=1;
   while(1);
}
void T1_time() interrupt 3                 
{       

    TH1=(65636-50000)/256;   
    TL1=(65636-50000)%256;               
                                                

         N++;
         if(N>40)                                                  
            N=0;
         if(N<=20)                                             
         pwm=1;
         else
         pwm=0;
}

A{I1M]4~[O}CP2@_8}X[G8O.jpg

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
A13
1楼-- · 2019-07-15 22:24
1、应该是65535
2、我之前也碰到仿真和现实很不一样的,真出不来不妨现实挂一下示波器
593716305
2楼-- · 2019-07-16 03:09
 精彩回答 2  元偷偷看……
ly2
3楼-- · 2019-07-16 08:29
xianyoudian 发表于 2014-11-25 19:03
检查定时器程序,是65536吧?

对对,这是一个错误,谢谢指点。。谢谢
ly2
4楼-- · 2019-07-16 10:53
xianyoudian 发表于 2014-11-25 19:03
检查定时器程序,是65536吧?

对对,这是一个错误,谢谢指点。。谢谢
ly2
5楼-- · 2019-07-16 11:09
593716305 发表于 2014-11-25 21:07
主要问题:TMOD=0X01; 是13位定时器,要改为 TMOD=0X11;才是16位;改后周期就变成2秒多一点点。
次要问题: ...

对啊,我用的定时器1,所以TMOD应该是TMOD=0x10;我只用了定时器1,所以应该改成0x01就可以吧?我仿真试过了,是对的,谢谢高手指点,谢谢。。。不过你看我下面的波形,为什么不是标准的方波呢?能指点一下吗? (Y88@4W_WPG2H6Z~{%Q[{NA.jpg


A{I1M]4~[O}CP2@_8}X[G8O.jpg
ly2
6楼-- · 2019-07-16 14:03
A13 发表于 2014-11-25 20:11
1、应该是65535
2、我之前也碰到仿真和现实很不一样的,真出不来不妨现实挂一下示波器 ...

恩恩,是错了,不过主要错误是TMOD应该是0x01,谢谢你的帮助。。

一周热门 更多>