导航:首页 > 操作系统 > 写一个单片机的pwm

写一个单片机的pwm

发布时间:2022-05-17 12:10:16

‘壹’ 如何用单片机产生PWM

/*---------------
文件名称: PWM.C
功能 :单片机脉冲方式产生PWM信号
----------------*/
#include <reg52.h> // 引用标准库的头文件
#include <absacc.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define COUNT0 XBYTE [0X0000] // 8254计数器0寄存器地址
#define COUNT1 XBYTE [0X0200] // 8254计数器1寄存器地址
#define COUNT2 XBYTE [0X0400] // 8254计数器2寄存器地址
#define COMWORD XBYTE [0X0600] // 8254控制寄存器地址

/********************************
函数名称: SIGNAL(SIG_OUTPUT_COMPARE1A)
功能 :定时器0中断子程序
入口参数:无
返回值 :无
********************************/
void time0_int () interrupt 1 using 1
{
TR0=0; // 关闭T0
TH0=-(20000/256);
TL0=-(20000%256); //重置20ms计数值
/*--------------用8254计数器发送第一路的PWM信号-----------*/
COMWORD=0x30; //1MHz时钟作为计数时钟,计数1000次后实现1ms高电平
COUNT0=0xE0;
COUNT1=0x03;
/*--------------用8254发送第二路的PWM信号----------------*/
COMWORD=0x70; //1MHz时钟作为计数时钟,计数2000次后实现2ms高电平
COUNT0=0xD0;
COUNT1=0x07;
/*-------------用8254发送第三路的PWM信号----------------*/
COMWORD=0xB0;//1MHz时钟作为计数时钟,计数3000次后实现32ms高电平
COUNT0=0xB0;
COUNT1=0x0B;
TR0=1; //启动T0
}
//主函数
void main ()
{
EA=1; // 开CPU总中断
ET0=1; // 开T0定时器中断
TMOD=0x01; // 开定时器中断
TH0=-(20000/256); //20ms定时器计数初值
TL0=-(20000%256);
/*--------------向8254控制寄存器选择计数器0,并对其赋值0-----------------*/
COMWORD=0x30;
COUNT0=0; //赋低位字节
COUNT0=0; //赋高位字节
/*---------------向8254控制寄存器选择计数器1,并对其赋值0------------------*/
COMWORD=0x70;
COUNT0=0; //赋低位字节
COUNT0=0; //赋高位字节
/*---------------向8254控制寄存器选择计数器2,并对其赋值0-----------------*/
COMWORD=0xB0;
COUNT0=0; //赋低位字节
COUNT0=0; //赋高位字节
TR0=1; //启动定时器0
While (1); //无限次循环
}

‘贰’ 单片机控制的pwm程序的编写方法是怎样的啊

把扫描结果串口发给单片机2,这得看你希望的具体设定了。比如单片机2串口收到个“+”.单片机2监视串口控制信息,调整PWM,最简单的方法单片机1扫描按键方法很多,就把PWM的寄存器调整下啥的

‘叁’ 怎么用单片机写一个pwm信号

用单片机产生一个pwm信号最简单的方法就是利用定时器中断。用一个全局变量表示PWM信号占空比,在PWM输出高、低电平时对定时器寄存器进行不同的赋初值。

‘肆’ 单片机PWM程序是怎么编写的啊,能给一个简单的例子吗

有PWM功能的单片机入STC12系列单片机,直接给专用寄存器赋值开启相应定时器就可以了。普通单单片机,PWM需要用自己来调配。比如:
#include<reg51.h>
unsigned char pwhh,pwhl,pwlh,pwll;
bit flag;
sbit pwm=P1^0;
void t0isr() interrupt 1
{
if(flag)
{
TH0=pwhh;
TL0=pwhl;
}
else
{
TH0=pwlh;
TL0=pwll;
}
pwm=~pwm;
}
main()
{
TMOD=0x01;
pwhh=(65536-1000)/256;
pwhl=(65536-1000)%256;
pwlh=(65536-500)/256;
pwll=(65536-500)%256;
TH0=pwhh;
L0=pwhl;
TR0=1;
ET0=1;
EA=1;
while(1);
}

‘伍’ 单片机 如何实现pwm脉宽调制

1、STC绝大多数都有PWM,只要操作PWM相关寄出去就行。
2、没有PWM的,得用片内始终做,先要知道PWM是什么原理,再用定时器分时输出相应波形。
3、模拟的PWM不如硬件的准确,程序一旦运行起来,容易受其它程序的干扰,实时性和波形不好,而且IO口ide驱动能力也不如硬件PWM口德强,外围害的加驱动电路。

