新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于51單片機(jī)的pwm波產(chǎn)生

        基于51單片機(jī)的pwm波產(chǎn)生

        作者: 時(shí)間:2016-11-27 來源:網(wǎng)絡(luò) 收藏
        利用定時(shí)器的中斷來實(shí)現(xiàn)PWM調(diào)制。如果我們?cè)O(shè)定脈沖的周期為1000毫秒;每20毫秒產(chǎn)生一次中斷,則知道要中斷50次。
        那么我們可以這樣編寫程序
        TH0=0XFF;
        TL0=0XEC;這是定時(shí)器0產(chǎn)生一次中斷的時(shí)間,即20毫秒產(chǎn)生一次中斷。我們?cè)俣x一個(gè)計(jì)數(shù)的變量NUM,讓NUM從0開始加到50,程序如下
        void Timer0Interrupt(void) interrupt 1
        {
        TH0 = 0x0FE;
        TL0 = 0x0C;
        NUM++;
        if(NUM==33)
        {
        NUM=0;
        }
        if(NUM<=PWM)P1=0x00;
        if(NUM>PWM)P1=0xff;

        }
        其中的PWM為0到50的數(shù)值,這樣通過控制PWM的值讓小于PWM的NUM值里所產(chǎn)生的中斷全為低電平,大于PWM的為高電平,這樣通過控制計(jì)數(shù)就實(shí)現(xiàn)了PWM。
        所有程序如下
        #include
        #define uint unsigned int
        #define uchar unsigned char
        sbit k1=P3^2;
        sbit k2=P3^3;
        sbit beep=P2^7;
        uchar PWM=10; //用來控制脈寬
        uchar NUM;//中斷次數(shù)變量
        void delay(uint t)
        {
        uchar j;
        while(t--)for(j=0;j<120;j++);
        }
        void bee()
        {
        beep=0;
        delay(10);
        beep=1;
        delay(10);

        }
        void keycheck()
        {
        if(k1==0)
        {
        delay(10);
        if(k1==0)
        {
        if(PWM!=0X20)
        {
        PWM++;
        delay(20);
        }
        }
        else
        bee();
        }
        if(k2==0)
        {
        delay(10);
        if(k2==0)
        {
        if(PWM!=0X01)
        {
        PWM--;
        delay(20);
        }
        }
        else
        bee();
        }
        }
        void InitTimer0(void)
        {
        TMOD = 0x01;
        TH0 = 0xfe; //我們?cè)O(shè)定500毫秒中斷一次 共中斷32次即一個(gè)周期
        TL0 = 0x0c;
        EA = 1;
        ET0 = 1;
        TR0 = 1;
        }
        void main()
        {
        InitTimer0();
        while(1)
        {

        keycheck();
        }
        }
        void Timer0Interrupt(void) interrupt 1
        {
        TH0 = 0x0FE;
        TL0 = 0x0C;
        NUM++;
        if(NUM==33)
        {
        NUM=0;
        }
        if(NUM<=PWM)P1=0x00;
        if(NUM>PWM)P1=0xff;

        }


        關(guān)鍵詞: 51單片機(jī)pwm

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 玛纳斯县| 岳池县| 息烽县| 绍兴县| 上栗县| 临海市| 宜良县| 乌海市| 上犹县| 潼关县| 保定市| 宿州市| 沙洋县| 龙州县| 余庆县| 故城县| 宁都县| 怀远县| 胶南市| 新安县| 杭锦旗| 囊谦县| 社会| 贡嘎县| 兴山县| 法库县| 镇沅| 清新县| 龙海市| 朔州市| 陇西县| 平阳县| 九寨沟县| 克山县| 财经| 靖宇县| 宿松县| 盐亭县| 昌吉市| 门头沟区| 桐乡市|