欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 寫了一個PWM波程序,STC12單片機運行錯誤,51單片機運行正確,請問為什么呢? [打印本頁]

作者: 明日香    時間: 2021-3-10 09:58
標題: 寫了一個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)
        {
        }
}


作者: glinfei    時間: 2021-3-10 10:55
你算錯了,對于AT89c51,1個機器周期=12個震蕩周期,對于STC12C5A60S2,1個機器周期=1個震蕩周期。
作者: man1234567    時間: 2021-3-10 17:17
看過STC那些山寨般的廣告了么,速度快真的不是胡吹的,樓上正解
作者: npn    時間: 2021-3-10 23:55
這種波形,可能是看門狗有問題。
作者: dj3365191    時間: 2021-3-11 10:15
AT89C51是12T單片機,STC12是1T單片機
作者: 明日香    時間: 2021-3-15 08:17
dj3365191 發表于 2021-3-11 10:15
AT89C51是12T單片機,STC12是1T單片機

請問STC12的定時器不是默認12分頻嗎?這樣他的機器周期和51不一樣嗎?
作者: 明日香    時間: 2021-3-15 08:22
glinfei 發表于 2021-3-10 10:55
你算錯了,對于AT89c51,1個機器周期=12個震蕩周期,對于STC12C5A60S2,1個機器周期=1個震蕩周期。

請問可以通過設置AUXR為12分頻,解決這個問題嗎?
作者: angmall    時間: 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. }

復制代碼

作者: study2018    時間: 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;
}

你的中斷程序里面居然沒有裝初值,也能正常運行嗎?
作者: npn    時間: 2021-4-18 18:45
study2018 發表于 2021-4-18 18:12
void time0() interrupt 1
{
        time++;

定時器模式2,裝什么初值。




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1