历史上的今天
返回首页

历史上的今天

今天是:2025年04月09日(星期三)

正在发生

2019年04月09日 | C51单片机通过串口调节PWM波

2019-04-09 来源:eefocus

PWM 是一种常用的电子控制技术


PWM 本意为 脉冲宽度调制,可以简单理解为对占空比的控制。下图就是占空比图例,一个周期内高电平时间与周期时间的比值。



现在的一些MCU自带PWM控制功能,但是51/52单片机还是没有这个功能。可以用程序自己实现。


用到的51单片机资源如下:


1.双定时器及定时器中断 2.串口和串口中断 


下面看下程序:


PWM.H


#ifndef _PWM_H

#define _PWM_H

#include

#include

#include

#define uint  unsigned int 

#define uchar unsigned char

#define Pwm_period 100      //计数最大值

sbit PWM_OUT=P1^2;           //PWM波输出口

void init ();

void delayms();

void pwmset(uint NewPwmValue);

#endif

PWM.C 


#include "pwm.h"

uint PwmH=0,PwmperiodCount=0;

uint Pwmvalue=0;

void delayms()

{

uint i,j;

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

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

}

void init ()

{

TMOD=0X22;  //双定时器都打开工作方式2

SCON=0X50;

TH1=0XFD;    //9600的波特率

TL1=0XFD;

TL0=245; //1ms定时器

TH0=245;

ET0=1;

TR0=1;

TR1=1;

EA=1;

ES=1;

PS=1;       //串口中断有最高优先级

PwmH=0;     //高电平的占空比

PwmperiodCount=0;  //时间计数


}

 

void pwmset(uint NewPwmValue)       //设置占空比 (调节PWM)

{

if((NewPwmValue>=1)&&(NewPwmValue<=99))

{

PwmH=NewPwmValue;

}

else     //新设置的占空比没有意义

{

PwmH=0x01;   //输出一个脉冲

}

}

 

 

void pwmproduce() interrupt 1    //定时0的方式二中断

{

PwmperiodCount++;           //时间计数 每1ms加一

if(PwmperiodCount<=PwmH)    //计数时间小于规定占空比

{

PWM_OUT=1;         //输出高电平

}

else                      //到达了规定时间

{

PWM_OUT=0;        //输出低电平

if(PwmperiodCount>=Pwm_period)  //计数值到了100

{

PwmperiodCount=0;     //计数值清零

}

}

}

void chuan() interrupt 5      //串口中断

{

RI=0;   

Pwmvalue=SBUF;          //接受串口发来的占空比数据

pwmset(Pwmvalue);       //设置新的占空比

ES=0;

TI=1;

printf("successful! PWM is %d%n",Pwmvalue);   //向电脑回馈信息

while(!TI);

TI=0;

ES=1;

}

pwmmain.c


#include "pwm.h"

static uint Pwmscale=25;  //pwm的初值 25%

void main  ()

{

init();

pwmset(Pwmscale);   //设置初值

while(1)

{

;

}

 

}

这个程序用到的单片机资源不少,但其实程序很简单。主要就是让单片机的一个引脚输出高低电平,但是高低电平的输出是按时间决定的。例如如果PWM 是40的话,按照这个程序前40ms输出高电平,后60个ms都是低电平。当时间到了100ms的时候又清零重新开始。这里的时间计数使用到了单片机定时器0的方式二,自动重装初值的方式。判断时间到没有都放在了定时器0的中断里面。至于串口要注意的是串口中断必须要比其他的中断优先级都要高。


电脑发送数据的时候应该用的是HEX发送0-100之间的数字对应十六进制就是(0-64),直接发送十进制数字应该不会被单片机识别(很久之前的程序了有些记不清了)。

控制PWM的方法有很多,这只是其中的一种而已。由于排版的原因直接复制粘贴程序有可能在编译器里面出错。


推荐阅读

史海拾趣

Beta Dyne Inc公司的发展小趣事

近年来,电子行业面临着技术更新换代迅速、市场竞争激烈的挑战。Beta Dyne也不例外,公司面临着来自同行的竞争压力以及客户需求不断变化的挑战。为了应对这些挑战,Beta Dyne不断调整产品策略,加大研发投入,推出了一系列创新产品,并积极拓展新的应用领域。

Gould Ami公司的发展小趣事
确保水位传感器和水泵安装位置正确,能够准确反映水位变化并有效控制水泵启停。
Cincon公司的发展小趣事

1991年,Cincon公司在台湾成立,标志着其在电子行业的起步。公司创立之初,便在台北设立了销售办事处,同时在彰化建立了工厂,专注于电源产品的设计与生产。创立的第二年,Cincon便开始设计和制造DC/DC转换器和电池充电器,这为其在电源行业奠定了坚实的基础。随着市场需求的不断增长,公司于1997年开始涉足交流/直流开关电源的设计与制造,进一步扩大了产品线。

