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

標題: stc8a單片機10位PWM,0-1023,直接可以輸出一個固定的PMW但是pwm10w++這樣就不能0-1023 [打印本頁]

作者: 余生不負    時間: 2020-3-5 12:13
標題: stc8a單片機10位PWM,0-1023,直接可以輸出一個固定的PMW但是pwm10w++這樣就不能0-1023
#include "reg51.h"
#include "intrins.h"

typedef unsigned char u8;
typedef unsigned int u16;

u16 pwm10w;
sbit  P32 = P3^2;
sbit  P22 = P2^2;
//測試工作頻率為11.0592MHz
sfr     P_SW1       =   0XA2;
sfr     CCON        =   0xd8;
sbit    CF          =   CCON^7;
sbit    CR          =   CCON^6;
sbit    CCF3        =   CCON^3;
sbit    CCF2        =   CCON^2;
sbit    CCF1        =   CCON^1;
sbit    CCF0        =   CCON^0;
sfr     CMOD        =   0xd9;
sfr     CL          =   0xe9;
sfr     CH          =   0xf9;
sfr     CCAPM0      =   0xda;
sfr     CCAP0L      =   0xea;
sfr     CCAP0H      =   0xfa;
sfr     PCA_PWM0    =   0xf2;
sfr     CCAPM1      =   0xdb;
sfr     CCAP1L      =   0xeb;
sfr     CCAP1H      =   0xfb;
sfr     PCA_PWM1    =   0xf3;
sfr     CCAPM2      =   0xdc;
sfr     CCAP2L      =   0xec;
sfr     CCAP2H      =   0xfc;
sfr     PCA_PWM2    =   0xf4;
sfr     CCAPM3      =   0xdd;
sfr     CCAP3L      =   0xed;
sfr     CCAP3H      =   0xfd;
sfr     PCA_PWM3    =   0xf5;
void Delay100ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 5;
        j = 52;
        k = 195;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}



void main()
{
    P_SW1 |=0X10;
    CCON = 0x00;
    CMOD = 0x08;                                //PCA時鐘為系統時鐘
    CL = 0x00;
    CH = 0x00;
    CCAPM0 = 0x42;                              //PCA模塊0為PWM工作模式
    PCA_PWM0 = 0x80;                            //PCA模塊0輸出6位PWM
    CCAP0L = 0x20;                              //PWM占空比為50%[(40H-20H)/40H]
    CCAP0H = 0x20;
    CCAPM1 = 0x42;                              //PCA模塊1為PWM工作模式
    PCA_PWM1 = 0x40;                            //PCA模塊1輸出7位PWM
    CCAP1L = 0x20;                              //PWM占空比為75%[(80H-20H)/80H]
    CCAP1H = 0x20;
    CCAPM2 = 0x42;                              //PCA模塊2為PWM工作模式
    PCA_PWM2 = 0x00;                            //PCA模塊2輸出8位PWM
    CCAP2L = 0x20;                              //PWM占空比為87.5%[(100H-20H)/100H]
    CCAP2H = 0x20;
    CCAPM3 = 0x42;                              //PCA模塊3為PWM工作模式
    PCA_PWM3 = 0xc0;                           //PCA模塊3輸出10位PWM
    CCAP3L = 0x20;                              //PWM占空比為96.875%[(400H-20H)/400H]
    CCAP3H = 0x20;



    CR = 1;                                     //啟動PCA計時器

    while (1)
        {
                if(P32==0)
                {
                   Delay100ms();
                   //重載值更新
                   PCA_PWM3|=(0x30&(pwm10w>>4));//高兩位XCCAPnH[1:0],重載值高2位
           CCAP3H =pwm10w;//低8位CCAPnH[7:0],重載值低8位
                   //比較值更新
                   PCA_PWM3|=(0x0c&(pwm10w>>6));//高兩位XCCAPnL[1:0],重載值高2位
               CCAP3L =pwm10w;//低8位CCAPnL[7:0],重載值低8位
                  if(++pwm10w>=1023)   pwm10w =0;
                }
       
                   if(P22==0)
                {
                   Delay100ms();
                   //重載值更新
                   PCA_PWM3|=(0x30&(pwm10w>>4));//高兩位XCCAPnH[1:0],重載值高2位
           CCAP3H =pwm10w;//低8位CCAPnH[7:0],重載值低8位
                   //比較值更新
                   PCA_PWM3|=(0x0c&(pwm10w>>6));//高兩位XCCAPnL[1:0],重載值高2位
               CCAP3L =pwm10w;//低8位CCAPnL7:0],重載值低8位         
                 
                   if(pwm10w==0)   pwm10w =1023;
                   else                          pwm10w--;
                }
        }

}
作者: 余生不負    時間: 2020-3-5 12:18
如何才能現實pwm10w 這個寄存器0-1023,電壓0-5V可調,應該寄存器設置不對,還是賦值不對,pwm10w++清0以后就只能0-1.3V如何就清0了,還是0-5V, pwm10w--到0v,以后也是0-1.3v,到底是什么問題如何現實0-1023-0-1023,這樣
作者: carpcarey    時間: 2020-3-5 14:39
u16 Dpwm10w;
                   if(pwm10w==1)   pwm10w =1024;
                   else                          pwm10w--;
                   Dpwm10w=pwm10w-1;
