历史上的今天
今天是: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; } } }
史海拾趣
|
混频器常常用一个二极管桥式电路(diodebridge)或一个Gilbert单元(Gilbertcell)来实现。这两类混频器都使用了一个本地振荡器(LO)来跳转射频输入的极性。 当LO为正时,RF输入被混频转换为中频(IF)输出时极性不改变。当LO为负时,RF输入转换为IF时极 ...… 查看全部问答> |
|
高速串行信号带来的测试挑战消费者对通信和计算机产品的要求越来越高,不断提升的速度、不断增长的容量,但却不能成正比变化的价格,成为用户决定是否掏钱购买新款产品的基本要求。这些来自终端客户的需求通过产业链逐级传递到产品研发工程师对测试 ...… 查看全部问答> |
|
用windows ce 的template建了个pda的os project 想在这个project下面加一个 subproject 来播放一个 test16bit.wav的文件 这个文件 我是从project property的custom build actions里面加入目录relase的 这个subproject我是这么写的 #include # ...… 查看全部问答> |
|
本人目前维护一个虚拟网卡的微端口驱动程序,代码已经由别人完成,且已经商品化,公司要求我增加一项功能,功能是驱动能够动态的修改虚拟网卡的mac地址。 虚拟网卡mac地址的初始化是通过读一个TXT文件,然 ...… 查看全部问答> |
|
LPCXpresso-CN在IAR下怎么开发,选什么仿真器啊 驱动应该装好了,用lpcxpresso IDE开发无能 板子后面写了IAR,应该可以用IAR来开发 导入了一个IAR里自带的LPC1114的例程 编绎有一警告,无错误 仿真器选择那个呢,我一个个试好像都不行啊, 是不是有其他的选项要设置… 查看全部问答> |
|
(1)开关结点初始化 这时选择的节点类型是终端节点,所以使用f8wEndev.cfg文件,所以在Zglobals.h文件中,我们可以得到下面的定义#define ZG_DEVICETYPE_ENDDEVICE 0x02#define DEVICE_LO ...… 查看全部问答> |




