如何用51单片机的定时器产生2路pwm?

作者&投稿:钦相 (若有异议请与网页底部的电邮联系)
可以用at89c52单片机定时器t2产生pwm信号吗~

#include // 这是用的 t0 产生pwm信号 试试改成 t2 肯定可以的
sbit P1_0 = P1^0; // 一路PWM输出
sbit key10 = P3^2;
sbit key11 = P3^3;
unsigned char Set_PWM0 = 8; // 占空比调整
unsigned char counter = 0; // 计数的
bit bdata tt1,tt2,tt3; // 标志位
void main()
{
TMOD=0x01;
TH0=(65536-1250)/256; // 定时时间 可以修改
TL0=(65536-1250)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{ // 开关调整 PWM 占空比
if(key10==0 && tt1==0) {tt1 = 1; Set_PWM0++;} // K1、K2
if(key11==0 && tt1==0) {tt1 = 1; Set_PWM0--;}
if(key10==1 && key11==1) tt1=0;
}
}
void Timer0(void) interrupt 1 // 定时器0 PWM 控制
{
TH0=(65536-1250)/256; // 定时时间 可以修改
TL0=(65536-1250)%256;
counter++;
if(counter >= 32 ) counter = 0; // PWM 16级 可以修改
if(counter >= Set_PWM0) P1_0 = 0; else P1_0 = 1;
}

只需使用一个定时器,设置为模式2(自重装),定时时间100微秒,在中断程序中比较两个PWM值就可以了,以下为示范:PWM++;if(PWM==100)PWM=0;if(PWM1>PWM)P1.1=0;else P1.1=1;if(PWM2>PWM)P1.2=0;else P1.2=1;

用定时器啊,用定时器定一段时间,便是pwm的周期,然后你可以设计任意数量的变量,如N1,N2等等,每一个变量都可以产生一个方波~给你简单写个程序吧
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uintunsigned int
uchar N1,N2;
sbit pwm_out1=P0^0;
sbit pwm_out2=P0^1;