你用Dpwm10w不就結了?
作者: 余生不負    時間: 2020-3-5 15:19
carpcarey 發表于 2020-3-5 14:39
u16 Dpwm10w;
                   if(pwm10w==1)   pwm10w =1024;
                   else              ...

      你這個試了也不行   
      
           //重載值更新
                   PCA_PWM3|=(0x30&(pwm10w>>4));//高兩位XCCAPnH[1:0],重載值高2位
           CCAP3H =pwm10w;//低8位CCAPnH[7:0],重載值低8位
                   //比較值更新
                   PCA_PWM3|=(0x0c&(pwm10w>>6));//高兩位XCCAPnL[1:0],重載值高2位
               CCAP3L =pwm10w;//低8位CCAPnL7:0],重載值低8位   
   
              pwm10w  = 512;這樣送數據可以出2.5V;
              但是想pwm10w++; pwm10w--;這樣現實0-5V實現不了
作者: carpcarey    時間: 2020-3-5 15:54
    while (1)
        {
                if(P32==0)
                {
                   Delay100ms();
                   //重載值更新
                   PCA_PWM3|=(0x30&(pwm10w>>4));//高兩位XCCAPnH[1:0],重載值高2位
           CCAP3H =pwm10w;//低8位CCAPnH[7:0],重載值低8位
                   //比較值更新
                   PCA_PWM3|=(0x0c&(pwm10w>>6));//高兩位XCCAPnL[1:0],重載值高2位
               CCAP3L =pwm10w;//低8位CCAPnL[7:0],重載值低8位
               pwm10w++;
               pwm10w&=0x03ff;
                }
      
                   if(P22==0)
                {
                   Delay100ms();
                   //重載值更新
                   PCA_PWM3|=(0x30&(pwm10w>>4));//高兩位XCCAPnH[1:0],重載值高2位
           CCAP3H =pwm10w;//低8位CCAPnH[7:0],重載值低8位
                   //比較值更新
                   PCA_PWM3|=(0x0c&(pwm10w>>6));//高兩位XCCAPnL[1:0],重載值高2位
               CCAP3L =pwm10w;//低8位CCAPnL7:0],重載值低8位         
                 
                   pwm10w--;
                   pwm10w&=0x03ff;
                }
        }

作者: carpcarey    時間: 2020-3-5 18:57
    while (1)
    {
       if(P32==0)
       {
           Delay100ms();
           //重載值更新
           PCA_PWM3|=(0x30&(pwm10w>>4));//高兩位XCCAPnH[1:0],重載值高2位
           CCAP3H =pwm10w;//低8位CCAPnH[7:0],重載值低8位
           //比較值更新
           PCA_PWM3|=(0x0c&(pwm10w>>6));//高兩位XCCAPnL[1:0],重載值高2位
           CCAP3L =pwm10w;//低8位CCAPnL[7:0],重載值低8位
           pwm10w++;
           pwm10w&=0x03ff;
        }
   
        if(P22==0)
        {
           Delay100ms();
           //重載值更新
           PCA_PWM3|=(0x30&(pwm10w>>4));//高兩位XCCAPnH[1:0],重載值高2位
           CCAP3H =pwm10w;//低8位CCAPnH[7:0],重載值低8位
           //比較值更新
           PCA_PWM3|=(0x0c&(pwm10w>>6));//高兩位XCCAPnL[1:0],重載值高2位
           CCAP3L =pwm10w;//低8位CCAPnL7:0],重載值低8位         
           pwm10w--;
           pwm10w&=0x03ff;
        }
    }
