導航:首頁 > 編程語言 > stc單片機pwm匯編程序

stc單片機pwm匯編程序

發布時間:2023-12-20 13:43:35

① 基於STC51系列單片機的SPWM波形實現,程序如何編寫急急急急

/*********************************************************
// 載波比選為N=24,調制比M=Uc/Ur=1,晶振頻率12M
// 正弦波頻率50Hz
// 高電平的寬度Tpw = Tt/2*(1+Msimwt)
// 低電平的寬度Tpw = Tt/2*(1-Msimwt)
// Tt周期
// T2是產生SPWM波形,並從P1^1輸出,用導線連接到P3.4作為測試頻率使用。

// T1工作在定時方式1,定時1s
// T0工作在計數方式,對輸入的脈沖進行計數,溢出產生中斷。
// 16位計數器最大值是65536,1s內可能會產生多次溢出,所以在中斷處理程序對中斷的次數進行
// 計數。1s到後,將中斷的計數器里的計數值取出進行綜合處理,處理後的數據送顯示。

//信號頻率的計算方法:
// T0工作在計數方式,假設1s內溢出C1次,最後未溢出的計數值是C2,則頻率公式為:
// F=C1*2^16+C2 = C1*65536+TH0*256+TL0)

//使用12MHz時鍾,測量的最大范圍是不大於500KHz。
*********************************************************/

#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
uchar disp[8]={0,0,0,0,0,0,0,0};

uchar FreStr[]="Friquency is:";

uchar T0count,T1count;

uchar code x[]={66,38,26,89,15,97,7,102,2,103,1,102,2,
97,7,89,15,78,26,66,38,38,66,26,78,15,
89,7,97,2,102,1,103,1,103,2,102,7,97,15,
89,26,78,38,66};
uchar ky,kc,count=255;
sbit L1=P1^1;

void delayms(uchar ms)

{
uchar i ;
while(ms--)
{
for(i = 0 ; i < 120 ; i++) ;
}
}

//LCD定義開始
//以下三個是定義LCD的引腳
sbit lcden=P0^5;
sbit lcdwrite=P0^6;
sbit lcdrs=P0^7;

//延時程序
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//lcd的寫指令
void write_com(uchar com)
{
lcdrs=0;
lcden=0;
P2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
//lcd的寫數據
void write_data(uchar da)
{
lcdrs=1;
lcden=0;
P2=da;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
//初始化
void Lcd_init()
{
lcdwrite=0;
lcden=0;
write_com(0x38); //16*2顯示,5*7點陣,8位數據
write_com(0x0c);//顯示開,關游標
write_com(0x06); //移動游標
write_com(0x01);//清除LCD的顯示內容
}
//LCD定義結束

//計算頻率值
void calc()
{
uchar i;
long frequency;
frequency=(T0count*256+TH0)*256+TL0;
for(i=7;i>0;i--)
{
disp[i]=frequency%10;
frequency=frequency/10;
}
disp[0]=frequency;
}

void init()
{
T0count=0;
T1count=0;
TH0=0;
TL0=0;
}

void main()
{
uchar dis;
init();
Lcd_init();
TMOD=0x15;
TH1=(65536-5*110592/12)/256;
TL1=(65536-5*110592/12)/256%10;
ET1=1;
ET0=1;
EA=1;
TR1=1;
TR0=1;

//以下四句的作用是在P1.1引腳上形成1000Hz的脈沖,用導線連接到P3.4作為測試用。將其中
//高8位和低8位的初始值更改後可輸出不同頻率的脈沖。
T2MOD = 0x02;
TH2=255-x[ky];
TL2=255-x[ky];
ET2=1;
EX0=1;
TR2=1;
L1=1;

write_com(0x80);
for(dis=0;dis<12;dis++)
write_data(FreStr[dis]);

while(1)
{
write_com(0xC0);
for(dis=0;dis<8;dis++)
write_data(disp[dis]+0x30); //顯示頻率
}
}

//計算輸入脈沖的次數
void time0() interrupt 1
{
T0count++;
}

//計算1s時間
void time1() interrupt 3
{
TH1=(65536-5*110592/12)/256;
TL1=(65536-5*110592/12)/256%10;

if(T1count==20)
{
calc();
init();
}
else T1count++;
}

//這是產生SPWM波形、
void M() interrupt 5
{
TH2=255-x[ky];
TL2=255-x[ky];
kc++;
if(kc==count)
{
kc=0;

L1=~L1;

ky++;

if(ky==49) ky=0;
}
}

//這是使用外部中斷0可以調整輸出波形的頻率
void MM() interrupt 0
{
delayms(300);
if(INT0==0)
{
count=count-5;
if(count==0) count=255;
}
}

② STC15W4K32S4單片機怎麼使用自帶的PWM功能同時輸出控制3個電機

/*任意周期和任意佔空比DUTY%的PWM*/
#define CYCLE 6000L //定義PWM周期(最大值為32767)
sbit PWM2=P3^7;
sbit PWM3=P2^1;
sbit PWM4=P2^2;

void pwminit()
{ P_SW2 |= 0x80;
PWMCFG = 0x00; //配置PWM的輸出初始電平為低電平
PWMCKS = 0x0f; //選擇PWM的時鍾為Fosc/(0+1)
PWMC = CYCLE; //設置PWM周期,定義PWM周期(最大值為32767)
PWM2CR = 0x00; //選擇PWM2輸出到P3.7,不使能PWM2中斷
PWM3CR = 0x00;
PWM4CR = 0x00;
PWM2T1 = 0x0001;
PWM2T2 = 0;
PWM3T1 = 0x0001;
PWM3T2 = 0;
PWM4T1 = 0x0001;
PWM4T2 = 0;
PWMCR |= 0x80; //使能PWM模塊
P_SW2 &=~0x80;
}
void pwm2( unsigned int DUTY) //PWM2
{
if(DUTY==0)
{
PWMCR &=~0x01;
PWM2=0;
}
else if (DUTY==100)
{
PWMCR &=~0x01;
PWM2=1;
}
else
{
P_SW2 |= 0x80; //使能訪問PWM在擴展RAM區的特殊功能寄存器XSFR
PWM2T1 = 0x0001; //設置PWM2第1次反轉的PWM計數
PWM2T2 = CYCLE * DUTY / 100; //設置PWM2第2次反轉的PWM計數
P_SW2 &=~0x80; //占空比為(PWM2T2-PWM2T1)/PWMC
PWMCR |= 0x01; //使能PWM信號輸出

}

}
void pwm3(unsigned int DUTY) //PWM3
{
if(DUTY==0)
{
PWMCR &=~0x02;
PWM3=0;
}
else if(DUTY==100)
{
PWMCR &=~0x02;
PWM3=1;
}
else
{
P_SW2 |= 0x80;
PWM3T1 = 0x0001;
PWM3T2 = CYCLE * DUTY / 100;
P_SW2 &=~0x80;
PWMCR |= 0x02;

}
}
void pwm4(unsigned int DUTY) //PWM4
{
if(DUTY==0)
{
PWMCR &=~0x04;
PWM4=0;
}
else if (DUTY==100)
{
PWMCR &=~0x04;
PWM4=1;
}
else
{
P_SW2 |= 0x80;
PWM4T1 = 0x0001;
PWM4T2 = CYCLE * DUTY / 100;
P_SW2 &=~0x80;
PWMCR |= 0x04;

}
}

③ STC單片機輸出PWM信號,頻率要25KHz,請大神指教,怎麼實現,或者直接給我一個程序,謝謝!

void PWM_init (void){//PWM初始化函數
CMOD=0x02; //設置PCA定時器,計數頻率為晶振頻率/2 當為12Mhz時,PWM輸出頻率約23.4Khz
//CMOD=0x00; //設置PCA定時器,計數頻率為晶振頻率/12 當為12Mhz時,PWM輸出頻率約3.9Khz
//CMOD=0x04; //設置PCA定時器,計數頻率為定時器0的溢出率,如果讓定時器0設為16位計數模式,其溢出頻率可以在很大范圍內調節,從而以產生很高或很低的PWM頻率
CL=0x00;
CH=0x00;
CCAPM1=0x42; //PWM1設置PCA工作方式為PWM方式(0100 0010)
CCAP1L=0x00; //設置PWM1初始值與CCAP0H相同
CCAP1H=0x00; // PWM1初始時為0
CR=1; //啟動PCA定時器
}
實際上要產生低頻率的PWM波,不用其硬體PWM功能完全可以
用定時器中斷方式即可實現
讓定時器 200us中斷一次(中斷不算頻繁呀) ,設一變數a,每次中斷a加1,100次就是20ms,,另設一變數b,數值在1-100之間,每次中斷比較a和 b的大小,如果a<b,則引腳 輸出高電平,否則為低電平,這樣通過改變b的值,就可實現頻率為50HZ,占空比1-100%可調的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);
}

閱讀全文

與stc單片機pwm匯編程序相關的資料

熱點內容
得物app用什麼方式出售 瀏覽:783
linuxandroid模擬器下載 瀏覽:971
php類常量訪問 瀏覽:586
視頻文件壓縮工具 瀏覽:13
什麼什麼佳人app 瀏覽:6
施耐德cfc編程 瀏覽:307
如何把pdf文件轉成圖片 瀏覽:536
張劍閱讀150篇pdf 瀏覽:359
拉卡拉收款寶app叫什麼名 瀏覽:340
c4d動態解壓 瀏覽:711
多個pdf合並為一個 瀏覽:314
程序中的編譯執行 瀏覽:32
plc控制與單片機控制 瀏覽:884
如何讓安卓手機操控電腦 瀏覽:187
電腦電銷加密電話號碼破解 瀏覽:507
世界史綱pdf 瀏覽:135
湖北社保年審app叫什麼名字 瀏覽:853
邁達克雲伺服器 瀏覽:598
mfc深入淺出從mfc設計到mfc編程 瀏覽:82
螢石雲伺服器連接設置 瀏覽:327