void InitTimer0()
{
TMOD = 0x01;
TH0 = 0xff;
TL0 = 0xa3;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void pwm()
{
if(N1<180)pwm_out1=1;
else pwm_out1=0;

if(N2<135)pwm_out2=1;
else pwm_out2=0;
}
void main()
{
InitTimer0();
while(1)
{
pwm();
}
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0xff;
TL0 = 0xf6;//0.01ms
N1++;
N2++;
if(N1==2000)N1=0;
if(N2==2000)N2=0;
}

用定时器定一段时间,便是pwm的周期,然后可以设计任意数量的变量,如N1,N2等等,每一个变量都可以产生一个方波。
例如:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uintunsigned int
uchar N1,N2;
sbit pwm_out1=P0^0;
sbit pwm_out2=P0^1;

void InitTimer0()
{
TMOD = 0x01;
TH0 = 0xff;
TL0 = 0xa3;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void pwm()
{
if(N1<180)pwm_out1=1;
else pwm_out1=0;

if(N2<135)pwm_out2=1;
else pwm_out2=0;
}
void main()
{
InitTimer0();
while(1)
{
pwm();
}
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0xff;
TL0 = 0xf6;//0.01ms
N1++;
N2++;
if(N1==2000)N1=0;
if(N2==2000)N2=0;
}

用定时器啊,用定时器定一段时间,便是pwm的周期,然后你可以设计任意数量的变量,如N1,N2等等,每一个变量都可以产生一个方波~给你简单写个程序吧
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uintunsigned int
uchar N1,N2;
sbit pwm_out1=P0^0;
sbit pwm_out2=P0^1;

void InitTimer0()
{
TMOD = 0x01;
TH0 = 0xff;
TL0 = 0xa3;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void pwm()
{
if(N1<180)pwm_out1=1;
else pwm_out1=0;

if(N2<135)pwm_out2=1;
else pwm_out2=0;
}
void main()
{
InitTimer0();
while(1)
{
pwm();
}
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0xff;
TL0 = 0xf6;//0.01ms
N1++;
N2++;
if(N1==2000)N1=0;
if(N2==2000)N2=0;
}

您这样的PWM波只能适应很低频率的,建议您使用定时器/计数器来实现。

这个程序,单片机一直在处理延时,没有资源去做其他事情。
建议用1个定时器,当定时器溢出一次,某变量+1,当这个变量为A时, lpwmout(),当这个变量为B时,rpwmout(),


51单片机汇编语言定时器的使用(中断方式)
(1)COUNT_INT EQU 30HLEDVALUE EQU 31H ORG 0000H LJMP START ORG 001BH LJMP Timer1InterruptSTART: MOV SP,#60H MOV COUNT_INT,#0 MOV LEDVALUE,#01H LCALL InitTimer1LOOP: MOV A,LEDVALUE MOV P2,A LJMP LOOPInitTimer1: MOV TMOD,#10H...

51单片机计数器怎么用
51单片机是基础入门的一个单片机,还是应用最广泛的。51单片机的定时\/计数器的概念 单片机中,脉冲计数与时间之间的关系十分密切,每输入一个脉冲,计数器的值就会自动累加1,只要相邻两个计数脉冲之间的时间间隔相等,则计数值就代表了时间的流逝,因此,单片机中的定时器和计数器其实是同一个物理的电子...

51 单片机怎么精确定时?
50ms所需机器周期为:50×1000÷t=46080 那么需要初值为:0xFFFF-46080=65535-46080=19456=0x4C00 因此,置初值为TH=0x4c,TL=0x00,经过46080个指令周期,计数器将产生50ms定时中断。如果需要1秒 则连续20次上述中断即可达到 这些是经验值,把程序写好后,用KEIL里的,DEBUG调试时,看执行这个函数.里面...

求51单片机利用定时器消抖的程序!!
定时器消抖就是利用定时器运行一段时间以消耗一段程序运行周期达到延时目的,再关闭定时器,如果你的想法是这样那很好办,一般我们都用delay函数来粗虐延时,你只要将TRx=1(定时器1或0的开关)去替换delay就行,然后根据定时器的初始化来确定延时长短,然后进去中断服务函数,重装初值后TRx=0,关闭定时器就行了,然后下一次...

试用51单片机C51编写一电脑钟程序,定时器用方式2中断处理实现?
第一问比较简单,拓展功能比较繁琐,要考虑闰年的影响,计算复杂一些。以下是简单的时钟:include<reg52.h> define uchar unsigned char define uint unsigned int uchar a=0;\/\/中断次数 uchar sec=0,min=0,hour=0;\/\/时分秒 uchar date=1,mon=1, year=19;\/\/年月日,年只计算后2 位,如2019...

在51单片机多存储空间中如何确定变量与地址的关系?
1. 确定存储器的起始地址和结束地址。2. 将存储器映射到指定的地址空间。3. 在程序中声明变量,并指定其存储地址。4. 通过指针访问变量。例如,如果要使用一个外部EEPROM来存储数据,可以将其连接到51单片机的I\/O口,并将其映射到0x1000到0x1FFF的地址空间。然后,在程序中声明一个变量,并将其存储...

51单片机怎样用定时器做两个输出循环交替
这个不难,用1个全局变量作为交替标识,我没在家上,这里没U4,没法给你写全,我随便写一段,你自己多琢磨就明白了 unsigned char i; \/\/这个是全局变量 void main(){ i=0;while(1){ } } \/\/你可以设定定时器累加时间到3秒执行一次,这里我就不细写了 \/\/比方30毫秒加一,到3000毫秒就是...

51单片机C语言中delay函数是怎么定义和使用的?
定义一个延时xms毫秒的延时函数 void delay(unsigned int xms) \/\/ xms代表需要延时的毫秒数 { unsigned int x,y;for(x=xms;x》0;x--)for(y=110;y》0;y--);} 使用:void Delay10us(uchar Ms){ uchar data i;for(;Ms》0;Ms--)for(i=26;i》0;i--);} i=[(延时值...

51单片机用定时器计时应该如何计算?求大神支招
这个其实很简单的,你只需要知道一个条件即可:晶振频率。因为51单片机的机器周期计算公式是12\/晶振频率MHz,若晶振为12MHz,则机器周期就是12\/(12×10^6)=1us,也就是说计数器没1us计数一次。那么有了这个条件就好办多了,一般来说,12MHz晶振下,16位定时器满计数是65536次,每次1us,最大就能...

mcs-51单片机定时器应用的初始化步骤有哪些
每个机器周期产生一个计数脉冲,计时器寄存器最大允许2^16,大于2^16就溢出触发中断。初值为T,则还有65536-T次计数,每次计数用时一个机器周期,所以总用时:t=(2^16-初值)*机器周期=(2^16-初值)*时钟周期*12 初值设置:把所需时间T代入上式解出初值0xAABB,把0xAA作为TH,0xBB作为TL 也...

崇义县13032477329: 用51单片机定时器中断产生两路占空比可调的pwm波形 -
东野左麝香: 只需使用一个定时器,设置为模式2(自重装),定时时间100微秒,在中断程序中比较两个PWM值就可以了,以下为示范:PWM++;if(PWM==100)PWM=0;if(PWM1>PWM)P1.1=0;else P1.1=1;if(PWM2>PWM)P1.2=0;else P1.2=1;

崇义县13032477329: 51单片机怎么利用两个定时器调制两路PWM波控制两个直流减速电机 -
东野左麝香: 利用定时器到时间就会进入中断函数,这就可以判断是否到标志时间,这是就可以然输出pwm引脚的电平发生偏转

崇义县13032477329: 51单片机如何用一个定时器当多个延时电路用, 就是按下开关一,灯泡亮三秒. 按下开关二,灯泡亮五秒. -
东野左麝香: 可以的,定时器先定时出一个秒周期,然后对秒进行计数,得变量M.这个M,可以从1计数到一万、一百万等,也可以循环计数,即计数到100就又从1开始;然后按下开关一时,就取当前的M值=K1,并且使灯泡亮,当M=K1+3时,使灯泡灭就是了.同理,按下开关二时,就取当前的M值=K2,并使灯泡亮,当M=K2+5时,使灯泡灭就是了.

崇义县13032477329: c51单片机中如何用定时器中断产生pwm -
东野左麝香: #include<rer52.h> sbit output=P1^0;//定义输出端 unsigned char num; void main() { init(); while(1) { if(num<=7) output=1;//输出高电平,改变数值大小调整占空比,数值不能大于10 else output=0;//输出低电平 } } void init() { num=1;//给num赋初...

崇义县13032477329: 如何让单片机同时产生两个方波 -
东野左麝香: 用两个脚分别输出两个方波,定时器为两个方波共用.例,定时1ms,方波1计3ms,方波2计5ms.

崇义县13032477329: 基于AT89C51单片机,利用定时器设计一个两位数码 管显示电路.求详细的设计过程. -
东野左麝香: 硬件很简单,我就不画图了,简单描述一下吧.在单片机最小系统的基础上,P0口接数码管的数据端,P2.6,P2.7接数码管的控制端. 程序如下: #include #define uint unsigned int #define uchar unsigned char sbit s1=P2^6;//十位 ...

崇义县13032477329: 单片机定时器控制LM29N产生2路PWM的程序 -
东野左麝香: 是LM298N 电路吧,直接拿飞思卡尔的mc9s12xs128 做就可以,直接分频出两路PWM波,控制电机就可以了.如果是51单片机,没有PWM 产生的寄存器,就用中断写一个pwm方波.void timer0() interrupt 1 { d_count++; if(d_count==d_num) duoji=0; if(d_count==480) { d_count=0; duoji=1; } TH0=(65536-10)/256;TL0=(65536-10)%256; } 这是一个舵机的中断,输出50hz的方波

崇义县13032477329: 用51单片机的两个定时器怎样实现PWM脉冲的死区时间 -
东野左麝香: 严格地说,用51单片机的两个定时器实现PWM脉冲的死区时间,有点多此一举,因为一个定时器就能搞定.如果为了回答问题而回答问题,用51单片机的两个定时器实现PWM脉冲的死区时间,一个定时器控制高电平时间,并设置一最大值,定时器赋值时判断定时值如果大于最大值则等于最大值;一个定时器控制低电平时间,并设置一最小值,定时器赋值时判断定时值如果小于最小值则等于最小值.

崇义县13032477329: 51单片机 用一个定时器实现两个功能 -
东野左麝香: 随便举个例子://定时器中断 10mS中断一次 void timer0_isr(void) interrupt 1 { if(flag == 0) { //这里是第一件事情 flag = 1;//在主程序处理完第一件事,将此标记清除 } if (++ucCount == 100) //累加100次达到1秒{ ucCount = 0; //复位计数ioLED = !ioLED; //这是第二件事情,实现LED闪烁} }

崇义县13032477329: 51单片机如何用一个定时器当多个延时电路用, 就是按下开关,一,灯泡,一,亮三秒. 按下开关,二, -
东野左麝香: 没想法就不会有创新,你的想法就很好.像这种亮灯的程序,对时间要求不是那么严格(如果极其严格就没法实现),那么可以采用如下方法实现你的要求://假设晶振12MHZ,按键输入P1.0,P1.1,P1.2;LED控制P2.0,P2.1,P2.2,都是低电平有...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网