找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3372|回复: 7
打印 上一主题 下一主题
收起左侧

基于STC89C52RC单片机制作的频率及占空比均可调程序

  [复制链接]
跳转到指定楼层
楼主
注意  单片机必须是52rc不能用60s2


*/

#include"main.h"
#include"peizhi.h"
#include"smg.h"
#include"eeprom.h"
sfr WDT_CONTR=0XE1;
unsigned char HighRH = 0;  //高电平重载值的高字节
unsigned char HighRL = 0;  //高电平重载值的低字节
unsigned char LowRH  = 0;  //低电平重载值的高字节
unsigned char LowRL  = 0;  //低电平重载值的低字节
/***********************按键定义**********************************/
bit d1 = 1;
bit d2 = 1;
bit d3 = 1;

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

void key();                 //按键函数声明
void ConfigPWM(unsigned int fr, unsigned char dc);  //频率和占空比调节函数

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;  //计算一个周期所需的计数值
    high = (tmp*dc) / 100;      //计算高电平所需的计数值
    low  = tmp - high;          //计算低电平所需的计数值
    high = 65536 - high + 12;   //计算高电平的重载值并补偿中断延时
    low  = 65536 - low  + 12;   //计算低电平的重载值并补偿中断延时
    HighRH = (unsigned char)(high>>8); //高电平重载值拆分为高低字节
    HighRL = (unsigned char)high;
    LowRH  = (unsigned char)(low>>8);  //低电平重载值拆分为高低字节
    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中断服务函数,产生PWM输出 */                  
void InterruptTimer0() interrupt 1
{
    if (PWMOUT == 1)  //当前输出为高电平时,装载低电平值并输出低电平
    {
        TH0 = LowRH;
        TL0 = LowRL;
        PWMOUT = 0;
    }
    else              //当前输出为低电平时,装载高电平值并输出高电平
    {
        TH0 = HighRH;
        TL0 = HighRL;
        PWMOUT = 1;
    }
}

/* T0中断服务函数,完成数码管、按键扫描与秒表计数 */
void t1() interrupt 3
{
       
    TH1 = T1RH;  //重新加载重载值
    TL1 = T1RL;
        ci++;
        ssmg();                 //数码管扫描

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

应用举例2.JPG (125.21 KB, 下载次数: 58)

应用举例2.JPG

操作说明.JPG (102.23 KB, 下载次数: 51)

操作说明.JPG

接线说明.JPG (107.82 KB, 下载次数: 52)

接线说明.JPG

频率及占空比均可调带数码管模块完整程序.rar

198.16 KB, 下载次数: 102, 下载积分: 黑币 -5

频率及占空比均可调带数码管模块DXP资料.rar

931.35 KB, 下载次数: 72, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏13 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:385637 发表于 2019-11-6 11:45 | 只看该作者
这个占空比与频率都可调,真是好资料,谢谢分享,
回复

使用道具 举报

板凳
ID:225481 发表于 2019-11-6 13:12 | 只看该作者
可以用来做LED灯光调节,不错的资料。
回复

使用道具 举报

地板
ID:403593 发表于 2019-11-6 16:01 | 只看该作者
非常好的资料,感谢楼主分享!
回复

使用道具 举报

5#
ID:73030 发表于 2022-2-8 20:17 | 只看该作者
这个程序值得学习,谢谢作者分享。
回复

使用道具 举报

6#
ID:970519 发表于 2022-2-9 10:18 | 只看该作者
程序值得学习,谢谢作者分享
回复

使用道具 举报

7#
ID:138707 发表于 2022-2-28 16:41 | 只看该作者
这个占空比与频率都可调,真是好资料,谢谢分享,
回复

使用道具 举报

8#
ID:345506 发表于 2023-7-15 09:59 | 只看该作者
不错,不错, 很好学习,参考的资料
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表