久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stc8a單片機10位PWM,0-1023,直接可以輸出一個固定的PMW但是pwm10w++這樣就不能0-1023

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:316880 發(fā)表于 2020-3-5 12:13 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#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時鐘為系統(tǒng)時鐘
    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--;
                }
        }

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

使用道具 舉報

沙發(fā)
ID:316880 發(fā)表于 2020-3-5 12:18 | 只看該作者
如何才能現(xiàn)實pwm10w 這個寄存器0-1023,電壓0-5V可調(diào),應(yīng)該寄存器設(shè)置不對,還是賦值不對,pwm10w++清0以后就只能0-1.3V如何就清0了,還是0-5V, pwm10w--到0v,以后也是0-1.3v,到底是什么問題如何現(xiàn)實0-1023-0-1023,這樣
回復(fù)

使用道具 舉報

板凳
ID:267719 發(fā)表于 2020-3-5 14:39 | 只看該作者
u16 Dpwm10w;
                   if(pwm10w==1)   pwm10w =1024;
                   else                          pwm10w--;
                   Dpwm10w=pwm10w-1;
你用Dpwm10w不就結(jié)了?
回復(fù)

使用道具 舉報

地板
ID:316880 發(fā)表于 2020-3-5 15:19 | 只看該作者
carpcarey 發(fā)表于 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;這樣送數(shù)據(jù)可以出2.5V;
              但是想pwm10w++; pwm10w--;這樣現(xiàn)實0-5V實現(xiàn)不了
回復(fù)

使用道具 舉報

5#
ID:267719 發(fā)表于 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;
                }
        }
回復(fù)

使用道具 舉報

6#
ID:267719 發(fā)表于 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;
        }
    }
你是這意思么?
回復(fù)

使用道具 舉報

7#
ID:267719 發(fā)表于 2020-3-5 18:58 | 只看該作者
余生不負 發(fā)表于 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;
        }
    }
回復(fù)

使用道具 舉報

8#
ID:316880 發(fā)表于 2020-3-5 22:36 | 只看該作者
carpcarey 發(fā)表于 2020-3-5 18:57
while (1)
    {
       if(P32==0)

太難了,10位的只能送固定數(shù)據(jù),8位的CCAP3H = CCAP3L = 一個字節(jié)的數(shù)據(jù)++;   這樣就可以了,10位的搞不了,實在不行就不研究了,搞了1天了,搞不定,看以后有沒有大神遇到這樣的問題在這留下正確答案了。
回復(fù)

使用道具 舉報

9#
ID:316880 發(fā)表于 2020-3-5 22:38 | 只看該作者
carpcarey 發(fā)表于 2020-3-5 18:58
while (1)
    {
       if(P32==0)

   pwm10w--;
   pwm10w&=0x03ff;

這樣也不行,直接就沒反應(yīng)了
回復(fù)

使用道具 舉報

10#
ID:267719 發(fā)表于 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;
   }
回復(fù)

使用道具 舉報

11#
ID:316880 發(fā)表于 2020-3-6 14:33 | 只看該作者
carpcarey 發(fā)表于 2020-3-6 13:14
那就是你按鍵的問題了。去抖。你可以用排除法,先用程序控制,不用按鍵。看看占空比會不會變。
while (1)
...

我是一直按著按鍵不放的,應(yīng)該不存在抖動這個問題,我用萬用表一直測電壓沒有反應(yīng),沒有反應(yīng)的可能是沒有限制,這個是雙字節(jié)的寄存器,pwm10w++超了1023以后就過了,10位的范圍吧,另外確實 試過很多方法仍然不行
回復(fù)

使用道具 舉報

12#
ID:267719 發(fā)表于 2020-3-20 19:58 | 只看該作者
硬件電路提供下?一直測電壓沒有反應(yīng),那是多少伏?按鍵松了電壓變不變?
回復(fù)

使用道具 舉報

13#
ID:499088 發(fā)表于 2020-3-23 13:22 | 只看該作者
余生不負 發(fā)表于 2020-3-5 12:18
如何才能現(xiàn)實pwm10w 這個寄存器0-1023,電壓0-5V可調(diào),應(yīng)該寄存器設(shè)置不對,還是賦值不對,pwm10w++清0以后 ...

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


你把i替換了就可以了,只賦裝載值。
回復(fù)

使用道具 舉報

14#
ID:316880 發(fā)表于 2020-3-24 12:30 | 只看該作者
carpcarey 發(fā)表于 2020-3-20 19:58
硬件電路提供下?一直測電壓沒有反應(yīng),那是多少伏?按鍵松了電壓變不變?

注意我切換了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;                //設(shè)置定時初值
        TH0 = 0xFF;                //設(shè)置定時初值        
        ET0=1;//打開定時器0中斷允許
        TR0=1;//打開定時器        //2毫秒@12.000MHz
                 EA=1;//打開總中斷
    while (1)
                {

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

        TL0 = 0xC0;                //設(shè)置定時初值
        TH0 = 0x63;                //設(shè)置定時初值
        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,不過波形不太穩(wěn)定,一會快一會慢,不是很明顯
回復(fù)

使用道具 舉報

15#
ID:499088 發(fā)表于 2020-3-24 22:54 | 只看該作者
CCAP0L = aaa;這個不要,你試一下看。
回復(fù)

使用道具 舉報

16#
ID:681989 發(fā)表于 2021-5-6 17:20 | 只看該作者
看了下你程序,寫的太復(fù)雜了,沒必要,看規(guī)格書編寫的,注意初始化IO設(shè)置腳為輸出端口,默認是輸入,硬件觸摸按鍵,程序調(diào)試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;
}
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 逼逼视频 | 精品亚洲一区二区三区四区五区高 | 欧美日韩一区精品 | 亚洲精品久久久蜜桃 | av性色全交蜜桃成熟时 | 日韩高清在线 | av网站在线免费观看 | 免费一区二区三区 | av一区二区在线观看 | 一区精品国产欧美在线 | 日韩欧美二区 | 91天堂 | 国产视频一区二区 | 久久不卡 | 一级黄色录像毛片 | 亚洲最大av网站 | 91精品国产自产在线老师啪 | 欧美视频第二页 | 一区二区国产在线观看 | 国产成人网 | 国产午夜精品一区二区三区四区 | 中文字幕在线视频精品 | 暖暖日本在线视频 | 成人一区二区三区在线观看 | 一级毛片高清 | 91精品国产一区二区在线观看 | 久久精品视频网站 | 国产探花在线精品一区二区 | 超碰97免费在线 | 国产综合在线视频 | 一区二区久久电影 | 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | 国产高清在线精品一区二区三区 | 中文在线播放 | 五月激情久久 | 久久精品亚洲成在人线av网址 | 亚洲综合在线一区 | 无码日韩精品一区二区免费 | 欧美日韩一区精品 | 国产美女在线观看 | 婷婷开心激情综合五月天 |