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

熱點內容
程序員阿里文化完整版 瀏覽:98
早間新聞在哪個app上面可以看 瀏覽:954
工作啦app注冊的信息怎麼刪去 瀏覽:378
滾動轉子式製冷壓縮機 瀏覽:873
美國編程用什麼軟體 瀏覽:571
圖片加密防盜用 瀏覽:616
dbscan演算法python源碼 瀏覽:849
固態硬碟文件夾刪不掉 瀏覽:717
陽泉工會app怎麼培訓報名 瀏覽:669
編程圖形二級題 瀏覽:549
怎樣知道自己的app存在哪個文件夾 瀏覽:853
電子手帳app怎麼下載 瀏覽:810
app播客是怎麼賺錢的 瀏覽:380
東南亞伺服器是什麼檔次 瀏覽:132
手機app怎麼操控電熱水器 瀏覽:839
python爬蟲框架推薦 瀏覽:518
matlab遺傳演算法適應度函數 瀏覽:130
製作linux系統鏡像 瀏覽:154
域名解析伺服器ip地址不能正常 瀏覽:845
程序員十萬個為什麼 瀏覽:535