找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2980|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

寫了一個PWM波程序,STC12單片機(jī)運(yùn)行錯誤,51單片機(jī)運(yùn)行正確,請問為什么呢?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
自己寫了一個PWM波程序,頻率50HZ,用的STC12C5A單片機(jī),然后用邏輯分析儀測了一下,結(jié)果出現(xiàn)了錯誤的連續(xù)波



我在一個群里問了一下,有人用51單片機(jī)運(yùn)行我的程序,結(jié)果卻是對的
但我用STC12C5a單片機(jī),波形卻不對,請問這是為啥呢?是因?yàn)镾TC12C和51之間的差別造成的嗎?該如何修改呢?謝謝老哥們指點(diǎn)

源程序如下:

#include <stc12c5a.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define uchar unsigned char
#define uint  unsigned int
/*用定時(shí)器T0,任選一管腳P21輸出PWM波*/
/*單片機(jī)晶振11.0592MHZ,時(shí)鐘周期為1/11.0592us*/
/*11.0592M除以12=921600,就是1秒921600個機(jī)器周期*/
/*0.1ms就是92機(jī)器周期,輸出PWM波周期為20ms,分成200份,
中斷200次,定時(shí)器初值為256-92=164*/
/*周期20ms中高電平時(shí)間1.5ms,也就是0.1ms×15*/

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

void time0init()//定時(shí)器初始化
{
  TMOD=0X02;//定時(shí)器0工作方式2,8位重裝
        TH0=164;//92個機(jī)器周期,即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)//高電平時(shí)間為0.1ms*15=1.5ms
                  PWM=1;
    else
                  PWM=0;
        }
        else
                time=0;
}

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

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:844772 發(fā)表于 2021-3-10 10:55 | 只看該作者
你算錯了,對于AT89c51,1個機(jī)器周期=12個震蕩周期,對于STC12C5A60S2,1個機(jī)器周期=1個震蕩周期。
回復(fù)

使用道具 舉報(bào)

板凳
ID:584814 發(fā)表于 2021-3-10 17:17 | 只看該作者
看過STC那些山寨般的廣告了么,速度快真的不是胡吹的,樓上正解
回復(fù)

使用道具 舉報(bào)

地板
ID:57657 發(fā)表于 2021-3-10 23:55 | 只看該作者
這種波形,可能是看門狗有問題。
回復(fù)

使用道具 舉報(bào)

5#
ID:143767 發(fā)表于 2021-3-11 10:15 | 只看該作者
AT89C51是12T單片機(jī),STC12是1T單片機(jī)
回復(fù)

使用道具 舉報(bào)

6#
ID:796670 發(fā)表于 2021-3-15 08:17 | 只看該作者
dj3365191 發(fā)表于 2021-3-11 10:15
AT89C51是12T單片機(jī),STC12是1T單片機(jī)

請問STC12的定時(shí)器不是默認(rèn)12分頻嗎?這樣他的機(jī)器周期和51不一樣嗎?
回復(fù)

使用道具 舉報(bào)

7#
ID:796670 發(fā)表于 2021-3-15 08:22 | 只看該作者
glinfei 發(fā)表于 2021-3-10 10:55
你算錯了,對于AT89c51,1個機(jī)器周期=12個震蕩周期,對于STC12C5A60S2,1個機(jī)器周期=1個震蕩周期。

請問可以通過設(shè)置AUXR為12分頻,解決這個問題嗎?
回復(fù)

使用道具 舉報(bào)

8#
ID:155507 發(fā)表于 2021-3-15 12:00 | 只看該作者
可以通過設(shè)置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. /*用定時(shí)器T0,任選一管腳P21輸出PWM波*/
  8. /*單片機(jī)晶振11.0592MHZ,時(shí)鐘周期為1/11.0592us*/
  9. /*11.0592M除以12=921600,就是1秒921600個機(jī)器周期*/
  10. /*0.1ms就是92機(jī)器周期,輸出PWM波周期為20ms,分成200份,
  11. 中斷200次,定時(shí)器初值為256-92=164*/
  12. /*周期20ms中高電平時(shí)間1.5ms,也就是0.1ms×15*/

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

  15. void time0init()//定時(shí)器初始化
  16. {
  17.         AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式
  18.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  19.         TMOD|=0x02;   //定時(shí)器0工作方式2,8位重裝
  20.         TH0=164;     //92個機(jī)器周期,即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) //高電平時(shí)間為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. }

復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

9#
ID:430857 發(fā)表于 2021-4-18 18:12 | 只看該作者
angmall 發(fā)表于 2021-3-15 12:00
可以通過設(shè)置AUXR為12分頻,解決這個問題

void time0() interrupt 1
{
        time++;
        if(time<200)     //周期為0.1ms*200=20ms
        {
                if(time<=15) //高電平時(shí)間為0.1ms*15=1.5ms
                PWM=1;
                else
                PWM=0;
        }
        else
        time=0;
}

你的中斷程序里面居然沒有裝初值,也能正常運(yùn)行嗎?
回復(fù)

使用道具 舉報(bào)

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

定時(shí)器模式2,裝什么初值。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表