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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4751|回復: 7
收起左側

stc15w4k32單片機pwm程序求教

[復制鏈接]
ID:461428 發表于 2019-1-12 20:08 來自手機 | 顯示全部樓層 |閱讀模式
單片機stc15w4k32.有自帶pwm模塊。看數據手冊寫下如下漸亮燈程序。。下載后木有反應。。把知道哪錯了。。拜托大神指教。。。謝謝
mmexport1547294737523.jpg
回復

使用道具 舉報

ID:213173 發表于 2019-1-13 08:13 | 顯示全部樓層
本帖最后由 wulin 于 2019-1-13 10:21 編輯

特殊功能寄存器的配置通常用字節設置,多數不支持位操作。
給你一個PWM呼吸燈示例參考,MCU型號15W404AS,按默認CCP0輸出端P1.1。注意特殊功能寄存器的配置與STC15W4K32有所區別。
#include <STC15F2K60S2.H>//15系列頭文件
#define uint unsigned int
#define uchar unsigned char
//sbit key1=P4^2;        
//sbit key2=P4^4;        
sbit LED=P1^0;
uchar num=0x00;
bit a=0;
uint b;
void PWM_Init()
{
        CCON = 0;                        //初始化PCA控制寄存器
                                                                                                //PCA定時器停止
                                                                                                //清除CF標志
                                                                                                //清除模塊中斷標志
        CL = 0;                          //復位PCA寄存器
        CH = 0;
        CMOD = 0x02;                     //設置PCA時鐘源,PWM頻率=12MHZ/2/256=23.4375KHZ
                                                                                                //PWM頻率=11.0592MHZ/2/256=21.600KHZ
        PCA_PWM0 = 0x00;                 //PCA模塊0工作于8位PWM
        CCAP0H = CCAP0L = 0xff;          //PWM0的初始占空比為100%
        CCAPM0 = 0x42;                   //PCA模塊0為8位PWM模式
        CR = 1;                          //PCA定時器開始工作
}
void scan()
{
        static uint count1=0,count2=0;        
        if(a==0)
        {
                count1++;
                if(count1>=2000)
                {                        
                        count1=0;
                        if(num<0xff)
                        {
                                num++;
                                if(num==0xff)
                                {
                                        a=1;
                                        b=5000;
                                        while(b--);
                                }
                        }
                }
        }
        else
        {
                count2++;
                if(count2>=2000)
                {                        
                        count2=0;
                        if(num>0)
                        {
                                num--;
                                if(num==0)
                                {
                                        a=0;
                                        b=5000;
                                        while(b--);
                                }
                        }
                }
        }
}

void main()
{
        P1M0 = 0x02;                        //P1.1推挽輸出
        P1M1 = 0x00;                        //P1.1推挽輸出
        PWM_Init();
        while(1)
        {
                scan();
                CCAP0H=num;
        }
}
回復

使用道具 舉報

ID:461428 發表于 2019-1-13 17:04 來自手機 | 顯示全部樓層
wulin 發表于 2019-1-13 08:13
特殊功能寄存器的配置通常用字節設置,多數不支持位操作。
給你一個PWM呼吸燈示例參考,MCU型號15W404AS, ...

謝謝你。。。如果有單片機自帶的pwm模塊輸出pwm波的程序。。希望能拜讀。。。
回復

使用道具 舉報

ID:213173 發表于 2019-1-13 20:10 | 顯示全部樓層
kissme 發表于 2019-1-13 17:04
謝謝你。。。如果有單片機自帶的pwm模塊輸出pwm波的程序。。希望能拜讀。。。

上面的程序就是用STC15W404AS自帶PWM模塊的示例程序
回復

使用道具 舉報

ID:461428 發表于 2019-1-14 07:04 來自手機 | 顯示全部樓層
wulin 發表于 2019-1-13 20:10
上面的程序就是用STC15W404AS自帶PWM模塊的示例程序

哦哦。。我的意思是連pca計數器都不用。。。直接用pwm模塊的計數器。。。。。。謝謝耐心回答。。。。
回復

使用道具 舉報

