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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2297|回復: 12
打印 上一主題 下一主題
收起左側

請教STC單片機輸出PWM問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:761175 發表于 2023-2-19 12:10 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
給位老師幫我看看下面程序,我需要實現1路pwm輸出,當按鍵按下輸出電壓從4.5v降到2伏,在升到4.5伏。在30秒左右完成,
#include <STC12C5410AD.H>
#define unchar unsigned char
#define unint unsigned int
#define DUTYCYCLE(x)   (256-(128*x/50))//占空比計算公式256-(80/x=50/128)=XX,  ** 占空比**


unchar  yi=1;
unchar  er=0;

sbit KEY0=P1^6;
sbit KEY1=P1^7;
unint CYCLE0,CYCLE1;
void Delay(unint x)    //延時子函數      
{
   unint y;      //定義一個Y變量
   for(;x>0;x--)    //如果X大于0,那么X就減1.
    for(y=500;y>0;y--);//給Y賦值為500,當Y大于0那么Y就減1.  *******注意前面的for的語句后面沒有引號,那么會把后面的FOR語句
//也認為是他的內部語句。也就是說X執行一次那么Y就得執行500次。
}
void MainInt()        //
{      

        CMOD|=0x02;//選擇SYSCLK為PWM的時鐘源//控制PWM波的頻率
        CCAPM0|=0x42;//允許比較器功能,開啟PWM0
        CCAPM1|=0x42;//允許比較器功能,開啟PWM1
        CL=0x00;//計數器清零
        CH=0x00;
        CCAP0L=0x33;//自動裝入初始值,控制PWM占空比靠著兩個,大于這個數輸出1,反之。。
        CCAP0H=0x33; //   CCAPOL  CCAPOH  為PWM0的最高占空比和最低占空比。
        CCAP1L=0x00; //猜也猜到了這個是PWM1的低占空比。
        CCAP1H=0x00; //這個也是我猜的哈哈PWM1的高占空比。
        CCON|=0;//啟動PWM
               CR = 1;                         //PCA 計時器啟動運行
}
// 按鍵檢查函數,用來調節PWM的占空比0%-100%
void KeyScan(void)
{
   if(KEY1==0)
    {
          Delay(500);
          if(KEY1==0);   
          CYCLE0+=1;
          if(CYCLE0>100)
           CYCLE0=0;
      CCAP0L=DUTYCYCLE(CYCLE0);//自動裝入初始值,控制PWM占空比靠著兩個,大于這個數輸出1,反之。。
      CCAP0H=DUTYCYCLE(CYCLE0);//占空比計算公式256-(80/x=50/128)=XX,
      CCAP1L=DUTYCYCLE(CYCLE1);
      CCAP1H=DUTYCYCLE(CYCLE1);
        }
}
void main(void)
{
   MainInt();
    CYCLE0=100;
   while(1)
    {
//****************下面語句是不斷加減CYCLE的數值來調節占空比輸出的。
           if(yi==1)
     {
      Delay(30);
   CYCLE0--;
   if(CYCLE0==1)
   er=1,yi=0;
     }
     if(er==1)
     {
      Delay(50);
   CYCLE0++;
   if(CYCLE0==30)
   er=0,yi=1;
     }



   CCAP0L=DUTYCYCLE(CYCLE0);//自動裝入初始值,控制PWM占空比靠著兩個,大于這個數輸出1,反之。。
      CCAP0H=DUTYCYCLE(CYCLE0);//占空比計算公式256-(80/x=50/128)=XX,
      CCAP1L=DUTYCYCLE(CYCLE1);
      CCAP1H=DUTYCYCLE(CYCLE1);

        }
}

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

使用道具 舉報

