51单片机产生PWM方法
89C51芯片没有自带PWM发生器,如果要用51来产生PWM波就必须要用软件编程的方法来模拟。方法大概可以分为软件延时和定时器产生两种方法。下面将逐一介绍。
1 软件延时法
利用软件延时函数,控制电平持续的时间,达到模拟pwm的效果。
程序如下:
#include<reg52.h>sbit pwm=P1^0;main(){while(1){ pwm=1;delayus(60);//置高电平后延时60us,占空比60%pwm=0;delayus(40);}}void delayus(uint x){while(x--);}
proteus软件仿真结果如下:
可见,用这种延时函数的方法就能简单地模拟出pwm输出。但是这种方法的缺点也相当明显。当程序除了要输出pwm波还要执行其他操作比如键盘扫描、显示等操作时,需要占用CPU一定的机器周期,这样就会影响pwm的准确度。现在很少会用到这种方法,接下来要介绍的是比较常用的方法。
2 定时器产生pwm
这种方法利用了定时器溢出中断,在中断服务程序改变电平的高低,在程序较复杂、多操作时仍能输出较准确的pwm波形。
2.1 注意事项
2.2.1中断服务程序的内容。
一般来说中断服务程序只完成改变标志位、转换高低电平的功能,如果中断服务程序中有太多的操作会影响pwm波的输出,尤其是除法、取余、浮点数运算会占用大量的机器周期,应在中断外完成运算。2.2.2定时器装入初值的问题。
装入初值不能太接近于定时器的溢出值。如我们使用定时器方式1,最多能计65536个数,假设我们转入的初值为65534,那么定时器计两个数就会进入中断,这样会使程序紊乱而其他功能无法正常地执行,所以一般要留50-100个数的裕量。
2.2 定时器工作方式
在定时器工作方式的选择上,可以选择定时器的工作方式0、1、2都可以,本文采用的是工作方式1,即16位定时器,这样可以获得较宽的调频范围。
2.3 定时器初值的计算
设占空比为α,频率为f
产生高电平时装入定时器高8位的值应为
产生高电平时装入定时器低8位的值应为
显然,产生低电平时的公式只要把α换成(1-α)就行了。
然而在51单片机中,浮点数运算需要消耗cpu很长的时间,为了提高程序效率,通常用100倍的占空比来计算。同时,要注意数据类型,避免超出范围,影响计算结果。关于C51的乘除法问题,可以看以下这篇文章:http://blog.163.com/ssou_1985/blog/static/295320362010311102232210/
修改后的公式如下:a为100倍占空比,fr为0.01倍频率TH0 = (65535-a*100/fr)/256; //高位初值TL0 = (65535-a*100/fr)%256;同样,低电平的公式只需把a换成(100-a)即可。
2.4 例程
本例程采用定时器T0在工作方式1下产生一路PWM,用独立键盘控制频率、占空比的加减,频率可调范围100Hz-10kHz,占空比0-100%(均为理论值,实际值略低)部分代码如下:
注:T0_H , T0_L , T1_H , T1_L 均用于暂时存储初值,进入中断服务程序后直接给寄存器TH0、TL0赋值,避免了在中断中计算。
注:flag为pwm输出标志,flag=1输出高电平,flag=0输出低电平
2.5 软件仿真结果
2.5.1 频率为100Hz
a.占空比约15%
b.占空比95%
2.5.2 频率为10KHz
a.占空比15%
b.占空比90%
End51单片机存储器小结
存储器分为程序存储器(ROM)和数据存储器(RAM),两种又都可以分为片内和片外,片外即需要自己在单片机外部扩展。
8051单片机的片内程序存储器有4K,片内数据存储器有256个字节,其中又分为高128字节位特殊功能寄存器区,真正用户能用的RAM只有低128字节。
8052单片机有8K片内程序存储器,而数据存储器除了低128字节外还有扩展的高128字节,地址上跟特殊功能寄存器一样,但物理上是独立的,寻址方式不一样,扩展的高128字节只能间接寻址。
Keil中变量的存储类型:
存储类型
说明
code
程序空间(无需改变的变量)
data
直接访问的内部数据存储器(速度最快)
idata
间接访问的内部数据存储器(可以访问全部256字节RAM)
bdata
可位寻址的内部数据存储器
xdata
外部数据寄存器(最大64K)
pdata
分页的外部数据寄存器(最大256字节,少用)
【如无使用关键字,系统则按默认处理(根据存储模式)】
Keil中的存储模式:
存储模式
说明
Small
变量默认为data型,最大128字节
Compare
变量默认为pdata型,最大256字节
Large
变量默认为xdata型,最大64K
Keil中设置如下图:
我们平常使用的STC单片机,有很多型号,具体存储器大小都要看型号:
【89/90系列的机器周期需要12个或6个时钟周期】
【12/15系列的机器周期只需要1个时钟周期】
51单片机上的FFT算法
最近用增强型51单片机做了一个简易的点阵音乐频谱显示器,最主要是自己刚学完信号处理课程,想自己写一个FFT算法。现将已经能够在51单片机上运行的FFT算法供需要的伙伴们参考。
在51单片机上运行FFT算法,需要注意一下几点:
由于51单片机的内存RAM很小,只有128字节,52有256字节,而16点的浮点数输入,就需要2*4*16=128字节的内存开销,所以只有256字节的做多只能做16点的FFT运算。而且必须要用idata定义才能将其定义在高128字节。所以要做16点以上的FFT运算,必须选用有内部扩展RAM的51系列单片机,然后用xdata定义,并且要将存储模式设为LARGE模式。
相关问答
什么是 单片机 的查表法[回答]先说第一个问题:比如用查表法将结果保存到变量i中,查表变量为x,则i=table[x],记住C语言里面数组是从0开始的,比如说上面的0x01就是table[0],0x02...
单片机 和DSP的区别是什么?单片机:以TI的MSP430系列的单片机为例,网上有很多基于此单片机的开发板。开发板有数码管显示、按键、串口、PS/2鼠标等接口。这些资源都是与单片机相连接。也...
计算机中MIPS表示什么 - 丫草莓味的吧 的回答 - 懂得系统吞吐率是系统生产力的度量标准,描述了在给定时间内处理的工作量。反映系统吞吐率的概念说明如下:1.MIPS(每秒百万次指令):公示表示为MIPS=指令...
一阶带通滤波器公式?一阶滤波算法公式为:Y(n)=aX(n)+(1-a)Y(n-1)Y(n)-本次滤波输出值;Y(n-1)-上次滤波输出值;a-滤波系数。其中,滤波系数a越小,滤波结果越平滑,但反应灵敏...
计算机中MIPS表示什么 - 173****4153 的回答 - 懂得MIPS=MillionInstructionsPerSecond(单字长定点指令平均执行速度),说简单点就是表示CPU一秒内能处理百万级指令数的能力,MIPS数值越高CPU的能力越强...
C语言中的 -是什么意思 - 150****7497 的回答 - 懂得C语言中的%2d是printf()函数的输出格式中的%a.bf。表示将数字按宽度为2,采用右对齐方式输出,若数据位数不到2位,则左边补空格。如:1、“%8d”要求...
mcu ram不够怎么办?mcuram不够用,可以程序优化:①、将固定的代码数组等,存到ROM。(51单片机用code表示存到ROM)②、压缩多余缓冲区,如数组长度根据需求来定。③、合理分...
c语言中三种基本数据?C语言的三种基本数据类型为整型、实型、字符型。1、整型。包括short、int、long等,用以表示一个整数,默认为有符号型,配合unsigned关键字,可以表示为无符号...
c语言怎么读取一个变量的二进制存储形式?printf("data:%u,%u,%u,%u",ptr[0],ptr[1],ptr[2],ptr[3]);对于int来说这样有点多余,但是这种方式可以以字节方...
你想象中的人工智能是什么样子的?目前已经实现的又有哪些?其中GPU领先其他芯片在人工智能领域中用的最广泛。GPU和CPU都擅长浮点计算,一般来说,GPU做浮点计算的能力是CPU的10倍左右。另外深度学习加速框架通过在GPU之...