日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

占空比输出程序c语言,关于51单片机输出频率和占空比可调的PWM波程序问题

發布時間:2024/3/12 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 占空比输出程序c语言,关于51单片机输出频率和占空比可调的PWM波程序问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//------------------------------------------------------------------------------------

//程序功能簡介:本程序產生15HZ~~~50KHZ的方波,并且實現頻率和脈寬的獨立調制,即可

//在改變頻率的同時不改變脈寬,再改變脈寬的同時不改變頻率;同時設置

//兩個調節步長------在KEY鍵按下時,粗調,沒有按下時,細調;

//程序思路: 本程序用到兩個定時器------定時器0和定時器1,其中定時器0工作在定時方式下,

//決定方波的頻率;定時器1,同樣工作在定時方式下,用于設定脈寬;

//------------------------------------------------------------------------------------

#include

#include

#define??uchar unsigned char

#define??uint unsigned int

#define??ALL??65536? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?//定時器工作方式1時,最大基數長度 65536;

#define??F_osc 12000000? ?? ?? ?? ?? ?? ?? ???//晶振頻率12M;

sbit KEY_F_UP=P0^2;? ?? ?? ?? ?? ?? ?? ???//頻率上調按鈕;

sbit KEY_F_DOWN=P0^3;? ?? ?? ?? ?? ?? ?//頻率下調按鈕;

sbit KEY_W_UP=P0^4;? ?? ?? ?? ?? ?? ?? ?//脈寬上調按鈕;

sbit KEY_W_DOWN=P0^5;? ?? ?? ?? ?? ? //脈寬下調按鈕;

sbit KEY=P0^6;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? //粗細調節按鈕-----按下為粗調,否則為細調;

sbit OUTPUT=P1^0;? ?? ?? ?? ?? ?? ?? ?? ? //波形輸出;

uchar TIMER0_H,TIMER0_L,TIMER1_H,TIMER1_L;? ?? ?? ?//定時器0和定時器1的初值設置;

uchar PERCENT=50;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? //初始占空比;

uchar FLAG_F=0,FLAG_W=0;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//頻率調節標志和脈寬調制標志;

uint??FREQ=50000;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//初始頻率;

float temp;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//臨時全局變量,用于數據傳遞;

void delay(uchar t);? ?? ?? ?//延時函數,用于按鍵去抖;

void init();? ?? ?? ?? ?? ?? ?? ? //初始化函數,用于定時器的初始化;

void calculate_F();? ?? ?? ? //頻率計算函數,當頻率變化,計算出定時器0初值;

void calculate_W();? ?? ?? ?//脈寬計算函數,脈寬變化時,計算出定時器1初值;

void key_scan();? ?? ?? ?? ? //按鍵掃描函數;

void timer0();? ?? ?? ?? ?? ? //定時器0中斷函數;

void timer1();? ?? ?? ?? ?? ? //定時器1中斷函數;

void delay(uchar t)

{

uchar i,j;

while(t--)? ?? ?? ?? ? //每個脈沖為1us

{

for(i=0;i<100;i++)

for(j=0;j<100;j++);

}

}

void calculate_F()

{

temp = ALL - F_osc/12.0/FREQ;

TIMER0_H = (uint)temp/256;

TIMER0_L = (uint)temp%256;

}

void calculate_W()

{

float TEMP;

TEMP = (1 - PERCENT/100.0)*ALL + temp*PERCENT/100.0;TIMER1_H = (uint)TEMP/256;

TIMER1_L = (uint)TEMP%256;

}

void key_scan()

{

delay(4);

if(!KEY_F_UP)? ???//頻率上調鍵按下;

{

FLAG_F=1;? ? //置標志位;

if(!KEY)

FREQ+=10;

else

FREQ++;

if(FREQ>50000)

FREQ=1;

}

else if(!KEY_F_DOWN)? ?//頻率下調鍵按下;

{

FLAG_F=1;? ? //置標志位;

if(!KEY)

FREQ-=10;

else

FREQ--;

if(FREQ<1)

FREQ=50000;

}

else if(!KEY_W_UP)? ? //脈寬上調鍵按下;

{

FLAG_W=1;? ? //置標志位;

if(!KEY)

PERCENT+=5;

else

PERCENT++;

if(PERCENT>49)

PERCENT=1;

}

else if(!KEY_W_DOWN)? ?//脈寬下調鍵按下;

{

FLAG_W=1;? ? //置標志位;

if(!KEY)

PERCENT-=5;

else

PERCENT--;

if(PERCENT<1)

PERCENT=49;

}

else ;}void timer0() interrupt 1? ?? ?//決定頻率

{

TH0=TIMER0_H;

TL0=TIMER0_L;

TR1=1;? ?? ?? ???//開定時器1;

OUTPUT=1;

}

void timer1() interrupt 3? ???//決定脈寬

{

TH1=TIMER1_H;

TL1=TIMER1_L;

TR1=0;? ?? ?? ? //關定時器1,一定要這一步,因為定時器1的定時短于定時器0;

OUTPUT=0;

}

void init()

{

TMOD=0x11;? ?? ?//定時器0和定時器1都工作在方式1,16位計數器;

calculate_F();??//初始為1KHZ,占空比為50%;

calculate_W();

TH0=TIMER0_H;

TL0=TIMER0_L;

TH1=TIMER1_H;

TL1=TIMER1_L;

ET0=1;

ET1=1;

EA=1;TR0=1;

TR1=1;

}

main()

{

init();

while(1)

{

key_scan();

if(FLAG_F)? ???//改變頻率時要注意要進行脈寬的重新設置;

{

calculate_F();

calculate_W();

FLAG_F=0;

}

if(FLAG_W)? ???// 脈寬改變,頻率不改變;

{

calculate_W();

FLAG_W=0;

}

}

}

總結

以上是生活随笔為你收集整理的占空比输出程序c语言,关于51单片机输出频率和占空比可调的PWM波程序问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。