找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4755|回復(fù): 9
收起左側(cè)

基于STC89C52RC單片機制作的頻率及占空比均可調(diào)程序

  [復(fù)制鏈接]
ID:280979 發(fā)表于 2019-11-5 22:37 | 顯示全部樓層 |閱讀模式
注意  單片機必須是52rc不能用60s2


*/

#include"main.h"
#include"peizhi.h"
#include"smg.h"
#include"eeprom.h"
sfr WDT_CONTR=0XE1;
unsigned char HighRH = 0;  //高電平重載值的高字節(jié)
unsigned char HighRL = 0;  //高電平重載值的低字節(jié)
unsigned char LowRH  = 0;  //低電平重載值的高字節(jié)
unsigned char LowRL  = 0;  //低電平重載值的低字節(jié)
/***********************按鍵定義**********************************/
bit d1 = 1;
bit d2 = 1;
bit d3 = 1;

uint8 ci;
uint8 ca = 0;
uint8 ca1 = 0;
uint16 cb = 0;

void key();                 //按鍵函數(shù)聲明
void ConfigPWM(unsigned int fr, unsigned char dc);  //頻率和占空比調(diào)節(jié)函數(shù)

void main()
{
   bit q1 = 1;
   bit q2 = 1;
   bit q3 = 1;
   ca = EEPROMReadByte(0);
   cb = EEPROMReadByte(1)*255+EEPROMReadByte(2);

   EA = 1;       //開總中斷
   peizhit1(1);  //配置T0定時2ms

   while(1)
   {       
                  ConfigPWM(cb, ca);    //頻率100Hz,占空比10%

                  if(d1 != q1)
                  {
                          q1 = d1;
                        if(d1 == 0)
                        {

                                ca1++;
                                if(ca1 >= 2)
                                {
                                          ca1 = 0;
                                }

                        }
                  }

           if(ca1 == 1)
           {
                  if(d2 != q2)
                  {
                                  q2 = d2;
                                if(d2 == 0)
                                {
                                  
                                        ca++;
                                        EEPROMSectorErase(0);
                                        EEPROMWriteByte(0,ca);
                                        EEPROMWriteByte(2,cb);
                                        EEPROMWriteByte(1,cb>>8);
                                        if(ca >= 99)
                                        {
                                                ca = 99;
                                       
                                        }
                                       
                                }
                          }
                       
                          if(d3 != q3)
                          {
                                  q3 = d3;
                                if(d3 == 0)
                                {
                                        if(ca>0)
                                        {
                                                ca--;
                                                EEPROMSectorErase(0);
                                            EEPROMWriteByte(0,ca);
                                                EEPROMWriteByte(2,cb);
                                                EEPROMWriteByte(1,cb>>8);
                                         }
                                }
                          }
                  }
                 
                if(ca1 == 0)
                {   
                          if(d2 == 0)
                          {
                                 
                                  cb++;
                                  EEPROMSectorErase(0);
                                   EEPROMWriteByte(0,ca);
                                  EEPROMWriteByte(2,cb);
                                  EEPROMWriteByte(1,cb>>8);
                                  if(cb >= 200)
                                        {
                                                cb = 200;
                                       
                                        }
                               
                          }
                          
                          if(d3 == 0)
                          {
                                 
                                        if(cb>0)
                                        {
                                                cb--;
                                                EEPROMSectorErase(0);
                                                EEPROMWriteByte(0,ca);
                                        EEPROMWriteByte(2,cb);                       
                                                EEPROMWriteByte(1,cb>>8);               
                                         }                       
                          }

          }
                xianshi1(cb);  
                xianshi2(ca);  

   }
}

void key()
{
        static uint8 saomiaozhi[] = {1,1,1,1};
        saomiaozhi[0] = (saomiaozhi[0]<<1) | in1;
        saomiaozhi[1] = (saomiaozhi[1]<<1) | in2;
        saomiaozhi[2] = (saomiaozhi[2]<<1) | in3;
       
       
        if(saomiaozhi[0] == 0x00)
        {
                d1 = 0;
        }
        if(saomiaozhi[0] == 0xff)
        {
                d1 = 1;
        }
        if(saomiaozhi[1] == 0x00)
        {
                d2 = 0;
        }
        if(saomiaozhi[1] == 0xff)
        {
                d2 = 1;
        }
        if(saomiaozhi[2] == 0x00)
        {
                d3 = 0;
        }
        if(saomiaozhi[2] == 0xff)
        {
                d3 = 1;
        }
       
}

