‘壹’ 如何用单片机产生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