沙發
ID:213173 發表于 2023-2-19 21:12 | 只看該作者
在VCC=5V前提下,當按鍵按下,PWM輸出電壓從2伏到4.5伏范圍變化,也就是占空比在40~90%范圍變化。
  1. #include <STC12C5410AD.H>
  2. #define unchar unsigned char
  3. #define unint unsigned int
  4. //#define DUTYCYCLE(x)   (256-(128*x/50))//占空比計算公式256-(80/x=50/128)=XX,  ** 占空比**
  5. //unchar  yi=1;
  6. //unchar  er=0;

  7. sbit KEY0=P1^6;
  8. //sbit KEY1=P1^7;
  9. //unint CYCLE0,CYCLE1;
  10. unsigned char num;//計數變量
  11. unsigned char Z_ratio;//占空比變量
  12. bit Key_value;//鍵值位變量

  13. void Timer0Init(void)//60毫秒@11.0592MHz
  14. {
  15.         AUXR &= 0x7F;                //定時器時鐘12T模式
  16.         TMOD &= 0xF0;                //設置定時器模式
  17.         TL0 = 0x00;                //設置定時初始值
  18.         TH0 = 0x28;                //設置定時初始值
  19.         TF0 = 0;                //清除TF0標志
  20.         TR0 = 1;                //定時器0開始計時
  21.         EA  = 1;
  22.         ET0 = 1;
  23. }

  24. void PWM_Init(void)
  25. {
  26.         CCON = 0;                                //初始化PCA控制寄存器
  27.         CL = 0;                 //復位PCA寄存器
  28.         CH = 0;                 //復位PCA寄存器
  29. //        CMOD = 0x00;                         //設置PCA時鐘源,PWM頻率=11.0592MHZ/12/256=3.600KHZ 278us
  30. //        CMOD = 0x02;                         //設置PCA時鐘源,PWM頻率=11.0592MHZ/2/256=21.600KHZ 46us
  31. //        CMOD = 0x04;                         //設置PCA時鐘源,PWM頻率=11.0592MHZ/1~65536/256=43.200KHZ~0.659HZ
  32. //        CMOD = 0x06;                         //設置PCA時鐘源,PWM頻率= 外部時鐘/1/256
  33. //        CMOD = 0x08;                         //設置PCA時鐘源,PWM頻率=11.0592MHZ/1/256=43.200KHZ 23us
  34. //        CMOD = 0x0A;                         //設置PCA時鐘源,PWM頻率=11.0592MHZ/4/256=10.800KHZ 93us
  35. //        CMOD = 0x0C;                         //設置PCA時鐘源,PWM頻率=11.0592MHZ/6/256=7.200KHZ 139us
  36.         CMOD = 0x0E;                         //設置PCA時鐘源,PWM頻率=11.0592MHZ/8/256=5.400KHZ 185us
  37.         PCA_PWM0 = 0x00;        //PCA模塊0工作于8位PWM
  38.         CCAP0H = CCAP0L = 0xff; //PWM0的占空比為0%
  39.         CCAPM0 = 0x42;                        //允許CCP0腳用作脈寬調節輸出
  40.         CR = 1;                 //PCA定時器開始工作
  41. }

  42. void Delay_ms(unsigned int t)//1T@11.0592MHz
  43. {
  44.         unsigned int i,j;
  45.         for(i=t;i>0;i--)
  46.                 for(j=1100;j>0;j--);
  47. }

  48. void KeyScan(void)
  49. {
  50.         static unsigned char count;
  51.         static bit sign_key;

  52.         if(!KEY0)
  53.         {
  54.                 if(++count>=20 && sign_key==0)
  55.                 {
  56.                         sign_key=1;
  57.                         Key_value=~Key_value;                       
  58.                 }
  59.         }
  60.         else
  61.         {
  62.                 count=0;
  63.                 sign_key=0;
  64.         }
  65. }
  66. void main(void)
  67. {
  68.         P0M0 = 0x00;
  69.         P0M1 = 0x00;
  70.         P1M0 = 0x01;//PWM0默認端口推挽模式
  71.         P1M1 = 0x00;
  72.         P2M0 = 0x00;
  73.         P2M1 = 0x00;
  74.         P3M0 = 0x00;
  75.         P3M1 = 0x00;

  76.         PWM_Init();
  77.         Timer0Init();
  78.         Z_ratio=40;
  79.         while(1)
  80.         {
  81.                 KeyScan();
  82.                 Delay_ms(1);//控制主循環周期1ms
  83.         }
  84. }

  85. void Timer0Interrupt(void) interrupt 1
  86. {
  87. //        if(++num>=10)//600毫秒,占空比從40%~90%變化時間30秒
  88.         if(++num>=1)//測試用60ms,占空比從40%~90%變化時間3秒
  89.         {
  90.                 num=0;
  91.                 if(Key_value)
  92.                 {
  93.                         if(Z_ratio<90)
  94.                                 Z_ratio++;
  95.                 }
  96.                 else               
  97.                 {
  98.                         if(Z_ratio>40)
  99.                                 Z_ratio--;

  100.                 }
  101.                 CCAP0H=256-(Z_ratio*2.56);
  102.         }
  103. }