Esterline Technologies Corporation公司的发展小趣事

经过多年的努力和发展,Cincon在电源行业取得了显著的成就。其产品包括多种类型的电源转换器、适配器和LED电源等,广泛应用于各种电子设备中。凭借卓越的产品质量和创新能力,Cincon赢得了全球客户的信赖和认可。

东晶(ECEC)公司的发展小趣事

随着产品质量的不断提升和市场份额的逐步扩大,东晶电子开始将目光投向国际市场。公司积极参与国际展会,与全球知名电子企业建立合作关系,产品出口到欧洲、北美、东南亚等多个国家和地区。同时,东晶电子还与国际知名厂商进行技术交流和合作研发,不断提升自身技术水平,以适应全球市场的竞争需求。

蜂鸟无线公司的发展小趣事
根据电动机的功率、转速范围等要求,选择合适的PWM生成集成电路,如555定时器、微控制器等。

问答坊 | AI 解惑

如何鉴别芯片真假,cecclab为你解答

怎么判定芯片的真伪? 概述: 通过化学腐蚀及物理显微观察、简单电性能等方法,来检验鉴定器件是否为原半导体厂商的器件。 检验的内容: A、货品外包装、湿度标示卡、器件日期批号等检查确认及记录 B、外观检测,器件的表面状况、印字标准、重 ...…

查看全部问答>

用什么也别用害人的红外一体机!(转)

转自:http://www.1000bbs.com/dispbbs.asp?boardid=51&Id=261604 首先声明一下身份:辽宁锦州安防器材经销商、工程商。 我开始选择红外一体机,是因为甲方点着名要这玩意。 选了哪些厂家的哪些型号的红外机,恕我不一一列举了。总之,深圳的、 ...…

查看全部问答>

WINCE SDK平台改变后出现的问题!求助!

WINCE SDK平台改变后出现的问题: fatal error LNK1112: module machine type \'ARM\' conflicts with target machine type \'SH3\' 这要怎么解决啊???…

查看全部问答>

串口读取数据过滤

在用ddk做驱动时,在对 IRP_MJ_READ截获后 然后改变指向的buffer中的数据 最总发现用串口调试助手读取数据时并没有改变串口读到数据的内容, 请问应该怎样做能够从底层改变收到数据,最终使用串口调试助手时显示的是我修改的数据…

查看全部问答>

求驱动函数

菜鸟请高手指点 有三个设备A、B、C A是最底层,然后挂载B到A上面,也就是原来设备栈的顺序是 A--B (由底到顶) 现在我想在A,B的设备栈里面加入C,但是我不希望设备栈的顺序是 A--B--C(由底到顶) ,而是希望希望设备栈的顺序 是 A--C--B(由底到顶) ...…

查看全部问答>

关于lpc2292 arm的初始化外部总线控制器 问题

我现在程序在外部flash运行,LPC2292,外部flash是sst39vf1601,在外部flash的0x10000地址(也就是arm看到的0x80010000地址开始我是烧的fpga程序,这个已经是没问题的),在用EASYJTAG-H外部仿真的时候,在MAIN入口处,我也看到了数据。startup.s的设 ...…

查看全部问答>

SEFS安全透明加密内核

软件名称:SEFS安全透明加密内核 软件版本:1.0 建议分类:系统安全/文件加密 软件大小:635K 安装平台:Win2000/xp/2003 软件语言:简体中文/繁体中文/英文 软件授权:共享软件 软件主页:http://www.sefs.net 支持邮箱:admin@sefs.ne ...…

查看全部问答>

vb上位机 51单片机下位机 编程

Visual Basic设计完成了上位机界面;同时利用51单片机作为下位机微处理器,采集无刷电机运行工作中的电压、电流和转速等基本参数,通过串行通讯口将数据上传至上位机系统中。上位机系统对下位机上传的数据加以分析计算,直观的绘制个参数的变化曲线 ...…

查看全部问答>

C2000/MSP430/电源的在线学习不能用了!!!!

C2000/MSP430/电源的在线学习不能用了!!!! 求关注,你们那里有这个现象没?…

查看全部问答>

电池内部细微结构可能是波音787起火原因

美国全国运输安全委员会(National Transportation Safety Board, 简称NTSB)的调查人员正在分析近一个月前发生的两起波音(Boeing Co., BA) 787梦想飞机起火事故是否与锂电池内部细微结构(即树枝晶)的构造有关。相关事故已导致波音787飞机禁飞。 & ...…

查看全部问答>