找回密码
 立即注册

QQ登录

只需一步,快速开始

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

写了一个PWM波程序,STC12单片机运行错误,51单片机运行正确,请问为什么呢?

[复制链接]
跳转到指定楼层
楼主
自己写了一个PWM波程序,频率50HZ,用的STC12C5A单片机,然后用逻辑分析仪测了一下,结果出现了错误的连续波



我在一个群里问了一下,有人用51单片机运行我的程序,结果却是对的
但我用STC12C5a单片机,波形却不对,请问这是为啥呢?是因为STC12C和51之间的差别造成的吗?该如何修改呢?谢谢老哥们指点

源程序如下:

#include <stc12c5a.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define uchar unsigned char
#define uint  unsigned int
/*用定时器T0,任选一管脚P21输出PWM波*/
/*单片机晶振11.0592MHZ,时钟周期为1/11.0592us*/
/*11.0592M除以12=921600,就是1秒921600个机器周期*/
/*0.1ms就是92机器周期,输出PWM波周期为20ms,分成200份,
中断200次,定时器初值为256-92=164*/
/*周期20ms中高电平时间1.5ms,也就是0.1ms×15*/

sbit PWM=P2^1;//P21输出PWM波   
uchar time=0;   //占空比

void time0init()//定时器初始化
{
  TMOD=0X02;//定时器0工作方式2,8位重装
        TH0=164;//92个机器周期,即0.1ms
        TL0=164;
        ET0=1;
        EA=1;
        TR0=1;
}

void time0() interrupt 1
{
        time++;
        if(time<200)//周期为0.1ms*200=20ms
        {
          if(time<=15)//高电平时间为0.1ms*15=1.5ms
                  PWM=1;
    else
                  PWM=0;
        }
        else
                time=0;
}

void main()
{
  time0init();
        while(1)
        {
        }
}

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

使用道具 举报

沙发
ID:844772 发表于 2021-3-10 10:55 | 只看该作者
你算错了,对于AT89c51,1个机器周期=12个震荡周期,对于STC12C5A60S2,1个机器周期=1个震荡周期。
回复

使用道具 举报

板凳
ID:584814 发表于 2021-3-10 17:17 | 只看该作者
看过STC那些山寨般的广告了么,速度快真的不是胡吹的,楼上正解
回复

使用道具 举报

地板
ID:57657 发表于 2021-3-10 23:55 | 只看该作者
这种波形,可能是看门狗有问题。
回复

使用道具 举报

5#
ID:143767 发表于 2021-3-11 10:15 | 只看该作者
AT89C51是12T单片机,STC12是1T单片机
回复

使用道具 举报

6#
ID:796670 发表于 2021-3-15 08:17 | 只看该作者
dj3365191 发表于 2021-3-11 10:15
AT89C51是12T单片机,STC12是1T单片机

请问STC12的定时器不是默认12分频吗?这样他的机器周期和51不一样吗?
回复

使用道具 举报

7#
ID:796670 发表于 2021-3-15 08:22 | 只看该作者
glinfei 发表于 2021-3-10 10:55
你算错了,对于AT89c51,1个机器周期=12个震荡周期,对于STC12C5A60S2,1个机器周期=1个震荡周期。

请问可以通过设置AUXR为12分频,解决这个问题吗?
回复

使用道具 举报

8#
ID:155507 发表于 2021-3-15 12:00 | 只看该作者
可以通过设置AUXR为12分频,解决这个问题

  1. #include <stc12c5a.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #define uchar unsigned char
  6. #define uint  unsigned int
  7. /*用定时器T0,任选一管脚P21输出PWM波*/
  8. /*单片机晶振11.0592MHZ,时钟周期为1/11.0592us*/
  9. /*11.0592M除以12=921600,就是1秒921600个机器周期*/
  10. /*0.1ms就是92机器周期,输出PWM波周期为20ms,分成200份,
  11. 中断200次,定时器初值为256-92=164*/
  12. /*周期20ms中高电平时间1.5ms,也就是0.1ms×15*/

  13. sbit PWM=P2^1;//P21输出PWM波   
  14. uchar time=0;   //占空比

  15. void time0init()//定时器初始化
  16. {
  17.         AUXR &= 0x7F;                //定时器时钟12T模式
  18.         TMOD &= 0xF0;                //设置定时器模式
  19.         TMOD|=0x02;   //定时器0工作方式2,8位重装
  20.         TH0=164;     //92个机器周期,即0.1ms
  21.         TL0=164;
  22.         ET0=1;
  23.         EA=1;
  24.         TR0=1;
  25. }

  26. void time0() interrupt 1
  27. {
  28.         time++;
  29.         if(time<200)     //周期为0.1ms*200=20ms
  30.         {
  31.                 if(time<=15) //高电平时间为0.1ms*15=1.5ms
  32.                 PWM=1;
  33.                 else
  34.                 PWM=0;
  35.         }
  36.         else
  37.         time=0;
  38. }

  39. void main()
  40. {
  41.         time0init();
  42.         while(1)
  43.         {
  44.                
  45.         }
  46. }

复制代码
回复

使用道具 举报

9#
ID:430857 发表于 2021-4-18 18:12 | 只看该作者
angmall 发表于 2021-3-15 12:00
可以通过设置AUXR为12分频,解决这个问题

void time0() interrupt 1
{
        time++;
        if(time<200)     //周期为0.1ms*200=20ms
        {
                if(time<=15) //高电平时间为0.1ms*15=1.5ms
                PWM=1;
                else
                PWM=0;
        }
        else
        time=0;
}

你的中断程序里面居然没有装初值,也能正常运行吗?
回复

使用道具 举报

10#
ID:57657 发表于 2021-4-18 18:45 | 只看该作者
study2018 发表于 2021-4-18 18:12
void time0() interrupt 1
{
        time++;

定时器模式2,装什么初值。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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