導航:首頁 > 操作系統 > 寫一個單片機的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相關的資料

熱點內容
python二次開發cad 瀏覽:302
程序員直播機器人舞團 瀏覽:769
devc指針編譯問題 瀏覽:1000
支持dsd硬解壓音效卡 瀏覽:771
怎麼查看u盤加密區 瀏覽:184
台電加密是什麼格式 瀏覽:157
php論壇版塊在哪個文件夾 瀏覽:442
暗黑的伺服器為什麼維護 瀏覽:624
android內存溢出的原因 瀏覽:18
標志307的壓縮比是多少 瀏覽:636
伺服器啟動為什麼叫三聲 瀏覽:997
追風箏的人英文pdf 瀏覽:940
解壓小熊手機殼 瀏覽:347
成都市區建成面積演算法 瀏覽:662
智能家居單片機 瀏覽:98
買男裝用什麼app好 瀏覽:856
文件夾合並了怎麼拆開 瀏覽:262
波段副圖源碼無未來函數 瀏覽:91
livecn伺服器地址 瀏覽:259
程序員這個工作真的很吃香嗎 瀏覽:848