你是這意思么?
作者: carpcarey    時間: 2020-3-5 18:58
余生不負 發表于 2020-3-5 15:19
你這個試了也不行   
      
           //重載值更新

    while (1)
    {
       if(P32==0)
       {
           Delay100ms();
           //重載值更新
           PCA_PWM3|=(0x30&(pwm10w>>4));//高兩位XCCAPnH[1:0],重載值高2位
           CCAP3H =pwm10w;//低8位CCAPnH[7:0],重載值低8位
           //比較值更新
           PCA_PWM3|=(0x0c&(pwm10w>>6));//高兩位XCCAPnL[1:0],重載值高2位
           CCAP3L =pwm10w;//低8位CCAPnL[7:0],重載值低8位
           pwm10w++;
           pwm10w&=0x03ff;
        }
   
        if(P22==0)
        {
           Delay100ms();
           //重載值更新
           PCA_PWM3|=(0x30&(pwm10w>>4));//高兩位XCCAPnH[1:0],重載值高2位
           CCAP3H =pwm10w;//低8位CCAPnH[7:0],重載值低8位
           //比較值更新
           PCA_PWM3|=(0x0c&(pwm10w>>6));//高兩位XCCAPnL[1:0],重載值高2位
           CCAP3L =pwm10w;//低8位CCAPnL7:0],重載值低8位         
           pwm10w--;
           pwm10w&=0x03ff;
        }
    }
