历史上的今天
返回首页

历史上的今天

今天是:2025年02月20日(星期四)

正在发生

2020年02月20日 | 单片机pwm频率和周期可调

2020-02-20 来源:51hei

//------------------------------------------------------------------------------------

//程序功能简介:本程序产生15HZ~~~50KHZ的方波,并且实现频率和脉宽的独立调制,即可

//在改变频率的同时不改变脉宽,再改变脉宽的同时不改变频率;同时设置

//两个调节步长------在KEY键按下时,粗调,没有按下时,细调;

//程序思路: 本程序用到两个定时器------定时器0和定时器1,其中定时器0工作在定时方式下,

//决定方波的频率;定时器1,同样工作在定时方式下,用于设定脉宽;

//------------------------------------------------------------------------------------ 

  #include

#include

#define  uchar unsigned char

#define  uint unsigned int

#define  ALL  65536             //定时器工作方式1时,最大基数长度 65536;

#define  F_osc 12000000         //晶振频率12M;


sbit KEY_F_UP=P0^2;             //频率上调按钮;

sbit KEY_F_DOWN=P0^3;           //频率下调按钮;

sbit KEY_W_UP=P0^4;             //脉宽上调按钮;

sbit KEY_W_DOWN=P0^5;           //脉宽下调按钮;

sbit KEY=P0^6;                  //粗细调节按钮-----按下为粗调,否则为细调;

sbit OUTPUT=P1^0;               //波形输出;


uchar TIMER0_H,TIMER0_L,TIMER1_H,TIMER1_L;//定时器0和定时器1的初值设置;

uchar PERCENT=50;               //初始占空比;

uchar FLAG_F=0,FLAG_W=0;//频率调节标志和脉宽调制标志;

uint  FREQ=50000;               //初始频率;

float temp;                     //临时全局变量,用于数据传递;

void delay(uchar t);           //延时函数,用于按键去抖;

void init();                      //初始化函数,用于定时器的初始化;

void calculate_F();     

//频率计算函数,当频率变化,计算出定时器0初值;

void calculate_W();     

//脉宽计算函数,脉宽变化时,计算出定时器1初值;

void key_scan();             //按键扫描函数;

void timer0();                //定时器0中断函数;

void timer1();                //定时器1中断函数;

void delay(uchar t)

{

    uchar i,j;

    while(t--)             //每个脉冲为1us

     {

      for(i=0;i<100;i++)

       for(j=0;j<100;j++);

     }

  }

void calculate_F()

{

    TIMER0_H = (uint)temp/256;

    TIMER0_L = (uint)temp%256;

}

void calculate_W()

{

    float TEMP;

    TEMP = (1 - PERCENT/100.0)*ALL + temp*PERCENT/100.0;

    TIMER1_H = (uint)TEMP/256;

    TIMER1_L = (uint)TEMP%256;

  }

  void key_scan()

  {

    delay(4);

    if(!KEY_F_UP)     //频率上调键按下;

    {

      FLAG_F=1;    //置标志位;

      if(!KEY)

        FREQ+=10;

      else

        FREQ++;

      if(FREQ>50000)

        FREQ=1;

    }

    else if(!KEY_F_DOWN)   //频率下调键按下;

    {

      FLAG_F=1;    //置标志位;

      if(!KEY)

        FREQ-=10;

      else

        FREQ--;

      if(FREQ<1)

        FREQ=50000;

     }

     else if(!KEY_W_UP)    //脉宽上调键按下;

     {

       FLAG_W=1;    //置标志位;

       if(!KEY)

         PERCENT+=5;

       else

         PERCENT++;

       if(PERCENT>49)

         PERCENT=1;

      }

     else if(!KEY_W_DOWN)   //脉宽下调键按下;

     {

       FLAG_W=1;    //置标志位;

       if(!KEY)

         PERCENT-=5;

       else

         PERCENT--;

       if(PERCENT<1)

         PERCENT=49;

      } 

      else ;

      }

  void timer0() interrupt 1      //决定频率

   {

     TH0=TIMER0_H;

     TL0=TIMER0_L;

     TR1=1;           //开定时器1;

     OUTPUT=1;

   }

   void timer1() interrupt 3     //决定脉宽

   {

     TH1=TIMER1_H;

     TL1=TIMER1_L;

     TR1=0; //关定时器1,一定要这一步,因为定时器1的定时短于定时器0;

     OUTPUT=0;

   }

   void init()

   {

     TMOD=0x11;      //定时器0和定时器1都工作在方式1,16位计数器;

     calculate_F();  //初始为1KHZ,占空比为50%;

     calculate_W();

     TH0=TIMER0_H;

     TL0=TIMER0_L;

     TH1=TIMER1_H;

     TL1=TIMER1_L;

     ET0=1;

     ET1=1;

     EA=1;

     TR0=1;

     TR1=1;


   }

main()

{

    init();

    while(1)

    {

       key_scan();

       if(FLAG_F)     //改变频率时要注意要进行脉宽的重新设置;

       {

         calculate_F();

         calculate_W();

         FLAG_F=0;

       }

       if(FLAG_W)     // 脉宽改变,频率不改变;

       {

         calculate_W();

         FLAG_W=0;

       }

     }

}


推荐阅读

史海拾趣

AIM公司的发展小趣事

随着公司业务的不断发展和产品线的丰富,AIM开始积极拓展市场,寻求更广阔的发展空间。公司积极参与国际电子展会和交流活动,与全球各地的客户和合作伙伴建立了紧密的合作关系。通过与国际知名企业的合作,AIM的产品和技术得以在全球范围内推广和应用,进一步提升了公司的知名度和影响力。