ID:461428 發表于 2019-1-16 11:04 來自手機 | 顯示全部樓層
wulin 發表于 2019-1-13 20:10
上面的程序就是用STC15W404AS自帶PWM模塊的示例程序

上面的程序好像有點問題,循環語句。。。while(b--)位置應該不對。。
回復

使用道具 舉報

ID:210959 發表于 2019-4-27 02:13 | 顯示全部樓層
本帖最后由 51heizlxz 于 2019-4-27 17:24 編輯

最近也在學PWM,以下程序使用PWM通道,可以實現呼吸燈效果。樓主少設置東西了,比如 PWM2CR 是擴展的XSFR,需要先設置P_SW2|=0x80;才能讀寫,否則讀取的是XRAM存儲器。
而且在循環中改變PWM2T2的值,如果PWM波的周期沒到就改變了呢?
我在中斷里改PWM2T2的值,一個PWM周期變一次。
還有樓主好像也沒有設置PWM周期 PWMC=3000;

#include "STC15W4K.H"

#define uchar unsigned char
#define uint  unsigned int

void PWM_CBIF() interrupt 22
{
  static uint idata a=1;
  static uint idata b=0;

  if(a==1)
  {
   b++;
   if(b==3000)
     a=0;
  }
  if(a==0)
  {
   b--;
   if(b==0)
   { a=1; b++; }
  }

  P_SW2|=0x80;
  PWM2T2=b;
  P_SW2&=0x0F;

  PWMIF=0;
}

void main()
{

P2M0=0;
P2M1=0;  //設置P2端口為準雙向弱上拉
          //因系統上電后,與PWM有關的端口均為高阻態
          //所以,這里要設置為弱上拉狀態
P_SW2|=0x80;

PWMCFG=0x00;    //配置PWM初始輸出為低電平
PWMCKS=0x03;    //PWM使用系統時鐘
PWMCR=0x01;     //PWM通道2輸出使能
PWM2CR=0x08;    //PWM輸出為P2.7

PWMC=3000;   

PWM2T1=0;   //第一次翻轉的PWM計數值
PWM2T2=1;   //第二次翻轉的PWM計數值

P_SW2&=0x0F;

PWMCR=0xC1;        //PWM計數器開始
EA=1;                   //開總中斷

while(1)
{
  ;
}


}
回復

使用道具 舉報

ID:210959 發表于 2019-4-27 02:26 | 顯示全部樓層
樓主少設置東西了,PWM周期沒有設置PWMC=3000;
PWM2CR和PWM2T2 等寄存器是擴展XSFR不能直接讀寫,
需要先設置 P_SW2|=0x80;否則讀取的是XRAM存儲器。
而且,如果在循環中改變PWM2T2的值好像不行,應該每個PWM周期改變一次PWM2T2的值。


回復

使用道具 舉報

ID:210959 發表于 2019-4-27 08:57
呼吸燈效果:

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品视频免费观看 | 欧美在线视频网 | 日韩av在线免费 | 欧美高清视频一区 | 91麻豆精品一区二区三区 | 亚洲精品久久久久久久久久久久久 | 中文字幕1区 | 日日骚av| 亚洲九九| 久久精品网 | 国产成人小视频 | 亚洲高清一区二区三区 | 久久久爽爽爽美女图片 | 亚洲天堂精品久久 | 91婷婷韩国欧美一区二区 | 午夜影院在线观看 | 一区二区三区四区免费视频 | 精品国产一区三区 | 成人久久18免费网站麻豆 | 女女百合av大片一区二区三区九县 | 亚洲女人天堂网 | 中国美女av | 超碰美女在线 | 日本精品裸体写真集在线观看 | 久久久久9999亚洲精品 | 亚洲精品91 | 在线欧美小视频 | 亚洲视频免费观看 | 欧洲av在线 | 日韩精品免费在线观看 | 欧美日韩成人在线观看 | 黄色三级免费网站 | 久久精品二区亚洲w码 | 成人亚洲精品 | а_天堂中文最新版地址 | 欧美精品一区二区三区在线四季 | 亚洲一区二区精品视频 | 国产一区二区在线播放 | www国产成人免费观看视频,深夜成人网 | 在线观看中文字幕亚洲 | 亚洲国产精品久久久久婷婷老年 |