找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

查看数: 3063 | 评论数: 10 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-3-10 09:58

正文摘要:

自己写了一个PWM波程序,频率50HZ,用的STC12C5A单片机,然后用逻辑分析仪测了一下,结果出现了错误的连续波 我在一个群里问了一下,有人用51单片机运行我的程序,结果却是对的 但我用STC12C5a单片机, ...

回复

ID:57657 发表于 2021-4-18 18:45
study2018 发表于 2021-4-18 18:12
void time0() interrupt 1
{
        time++;

定时器模式2,装什么初值。
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;
}

你的中断程序里面居然没有装初值,也能正常运行吗?
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. }

复制代码
ID:796670 发表于 2021-3-15 08:22
glinfei 发表于 2021-3-10 10:55
你算错了,对于AT89c51,1个机器周期=12个震荡周期,对于STC12C5A60S2,1个机器周期=1个震荡周期。

请问可以通过设置AUXR为12分频,解决这个问题吗?
ID:796670 发表于 2021-3-15 08:17
dj3365191 发表于 2021-3-11 10:15
AT89C51是12T单片机,STC12是1T单片机

请问STC12的定时器不是默认12分频吗?这样他的机器周期和51不一样吗?
ID:143767 发表于 2021-3-11 10:15
AT89C51是12T单片机,STC12是1T单片机
ID:57657 发表于 2021-3-10 23:55
这种波形,可能是看门狗有问题。
ID:584814 发表于 2021-3-10 17:17
看过STC那些山寨般的广告了么,速度快真的不是胡吹的,楼上正解
ID:844772 发表于 2021-3-10 10:55
你算错了,对于AT89c51,1个机器周期=12个震荡周期,对于STC12C5A60S2,1个机器周期=1个震荡周期。

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

Powered by 单片机教程网

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