Devar Inc公司的发展小趣事

智能家居是电子行业的一个重要发展方向,Devar Inc公司也积极拓展这一领域。公司推出了一系列智能家居产品,如智能音箱、智能照明、智能安防等。这些产品不仅具备远程控制、语音控制等便捷功能,还通过Devar的AI技术实现了智能学习和智能联动。例如,智能音箱可以根据用户的习惯和喜好,为用户推荐音乐、新闻等内容;智能照明则可以根据环境光线和用户需求自动调节亮度和色温。

HDK(北陆电气)公司的发展小趣事

随着电商的兴起,Devar Inc公司看到了智能包装的巨大潜力。公司研发了一系列智能包装解决方案,利用传感器、RFID技术和物联网技术,实现了产品的追踪、溯源和防伪功能。同时,Devar还积极探索将AR技术应用于包装设计中,为消费者提供与产品包装互动的体验。这些创新不仅提升了产品的附加值,也增强了消费者对品牌的认同感。

Eby Company公司的发展小趣事

1995年,皮埃尔·奥米迪亚(Pierre Omidyar)以AuctionWeb的名字推出了eBay,最初只是一个在线拍卖个人物品的平台。随着互联网的普及和用户对在线交易需求的增长,eBay迅速吸引了大量用户。其独特的商业模式和用户友好的界面使eBay成为在线拍卖市场的领军者。1998年,eBay成功上市,成为当时最成功的互联网公司之一。

Custom Connector Corporation公司的发展小趣事

在追求经济效益的同时,CCC也注重环境保护和可持续发展。公司积极采用环保材料和生产工艺,减少对环境的影响。同时,CCC还积极参与环保公益活动,推动环保理念在员工和社会中的普及。这种环保理念不仅提升了CCC的企业形象也为其在竞争激烈的市场中赢得了更多优势。

请注意,以上故事仅为概述,具体内容和细节可能需要根据实际情况进行补充和完善。同时,由于篇幅限制,每个故事的字数可能无法完全达到500字的要求。

AIC [Analog Intergrations Corporation]公司的发展小趣事

CCC深知产品质量对于企业生存和发展的重要性。因此,公司始终将质量管理放在首位,建立了严格的质量检测体系和售后服务体系。从原材料采购到产品生产、再到售后服务,CCC都严格按照质量标准进行操作,确保每一件产品都符合客户的要求。这种对质量的执着追求让CCC赢得了客户的信赖和口碑相传。

问答坊 | AI 解惑

利用运算放大器实现的混频器

混频器常常用一个二极管桥式电路(diodebridge)或一个Gilbert单元(Gilbertcell)来实现。这两类混频器都使用了一个本地振荡器(LO)来跳转射频输入的极性。   当LO为正时,RF输入被混频转换为中频(IF)输出时极性不改变。当LO为负时,RF输入转换为IF时极 ...…

查看全部问答>

430汇编C混合编程

msp430,汇编和C语言混合编程。可以看看…

查看全部问答>

30GHz示波器助推高速串行信号测试迈入新时代

高速串行信号带来的测试挑战消费者对通信和计算机产品的要求越来越高,不断提升的速度、不断增长的容量,但却不能成正比变化的价格,成为用户决定是否掏钱购买新款产品的基本要求。这些来自终端客户的需求通过产业链逐级传递到产品研发工程师对测试 ...…

查看全部问答>

subproject的问题

用windows ce 的template建了个pda的os project 想在这个project下面加一个 subproject 来播放一个 test16bit.wav的文件 这个文件 我是从project property的custom build actions里面加入目录relase的 这个subproject我是这么写的 #include # ...…

查看全部问答>

虚拟网卡动态修改mac

    本人目前维护一个虚拟网卡的微端口驱动程序,代码已经由别人完成,且已经商品化,公司要求我增加一项功能,功能是驱动能够动态的修改虚拟网卡的mac地址。      虚拟网卡mac地址的初始化是通过读一个TXT文件,然 ...…

查看全部问答>

LPCXpresso-CN在IAR下怎么开发,选什么仿真器啊

驱动应该装好了,用lpcxpresso IDE开发无能 板子后面写了IAR,应该可以用IAR来开发 导入了一个IAR里自带的LPC1114的例程 编绎有一警告,无错误 仿真器选择那个呢,我一个个试好像都不行啊, 是不是有其他的选项要设置…

查看全部问答>

Z-Stack中SimpleApp开关结点加入网络流程

(1)开关结点初始化    这时选择的节点类型是终端节点,所以使用f8wEndev.cfg文件,所以在Zglobals.h文件中,我们可以得到下面的定义#define ZG_DEVICETYPE_ENDDEVICE        0x02#define DEVICE_LO ...…

查看全部问答>

时序图与状态机的转化

梦翼师兄,我想问下一如何把时序图对应转化为状态机,我发现自己时序图能够看懂,但是不太会转化为状态机,请师兄指导一下…

查看全部问答>

MicroPython 丢失文件

pyboard固件更新后,怎么只有boot.py,别的几个文件都没有,怎么回事呀?知道的,请指教。。。 …

查看全部问答>

STM32系统上晶振重要吗

自己搭建了STM一个最小系统 就一个芯片和导线什么也没有 试了下也没有不稳定  不知道除了倍频频率低一点 和频率精度不是很高  一般用用是不是可以   …

查看全部问答>