C51单片机通过串口调节PWM波

发布者:独行侠客最新更新时间:2019-04-09 来源: eefocus关键字:C51单片机  串口调节  PWM波 手机看文章 扫描二维码
随时随地手机看文章

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


关键字:C51单片机  串口调节  PWM波 引用地址:C51单片机通过串口调节PWM波

上一篇:ZigBee基础实验(六)--UART(串口收发)
下一篇:I2C协议---I2C时序图解析

推荐阅读最新更新时间:2024-03-16 16:27

C51单片机中断实验
实验要求: 要求通过中断方式检测有无按键 判断哪个按键(编号0-9),并且在数码管上显示对应的0-9 代码部分 #include reg51.h char led_mod ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; char key_buf ={0xee,0xde,0xbe,0xed,0xdd,0xbd,0xeb,0xdb,0xbb,0xe7}; void getKey() interrupt 0{ char key_scan ={0xef,0xdf,0xbf,0x7f}; char i=0,j=0; for(i=0;i 4;i++){ P2
[单片机]
<font color='red'>C51单片机</font>中断实验
80C51单片机学习之硬件结构
1.80C51单片机的内部逻辑结构 单片机是把CPU、储存器、输入输出接口、定时/计数器和时钟电路集成到一块芯片上的微型计算机,主要由一下几个部分组成。 (1)中央处理器CPU 包括运算器和控制器。 运算电路以ALU为核心,完成算数运算和逻辑运算,运算结果存放于ACC中,运算结果的特征存放于PSW中。 控制电路是单片机的指挥控制部件,保证单片机各部分能自动而协调地工作。程序计数器PC是一个16位寄存器,PC的内容为将要执行的下一条指令地址,具有自动加1功能,已实现程序的顺序执行。 (2)存储器 分类: 随机存取储存器RAM:能读能写,信息在关机后消失。可分为静态RAM(SRAM)和动态RAM(DRAM)两种。 只读存储器:信息在关
[单片机]
C51单片机的3*3矩阵键盘程序
#include reg51.h #include dis.h /**延时1**/ //用于消抖 void delay1(void) {uchar i; for(i=0;i 200;i++); } /****延时2**********/ void delay2(void) { uchar i,j,s; for(i=250;i 0;i--) for(j=250;j 0;j--) for(s=5;s 0;s--); } /****串口初使化****/ void chuankou_init(void) { TMOD=0X20; //定时器1,方式2,8位 计数器 SCON=0x40; //方式1,而不允许
[单片机]
89C51单片机的工作方式与工作原理
89C51单片机共有复位、程序执行、低功耗以及编程和校验等四种工作方式。 1.复位方式 (l)复位操作复位是单片机的初始化操作,其主要功能是把PC初始化为OOOOH,使单片机从0000H单元开始执行程序。除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位键以重新启动。 除PC之外,复位操作还对其它一些特殊功能寄存器有影响,它们的复位状态如上表所示。 复位操作还对单片机的个别引脚信号有影响。例如在复位期间,ALE和信号变为无效状态,即ALE=LPSEN=1。(2)复位信号及其产生 ①复位信号 RST引脚是复位信号的输入端,复位信号是高电平有效,其有效时间应持续24个振荡脉冲周
[单片机]
89<font color='red'>C51单片机</font>的工作方式与工作原理
C51单片机C语言函数编辑
其实一直出现在例子中的 main()也算是一个函数,只不过它比较特殊,编译时以它做为程序的开始段。有了函数C 语言就有了模块化的优点,一般功能较多的程序,会在编写程序时把每项单独的功能分成数个子程序模块,每个子 程序就能用函数来实现。函数还能被反复的调用,因此一些常用的函数能做成函数库以供在编写程序时直接调用,从而更好的实现模块化的设计,大大提高编程工作的效率。 一.函数定义 通常 C 语言的编译器会自带标准的函数库,这些都是一些常用的函数,Keil uv 中也不 例外。标准函数已由编译器软件商编写定义,使用者直接调用就能了,而无需定义。但是 标准的函数不足以满足使用者的特殊要求,因此 C 语言允许使用者根据需要编写特定功能的
[单片机]
<font color='red'>C51单片机</font>C语言函数编辑
基于AT89C51单片机的节拍器设计
  1 硬件电路原理   节拍器以AT89C51 单片机为控制中心,由LED 显示模块、调节键盘模块、声音输出模块组成。图1 是节拍器的电路原理图。ATMEL 公司生产的AT89C51 单片机与MCS51指令系统兼容,40 脚结构,是系统的控制中心。显示模块由四位一体的共阳极蓝色LED 显示器构成,采用动态扫描显示方式, Q11~ Q14是LED 的位选择开关三极管, R6~ R13是数码管段发光二极管的限流电阻。四位一体的LED 数码管完成显示节拍数、各功能代码及参数值的功能。键盘调节模块由4 只按键构成,分别是功能选择键A、设置参数选择键B、参数增加键C和参数减少键D ,4 只按键可以完成各种功能的选择和各参数的设置。声音输
[单片机]
基于AT89<font color='red'>C51单片机</font>的节拍器设计
c51单片机数码管的控制
电路图 注:实际中,我单片机的74HC573电路接法与P0端接反了 138译码器资料:https://pan.baidu.com/s/1COTcutsnMxMSc8tq0M2yVw 密码:1jww 138译码器的真值表: 74HC573资料:https://pan.baidu.com/s/1b5OJXniyd6gODyf_eA_sXA 密码:m7zx 如果学过数电,上面可以简单看下。如果没有,建议学过数电后再接触单片机,也可以直接看下面。 过程 一、 首先,得知道如何正确点亮一个数码管(静态显示)。 数码管内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的亮暗组合成字符。常见数码管有10
[单片机]
<font color='red'>c51单片机</font>数码管的控制
C51单片机和电脑串口通信电路图与源码
C51单片机和电脑串口通信电路图与源码 51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved