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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

請(qǐng)教STC單片機(jī)輸出PWM問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:761175 發(fā)表于 2023-2-19 12:10 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
給位老師幫我看看下面程序,我需要實(shí)現(xiàn)1路pwm輸出,當(dāng)按鍵按下輸出電壓從4.5v降到2伏,在升到4.5伏。在30秒左右完成,
#include <STC12C5410AD.H>
#define unchar unsigned char
#define unint unsigned int
#define DUTYCYCLE(x)   (256-(128*x/50))//占空比計(jì)算公式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)    //延時(shí)子函數(shù)      
{
   unint y;      //定義一個(gè)Y變量
   for(;x>0;x--)    //如果X大于0,那么X就減1.
    for(y=500;y>0;y--);//給Y賦值為500,當(dāng)Y大于0那么Y就減1.  *******注意前面的for的語(yǔ)句后面沒(méi)有引號(hào),那么會(huì)把后面的FOR語(yǔ)句
//也認(rèn)為是他的內(nèi)部語(yǔ)句。也就是說(shuō)X執(zhí)行一次那么Y就得執(zhí)行500次。
}
void MainInt()        //
{      

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

        }
}

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

使用道具 舉報(bào)

沙發(fā)
ID:213173 發(fā)表于 2023-2-19 21:12 | 只看該作者
在VCC=5V前提下,當(dāng)按鍵按下,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))//占空比計(jì)算公式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;//計(jì)數(shù)變量
  11. unsigned char Z_ratio;//占空比變量
  12. bit Key_value;//鍵值位變量

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

  24. void PWM_Init(void)
  25. {
  26.         CCON = 0;                                //初始化PCA控制寄存器
  27.         CL = 0;                 //復(fù)位PCA寄存器
  28.         CH = 0;                 //復(fù)位PCA寄存器
  29. //        CMOD = 0x00;                         //設(shè)置PCA時(shí)鐘源,PWM頻率=11.0592MHZ/12/256=3.600KHZ 278us
  30. //        CMOD = 0x02;                         //設(shè)置PCA時(shí)鐘源,PWM頻率=11.0592MHZ/2/256=21.600KHZ 46us
  31. //        CMOD = 0x04;                         //設(shè)置PCA時(shí)鐘源,PWM頻率=11.0592MHZ/1~65536/256=43.200KHZ~0.659HZ
  32. //        CMOD = 0x06;                         //設(shè)置PCA時(shí)鐘源,PWM頻率= 外部時(shí)鐘/1/256
  33. //        CMOD = 0x08;                         //設(shè)置PCA時(shí)鐘源,PWM頻率=11.0592MHZ/1/256=43.200KHZ 23us
  34. //        CMOD = 0x0A;                         //設(shè)置PCA時(shí)鐘源,PWM頻率=11.0592MHZ/4/256=10.800KHZ 93us
  35. //        CMOD = 0x0C;                         //設(shè)置PCA時(shí)鐘源,PWM頻率=11.0592MHZ/6/256=7.200KHZ 139us
  36.         CMOD = 0x0E;                         //設(shè)置PCA時(shí)鐘源,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腳用作脈寬調(diào)節(jié)輸出
  40.         CR = 1;                 //PCA定時(shí)器開(kāi)始工作
  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默認(rèn)端口推挽模式
  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);//控制主循環(huán)周期1ms
  83.         }
  84. }

  85. void Timer0Interrupt(void) interrupt 1
  86. {
  87. //        if(++num>=10)//600毫秒,占空比從40%~90%變化時(shí)間30秒
  88.         if(++num>=1)//測(cè)試用60ms,占空比從40%~90%變化時(shí)間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. }
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

若要PWM程序,簡(jiǎn)單一點(diǎn)的寫(xiě)一個(gè)就可以了:
/*
P1.5 腳 輸出一個(gè)100 Hz的頻率的PWM程序
*/

#include <STC12C5A60S2.h>

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

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

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

老師你好,十分感謝指導(dǎo),怎么我用Proteus 8 仿真沒(méi)波形輸出呢,是我那里沒(méi)搞對(duì),在幫我看看。謝了
回復(fù)

使用道具 舉報(bào)

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

我的按鍵是接到P1.6,輸出是P1.3.用的是Proteus 8 中的89C52。看看是那里我沒(méi)搞對(duì)。謝了
回復(fù)

使用道具 舉報(bào)

7#
ID:1063483 發(fā)表于 2023-2-20 09:35 | 只看該作者
以下2點(diǎn)說(shuō)明來(lái)自百度:

1.   51系列單片機(jī)引腳電平與TTL電平兼容,也就是輸入高電位大于2.0V,低電位小于0.8V,輸出高電位大于2.4V,低電位小于0.4V。一般情況下,若電源電壓為5V,輸出高電位電壓也是5V左右,低電位電壓接近0V.
2.   0.3VCC----0V為低電平,0.7VCC---VCC為高電平,一般來(lái)講,對(duì)于5V電源的單片機(jī)來(lái)說(shuō),低電平在1.3V以下,高電平在3.7V以上,數(shù)字信號(hào)盡量不要使用1.3---3.7V這個(gè)區(qū)間,這有可能會(huì)造成單片機(jī)無(wú)法識(shí)別或識(shí)別錯(cuò)誤。

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

9#
ID:761175 發(fā)表于 2023-2-21 09:08 來(lái)自手機(jī) | 只看該作者
watsonbu 發(fā)表于 2023-2-19 22:37
“需要實(shí)現(xiàn)1路pwm輸出,當(dāng)按鍵按下輸出電壓從4.5v降到2伏,在升到4.5伏。在30秒左右完成。”

不知道為什 ...

十分感謝,你說(shuō)的芯片是什么型號(hào)的呢
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

十分感謝,我去學(xué)習(xí)一下,有什么不懂還要請(qǐng)教你的
回復(fù)

使用道具 舉報(bào)

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

十分感謝,我在試試
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久草中文在线观看 | 日韩在线 | 亚洲综合视频 | 国产精品69久久久久水密桃 | 国产精品亚洲二区 | 色男人的天堂 | 97精品超碰一区二区三区 | 超碰97人人人人人蜜桃 | www.99热 | 国产精品视频500部 a久久 | a在线免费观看视频 | 久久青青| 久久免费精彩视频 | 麻豆国产一区二区三区四区 | 精品久久久久久 | 中文在线a在线 | 亚洲免费精品 | 婷婷色在线 | 欧美成人h版在线观看 | 日韩欧美国产综合 | 欧美精品99 | 亚洲精品www久久久久久广东 | 国产成人精品综合 | 国产免费xxx | 久久久综合网 | 在线观看国产精品视频 | 国产在线精品一区 | av片网站 | www.久久艹| 日韩中文字幕在线观看 | 99久久精品免费看国产小宝寻花 | 国产精品一二三区在线观看 | 91精品国产一区二区在线观看 | 97精品视频在线 | 国产2区| 激情婷婷成人 | 午夜久草 | 国产资源在线视频 | 韩日一区 | 亚洲精品一区二区在线观看 | 久久三区|