復制代碼

回復

使用道具 舉報

板凳
ID:1034262 發表于 2023-2-19 21:12 | 只看該作者
不斷改變占空比就可以了。
回復

使用道具 舉報

地板
ID:1063483 發表于 2023-2-19 22:37 | 只看該作者
“需要實現1路pwm輸出,當按鍵按下輸出電壓從4.5v降到2伏,在升到4.5伏。在30秒左右完成。”

不知道為什么一定要在這種場合用PWM輸出,如果用最便宜的ATMEL芯片控制兩個I/O口輸出,
一個P1.0口輸出低電平時,輸出電壓就是4.5V;
如果另一個P1.2口輸出低電平時,輸出就是2V;
外面輸出電壓采取簡單的分壓電路實現就可以了。
當按鍵按下時由P1.0口由低電平取反,P1.2輸出低電平30秒,P1.0再度取反輸出低電平,
即保證輸出4.5V->2V->4.5V 時間30秒。

若要PWM程序,簡單一點的寫一個就可以了:
/*
P1.5 腳 輸出一個100 Hz的頻率的PWM程序
*/

#include <STC12C5A60S2.h>

sbit PWM_PIN = P1 ^ 5;//輸出Pin

//T0和T1的初始化函數
void initTimer(void)   
{
  TMOD = 0x11;              //設置工作方式
  EA = 1;
  ET0 = 1;                  //開啟T0的中斷
  ET1 = 1;                  //開啟T1的中斷
  TH1 = 0xDC;               //10毫秒
  TL1 = 0x00;               //T1的預置值
  TH0 = 0xF8;               //2毫秒
  TL0 = 0xCD;               //T0的預置值
  TR0 = 1;
  TR1 = 1;                                                                //啟動兩個定時器
}
//TL0中斷服務子函數,使用通用工作寄存器組1
void Timer0(void) interrupt 1 using 1
{
        PWM_PIN = 0;             //P1_0引腳為低電平
        TR0 = 0;                                                        //停止定時器TL0
    TH0 = 0xF8;               //2毫秒
    TL0 = 0xCD;               //T0的預置值
}
//TH0中斷服務子函數,占用定時計數器1的中斷向量,使用通用工作寄存器組2
void Timer1(void) interrupt 3 using 2
{
        PWM_PIN = 1;             //P1_0引腳為高電平
        TR0 = 1;                                                        //啟動定時器TL0
          TH1 = 0xDC;               //10毫秒
          TL1 = 0x00;               //T0的預置值                                       
}
int main(void)
{
  PWM_PIN = 0;               //初始化為低電平
  initTimer();            //初始化T0和T1
  while(1)
  {
  }
}

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

5#
ID:761175 發表于 2023-2-19 23:40 | 只看該作者
wulin 發表于 2023-2-19 21:12
在VCC=5V前提下,當按鍵按下,PWM輸出電壓從2伏到4.5伏范圍變化,也就是占空比在40~90%范圍變化。

老師你好,十分感謝指導,怎么我用Proteus 8 仿真沒波形輸出呢,是我那里沒搞對,在幫我看看。謝了
回復

使用道具 舉報

6#
ID:761175 發表于 2023-2-19 23:53 | 只看該作者
wulin 發表于 2023-2-19 21:12
在VCC=5V前提下,當按鍵按下,PWM輸出電壓從2伏到4.5伏范圍變化,也就是占空比在40~90%范圍變化。

我的按鍵是接到P1.6,輸出是P1.3.用的是Proteus 8 中的89C52。看看是那里我沒搞對。謝了
回復

使用道具 舉報

7#
ID:1063483 發表于 2023-2-20 09:35 | 只看該作者
以下2點說明來自百度:

1.   51系列單片機引腳電平與TTL電平兼容,也就是輸入高電位大于2.0V,低電位小于0.8V,輸出高電位大于2.4V,低電位小于0.4V。一般情況下,若電源電壓為5V,輸出高電位電壓也是5V左右,低電位電壓接近0V.
2.   0.3VCC----0V為低電平,0.7VCC---VCC為高電平,一般來講,對于5V電源的單片機來說,低電平在1.3V以下,高電平在3.7V以上,數字信號盡量不要使用1.3---3.7V這個區間,這有可能會造成單片機無法識別或識別錯誤。

