『壹』 如何用單片機產生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