产品选型

51单片机浮点数 51单片机产生PWM方法

小编 2024-11-24 产品选型 23 0

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%

End

51单片机存储器小结

存储器分为程序存储器(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之...

猜你喜欢