作者: 余生不負    時間: 2020-3-5 22:36
carpcarey 發表于 2020-3-5 18:57
while (1)
    {
       if(P32==0)

太難了,10位的只能送固定數據,8位的CCAP3H = CCAP3L = 一個字節的數據++;   這樣就可以了,10位的搞不了,實在不行就不研究了,搞了1天了,搞不定,看以后有沒有大神遇到這樣的問題在這留下正確答案了。
作者: 余生不負    時間: 2020-3-5 22:38
carpcarey 發表于 2020-3-5 18:58
while (1)
    {
       if(P32==0)

   pwm10w--;
   pwm10w&=0x03ff;

這樣也不行,直接就沒反應了
作者: carpcarey    時間: 2020-3-6 13:14
那就是你按鍵的問題了。去抖。你可以用排除法,先用程序控制,不用按鍵?纯凑伎毡葧粫。
while (1)
    {
           for (i=0;i<10;i++)
           {
               Delay100ms();
           }
           //重載值更新
           PCA_PWM3|=(0x30&(pwm10w>>4));//高兩位XCCAPnH[1:0],重載值高2位
           CCAP3H =pwm10w;//低8位CCAPnH[7:0],重載值低8位
           //比較值更新
           PCA_PWM3|=(0x0c&(pwm10w>>6));//高兩位XCCAPnL[1:0],重載值高2位
           CCAP3L =pwm10w;//低8位CCAPnL[7:0],重載值低8位
           pwm10w++;
           pwm10w&=0x03ff;
   }
作者: 余生不負    時間: 2020-3-6 14:33
carpcarey 發表于 2020-3-6 13:14
那就是你按鍵的問題了。去抖。你可以用排除法,先用程序控制,不用按鍵?纯凑伎毡葧粫儭
while (1)
...

我是一直按著按鍵不放的,應該不存在抖動這個問題,我用萬用表一直測電壓沒有反應,沒有反應的可能是沒有限制,這個是雙字節的寄存器,pwm10w++超了1023以后就過了,10位的范圍吧,另外確實 試過很多方法仍然不行
作者: carpcarey    時間: 2020-3-20 19:58
硬件電路提供下?一直測電壓沒有反應,那是多少伏?按鍵松了電壓變不變?
作者: weihongping    時間: 2020-3-23 13:22
余生不負 發表于 2020-3-5 12:18
如何才能現實pwm10w 這個寄存器0-1023,電壓0-5V可調,應該寄存器設置不對,還是賦值不對,pwm10w++清0以后 ...

                {
                        PCA_PWM3 = ((i>>4)&0x0030)|((i>>6)&0x000c)|0xc0;
                        CCAP3H = i;
                       
                }


你把i替換了就可以了,只賦裝載值。
作者: 余生不負    時間: 2020-3-24 12:30
carpcarey 發表于 2020-3-20 19:58
硬件電路提供下?一直測電壓沒有反應,那是多少伏?按鍵松了電壓變不變?

注意我切換了IO口的,//  P_SW1 = 0x10;                               //ECI_2/P2.2, CCP0_2/P2.3, CCP1_2/P2.4, CCP2_2/P2.5,CCP3_2/P2.6, 看看參手冊  按著按鍵就可以,




#include "reg51.h"
#include "intrins.h"


sfr     P_SW1       =   0xa2;
sfr     CCON        =   0xd8;
sbit    CF          =   CCON^7;
sbit    CR          =   CCON^6;
sbit    CCF3        =   CCON^3;
sbit    CCF2        =   CCON^2;
sbit    CCF1        =   CCON^1;
sbit    CCF0        =   CCON^0;
sfr     CMOD        =   0xd9;
sfr     CL          =   0xe9;
sfr     CH          =   0xf9;
sfr     CCAPM0      =   0xda;
sfr     CCAP0L      =   0xea;
sfr     CCAP0H      =   0xfa;
sfr     PCA_PWM0    =   0xf2;
sfr     CCAPM1      =   0xdb;
sfr     CCAP1L      =   0xeb;
sfr     CCAP1H      =   0xfb;
sfr     PCA_PWM1    =   0xf3;
sfr     CCAPM2      =   0xdc;
sfr     CCAP2L      =   0xec;
sfr     CCAP2H      =   0xfc;
sfr     PCA_PWM2    =   0xf4;
sfr     CCAPM3      =   0xdd;
sfr     CCAP3L      =   0xed;
sfr     CCAP3H      =   0xfd;
sfr     PCA_PWM3    =   0xf5;
unsigned char aa;
unsigned int aaa;
void main()
{
    P_SW1 = 0x10;            //ECI_2/P2.2, CCP0_2/P2.3, CCP1_2/P2.4, CCP2_2/P2.5,CCP3_2/P2.6
    CCON = 0x00;
        //        CMOD=0x08;                   //sysclk
        //        CMOD=0x02;                   //sysclk/2
        //        CMOD=0x0a;                   //sysclk/4
        //        CMOD=0x0c;                   //sysclk/6
        //        CMOD=0x0e;                   //sysclk/8
                CMOD=0x00;                   //sysclk/12
        //        CMOD=0x04;             //定時器T0溢出作為時鐘源 可以做出頻率可變
    CL = 0x00;
    CH = 0x00;

    CCAPM0 = 0x42;                              //PCA模塊0為PWM工作模式
//    PCA_PWM0 = 0xc0;                            //PCA模塊0輸出10位PWM
//            PCA_PWM0 = 0xc0;                            //PCA模塊0輸出10位PWM
//                  PCA_PWM0 = 0xD4;                            //PCA模塊0輸出10位PWM
//            PCA_PWM0 = 0xE8;                            //PCA模塊0輸出10位PWM        
//            PCA_PWM0 = 0xFC;                            //PCA模塊0輸出10位PWM        
    CCAP0L = 0x20;                              //PWM占空比為96.875%[(400H-20H)/400H]
    CCAP0H = 0x20;
    CR = 1;                                     //啟動PCA計時器
                 TMOD|=0X00;//選擇為定時器0模式,工作方式1,。
        TL0 = 0x4C;                //設置定時初值
        TH0 = 0xFF;                //設置定時初值        
        ET0=1;//打開定時器0中斷允許
        TR0=1;//打開定時器        //2毫秒@12.000MHz
                 EA=1;//打開總中斷
    while (1)
                {

                }
}
void time1() interrupt 1                 //20毫秒@24.000MHz
  {          //uint a1;

        TL0 = 0xC0;                //設置定時初值
        TH0 = 0x63;                //設置定時初值
        aa++;
if(aa>5){aa=0;aaa++;}
if(aaa<256)         PCA_PWM0 = 0xc0;                            //PCA模塊0輸出10位PWM
if(aaa>256&&aaa<512)PCA_PWM0 = 0xd4;                            //PCA模塊0輸出10位PWM               
if(aaa>512&&aaa<768)PCA_PWM0 = 0xe8;                            //PCA模塊0輸出10位PWM        
if(aaa>768)         PCA_PWM0 = 0xfc;                            //PCA模塊0輸出10位PWM                        

    CCAP0L = aaa;
    CCAP0H = aaa;               
if(aaa>1023)aaa=0;               
}


這個可以0-1023,不過波形不太穩定,一會快一會慢,不是很明顯
作者: weihongping    時間: 2020-3-24 22:54
CCAP0L = aaa;這個不要,你試一下看。
作者: jolson    時間: 2021-5-6 17:20
看了下你程序,寫的太復雜了,沒必要,看規格書編寫的,注意初始化IO設置腳為輸出端口,默認是輸入,硬件觸摸按鍵,程序調試OK,
void Dimmer_PWMC(unsigned int DAT_PWM)          //PWM頻率 = PCA時鐘/1024 = 22.1184MHz/1024=21.6KHZ
{
        unsigned int FDD_PWM;
        unsigned char XCCAP0H;
        unsigned char XCCAP0L;
        FDD_PWM = 0X03FF - DAT_PWM;
        XCCAP0H = (FDD_PWM>>4)&0X30;
        XCCAP0L = (FDD_PWM>>6)&0X0C;
        if(FDD_PWM == 0X03FF)
            PCA_PWM0 |= 0x3f;
        else if(FDD_PWM == 0X0000)
                PCA_PWM0 &= 0xc0;       
        else
                PCA_PWM0 = (0xc0 | XCCAP0H | XCCAP0L);       
        CCAP0L = FDD_PWM&0XFF;                              
    CCAP0H = FDD_PWM&0XFF;
}




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