‘陆’ (1)使用单片机编写一个PWM发生器

首先89C52内部没有硬件PWM发生器,只能通过定时器模拟!你可以通过两个定时器,T0控制周期,T1控制占空比。
例如:实现周期为1000us,占空比为20%的PWM,用P1.0实现
首先你设置T0为65536-1000 (12M晶振)
T1为65536-200
首先初始化P1.0=1,两个定时器同时打开,在定时器T1中断时拉低P1.0,在定时器T0中断时在拉高P1.0,同时将两定时器初始值初始化T0为65536-1000 ,T1为65536-200
希望对你有用,呵呵!!!

‘柒’ 基于单片机的Pwm

用AVR做的

#include<iom8v.h>

#definePRIOD40000//40000*1us

#defineDUTYFACTOR0.5//占空比

volatileunsignedshorttime1=0;

volatileunsignedshorttime2=0;

voidTimer1_Init(void)

{

unsignedshorttemp=0;

TCCR1A=(0<<WGM11)|(0<<WGM10);

TCCR1B=(1<<WGM12)|(0<<WGM13);//;

#ifPRIOD<20000

TCCR1B|=1<<CS10; //Clockselect:SYSCLKdivde1;

time1=PRIOD*DUTYFACTOR;

time2=PRIOD*(1-DUTYFACTOR);

#else

TCCR1B|=(1<<CS11)|(1<<CS10); //Clockselect:SYSCLKdivde64;

temp=PRIOD>>6;

time1=(temp*DUTYFACTOR);

time2=temp*(1-DUTYFACTOR);

#endif

TCNT1=0x00; //Clearcount;

OCR1A=time1; //timing;

TIMSK|=(1<<OCIE1A); //;

TIFR|=(1<<OCF1A);//ClearOCIF1A;

}

#pragmainterrupt_handlerTimer1_COMPA_ISR:7

voidTimer1_COMPA_ISR(void)

{

staticunsignedcharflag=0;

flag^=0x01;

if(flag==1)

{

OCR1A=time2;

PORTB|=0x01;

}

else

{

OCR1A=time1;

PORTB&=~0x01;

}

}

voidmain(void)

{

Timer1_Init();

PORTB|=0x00;

DDRB|=0x01;

asm("sei");

while(1);

}

‘捌’ 51单片机用汇编语言编写PWM方波

TIMEH EQU 30H

TIMEL EQU 31H
TIME EQU 32H
PULSE EQU P1.0
KEYUP EQU P1.1
KEYDN EQU P1.2
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H

MOV TIMEH,#250
MOV TIMEL,#250

MOV TIME,#0

MOV TH0,#HIGH(65536-TIMEH)

MOV TL0,#LOW(65536-TIMEH)

SETB TR0

SETB ET0

SETB EA

CLR 00H

LOOP:
JB KEYUP,LOOP1

JNB KEYUP,$

INC TIME

MOV A,TIME

CJNE A,#250,LOOP0

LOOP0:
JC LOOP

MOV TIME,#249

SJMP LOOP

LOOP1:
JB KEYDN,LOOP

JNB KEYDN,$

DEC TIME

MOV A,TIME

JNZ LOOP

MOV TIME,#1

SJMP LOOP

T0ISR:
CLR TR0

JB 00H,T0ISR1

MOV TH0,#HIGH(65536-TIMEL+TIME)

MOV TL0,#LOW(65536-TIMEL+TIME)

SJMP T001

T0ISR1:
MOV TH0,#HIGH(65536-TIMEH-TIME)

MOV TL0,#LOW(65536-TIMEH-TIME)
T001:
SETB TR0

CPL 00H

CPL PULSE

RETI

END

阅读全文

与写一个单片机的pwm相关的资料

热点内容
程序的加密文件是哪个 浏览:398
app首屏图一张图怎么做 浏览:497
如何重启数据库服务器 浏览:658
联通程序员发展怎么样 浏览:705
山东省联想服务器供货商云空间 浏览:145
鸿天神尊小说哪个app可以看 浏览:394
做程序员的没朋友吗 浏览:358
阿里云服务器传奇微端 浏览:924
phplinux时间 浏览:449
云服务器20性能 浏览:986
android强制系统横屏 浏览:280
怎么提前看未播出的电视剧app 浏览:666
cad转pdf图层 浏览:600
程序员接私活初级 浏览:434
全无油润滑压缩机 浏览:186
代码加密常用方法 浏览:954
安卓手机如何解除已禁用 浏览:396
算法的随机性 浏览:487
高中解压体育游戏 浏览:533
androidstudior丢失 浏览:345