回覆列表
  • 1 # 使用者4901841896917

    //51微控制器PWM佔空比調整演示程式

    //(透過測試,注意:AT89S51微控制器,有的微控制器P3_7需要改為P3^7)

    /*****************************************************************************

    * 程式名稱:PWM佔空比調整演示程式 *

    *程式思路說明: *

    * 只需要4個按鍵。 *

    *關於頻率和佔空比的確定,對於12M晶振,輸出頻率為1KHZ,這樣定時中斷次數設定為 *

    *10,即0.01MS中斷一次,則TH0=FF,TL0=F6;由於設定中斷時間為0.01ms,這樣可以設 *

    *定佔空比可從1-99%變化。即0.01ms*100=1ms *

    ******************************************************************************/

    #include

    #define uchar unsigned char

    #define uint unsigned int

    uchar timer0_tick,ZKB=1;//timer0_tick計數,ZKB佔空比

    uchar i=0,n=0,temp=0;

    code seven_seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//1,2,3, 4, 5, 6, 7, 8, 9

    code scan[2]={0xfd,0xfe};

    uchar counter[2]={0,0};

    sbit AN1=P3^2;//調整個位

    sbit AN2=P3^3;//調整十位

    sbit AN3=P3^4;//啟動按鍵

    sbit AN4=P3^5;//確認按鍵

    void delay(uint z)//軟體延時函式

    {

    uint x,y;

    for(x=z;x>0;x--)

    for(y=110;y>0;y--);

    }

    static void timer0_isr(void) interrupt 1 using 0 //中斷函式

    {

    TR0=0;

    TL0=0xf6;

    TH0=0xff;

    TR0=1;

    if (ZKB>99) ZKB=1;

    if (ZKB

    counter[0]=ZKB%10;

    counter[1]=ZKB/10;

    n++;

    if(n==100)

    {

    n=0;

    i++;

    if(i==2) i=0;

    P0=seven_seg[counter[i]];

    P2=scan[i];

    }

    timer0_tick++;

    if(timer0_tick++==100)

    {

    timer0_tick=0;

    }

    if(AN2==0)

    {

    delay(100);

    if(AN2==0)

    {

    temp=1;

    counter[0]++;

    if(counter[0]==10)

    {

    counter[0]=0;

    }

    }

    }

    if(AN1==0)

    {

    delay(100);

    if(AN1==0)

    {

    temp=1;

    counter[1]++;

    if(counter[1]==10)

    {

    counter[1]=0;

    }

    }

    }

    ZKB=counter[0]+counter[1]*10;

    if(AN4==0)

    {

    delay(5);

    if(AN4==0)

    temp=0;

    }

    if(temp==1)

    P3_7=0;// P3_7為脈衝輸出引腳

    else

    {

    if (timer0_tick

    {

    P3_7=1;

    }

    else

    {

    P3_7=0;

    }

    }

    }

    static void timer0_initialize(void)//中斷初始化

    {

    EA=0;

    timer0_tick=0;

    TR0=0;

    TMOD=0x01;

    TL0=0xf6;

    TH0=0xff;

    PT0=0;

    ET0=1;

    TR0=1;

    EA=1;

    }

    void main(void)

    {

    STAR: delay(100);

    if(AN3!=0) goto STAR;//按鍵3啟動脈衝

    timer0_initialize();

    while(1);

    }

    //按按鍵3啟動脈衝器,初始設定佔空比為1%,按鍵1調整十位,

    //按鍵2調整個位,一旦調整,輸出為0,必須按確認鍵確認,

    //輸出正確脈衝.可以佔空比1-99%任意調節。

  • 中秋節和大豐收的關聯?
  • 哈奇士狗和哈士奇是一種狗嗎?