你檢查一下芯片輸出腳的電壓,輸出是不是5V和(0點幾)V,不用理會波形.  
占空比40%~90%,不等于輸出2V到4.5V電壓,還是要加分壓器的,取得你要的電壓。希望對你有幫助。
回復

使用道具 舉報

8#
ID:1063483 發表于 2023-2-21 09:06 | 只看該作者
“如果用最便宜的ATMEL芯片控制兩個I/O口輸出”
樓主問是ATMEL什么型號,昨天查了。好像是  MICROCHIP的  PIC16F819 之類芯片,以前是幾毛錢,現在好像長到了4塊左右了。microchip和 atemel 現在都在一起了,還是怎么了,你再研究研究。
回復

使用道具 舉報

9#
ID:761175 發表于 2023-2-21 09:08 來自手機 | 只看該作者
watsonbu 發表于 2023-2-19 22:37
“需要實現1路pwm輸出,當按鍵按下輸出電壓從4.5v降到2伏,在升到4.5伏。在30秒左右完成。”

不知道為什 ...

十分感謝,你說的芯片是什么型號的呢
回復

使用道具 舉報

10#
ID:1063483 發表于 2023-2-21 09:17 | 只看該作者
型號:PIC16F819 這系列的芯片,好像是 MICROCHIP,但上面有ATMEL字樣,以前是幾毛錢,現在要4塊了
回復

使用道具 舉報

11#
ID:213173 發表于 2023-2-21 10:12 | 只看該作者
稻草人008 發表于 2023-2-19 23:40
老師你好,十分感謝指導,怎么我用Proteus 8 仿真沒波形輸出呢,是我那里沒搞對,在幫我看看。謝了

給你的示例是基于你的程序頭文件#include <STC12C5410AD.H>修改,亦可用于STC15系列。用IAP15W4K58S4芯片實物運行完全正常。仿真軟件對于增強型51芯片的新增功能基本沒有實際意義。本示例使用了STC自帶的PWM功能模塊,默認PWM0輸出端口P1.1。AT89C52根本不具備此模塊。
回復

使用道具 舉報

12#
ID:761175 發表于 2023-2-21 10:17 來自手機 | 只看該作者
watsonbu 發表于 2023-2-21 09:17
型號:PIC16F819 這系列的芯片,好像是 MICROCHIP,但上面有ATMEL字樣,以前是幾毛錢,現在要4塊了

十分感謝,我去學習一下,有什么不懂還要請教你的
回復

使用道具 舉報

13#
ID:761175 發表于 2023-2-22 17:31 來自手機 | 只看該作者
wulin 發表于 2023-2-21 10:12
給你的示例是基于你的程序頭文件#include 修改,亦可用于STC15系列。用IAP15W4K58S4芯片實物運行完全正常 ...

十分感謝,我在試試
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲午夜视频在线观看 | 亚洲福利在线观看 | 亚洲高清三级 | 亚洲自拍偷拍欧美 | 天天插日日操 | 欧美成人精品一区二区男人看 | 久久国产精品免费一区二区三区 | 日韩久久久久久久久久久 | 99精品欧美一区二区三区综合在线 | 国内精品在线视频 | 91高清视频在线 | 天天操网 | 粉嫩国产精品一区二区在线观看 | 韩国主播午夜大尺度福利 | 日韩1区| 日韩福利视频 | avhd101在线成人播放 | 亚洲精品久久国产高清情趣图文 | 天天看夜夜 | 国产精品福利网站 | 亚洲精品一区国语对白 | 一级a性色生活片久久毛片 一级特黄a大片 | 精品日韩在线 | 成人免费在线播放 | 国产精品福利网 | 91精品久久久久久久久久入口 | h视频网站在线观看 | 精品成人 | 国产高清不卡 | 亚洲精品18 | 亚洲三区视频 | 国产精品日本一区二区在线播放 | 在线日韩欧美 | www日韩| 国产精品久久久久aaaa九色 | 中国一级毛片免费 | 日韩在线中文字幕 | 亚洲欧美日本国产 | 蜜臀久久| 欧美成人一区二区三区 | 国产亚洲一区二区在线观看 |