/* 配置并啟動PWM,fr-頻率,dc-占空比 */
void ConfigPWM(unsigned int fr, unsigned char dc)
{
    unsigned int  high, low;
    unsigned long tmp;

    tmp  = (11059200/12) / fr;  //計算一個周期所需的計數(shù)值
    high = (tmp*dc) / 100;      //計算高電平所需的計數(shù)值
    low  = tmp - high;          //計算低電平所需的計數(shù)值
    high = 65536 - high + 12;   //計算高電平的重載值并補償中斷延時
    low  = 65536 - low  + 12;   //計算低電平的重載值并補償中斷延時
    HighRH = (unsigned char)(high>>8); //高電平重載值拆分為高低字節(jié)
    HighRL = (unsigned char)high;
    LowRH  = (unsigned char)(low>>8);  //低電平重載值拆分為高低字節(jié)
    LowRL  = (unsigned char)low;
    TMOD &= 0xF0;   //清零T0的控制位
    TMOD |= 0x01;   //配置T0為模式1
    TH0 = HighRH;   //加載T0重載值
    TL0 = HighRL;
    ET0 = 1;        //使能T0中斷
    TR0 = 1;        //啟動T0
    PWMOUT = 1;     //輸出高電平
}

/* T0中斷服務(wù)函數(shù),產(chǎn)生PWM輸出 */                  
void InterruptTimer0() interrupt 1
{
    if (PWMOUT == 1)  //當(dāng)前輸出為高電平時,裝載低電平值并輸出低電平
    {
        TH0 = LowRH;
        TL0 = LowRL;
        PWMOUT = 0;
    }
    else              //當(dāng)前輸出為低電平時,裝載高電平值并輸出高電平
    {
        TH0 = HighRH;
        TL0 = HighRL;
        PWMOUT = 1;
    }
}

/* T0中斷服務(wù)函數(shù),完成數(shù)碼管、按鍵掃描與秒表計數(shù) */
void t1() interrupt 3
{
       
    TH1 = T1RH;  //重新加載重載值
    TL1 = T1RL;
        ci++;
        ssmg();                 //數(shù)碼管掃描

                 
        if(ci>=2)
    {
                ci = 0;
                key();
    }
}

應(yīng)用舉例2.JPG
操作說明.JPG
接線說明.JPG

頻率及占空比均可調(diào)帶數(shù)碼管模塊完整程序.rar

198.16 KB, 下載次數(shù): 108, 下載積分: 黑幣 -5

頻率及占空比均可調(diào)帶數(shù)碼管模塊DXP資料.rar

931.35 KB, 下載次數(shù): 79, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報

ID:385637 發(fā)表于 2019-11-6 11:45 | 顯示全部樓層
這個占空比與頻率都可調(diào),真是好資料,謝謝分享,
回復(fù)

使用道具 舉報

ID:225481 發(fā)表于 2019-11-6 13:12 | 顯示全部樓層
可以用來做LED燈光調(diào)節(jié),不錯的資料。
回復(fù)

使用道具 舉報

ID:403593 發(fā)表于 2019-11-6 16:01 | 顯示全部樓層
非常好的資料,感謝樓主分享!
回復(fù)

使用道具 舉報

ID:73030 發(fā)表于 2022-2-8 20:17 | 顯示全部樓層
這個程序值得學(xué)習(xí),謝謝作者分享。
回復(fù)

使用道具 舉報

ID:970519 發(fā)表于 2022-2-9 10:18 | 顯示全部樓層
程序值得學(xué)習(xí),謝謝作者分享
回復(fù)

使用道具 舉報

ID:138707 發(fā)表于 2022-2-28 16:41 | 顯示全部樓層
這個占空比與頻率都可調(diào),真是好資料,謝謝分享,
回復(fù)

使用道具 舉報

ID:345506 發(fā)表于 2023-7-15 09:59 | 顯示全部樓層
不錯,不錯, 很好學(xué)習(xí),參考的資料
回復(fù)

使用道具 舉報

9#
無效樓層,該帖已經(jīng)被刪除
10#
無效樓層,該帖已經(jīng)被刪除
11#
無效樓層,該帖已經(jīng)被刪除
ID:298215 發(fā)表于 2025-6-4 22:23 | 顯示全部樓層
謝謝分享,太好了
回復(fù)

使用道具 舉報

ID:145862 發(fā)表于 2025-6-6 09:27 | 顯示全部樓層
vss是多少
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表