久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4914|回復: 5
打印 上一主題 下一主題
收起左側

一種基于51單片機的PWM程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:262 發表于 2014-10-21 01:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
      51單片機沒有PWM波產生模塊,有時候需要用到PWM功能,想用51單片機實現,這真是令人傷腦筋。先貼出我寫的一個比較簡單的產生PWM的程序,該程序使用了一個定時器和一個IO端口就實現了。

#include<reg52.h>                                    //51單片機頭文件
#define uint unsigned int                           //宏定義
#define uchar unsigned char                    //宏定義


uint i,m=4;                         //m調整占空比,i 控制周期
sbit PWM=P1^0;                //P1.0口輸出PWM波
sbit key=P2^0;                   //P2.0口按鍵調整占空比


void delay(uint x)            //延時函數,約1ms
{
        uint a,b;
        for(a=x;a>0;a--)
        for(b=110;b>0;b--);
}


void main()
{
        PWM=1;                                //初始化給P1.0口高電平
        TMOD = 0X01;                        //定時器0工作方式1
        TH0 = (65536-500)/256;         //裝初值,0.5ms
        TL0 = (65536-500)%256;        
        ET0 = 1;                                //使能T0中斷
        TR0 = 1;                                //啟動定時器T0
        EA=1;                                    //開啟全局中斷
        while(1)
        {
                if(key==0)                        //檢測按鍵
                        delay(5);
                        if(key==0)
                        {                       
                                m++;
                                if(m==5)
                                m=0;
                        }
                        while(!key);        //按鍵松手檢測
        }
}


void timer0() interrupt 1               //T0中斷函數
{
        TH0 = (65536-500)/256;        //重裝定時器初值
        TL0 = (65536-500)%256;
        i++;       
        if(i==m)                                
        {
                PWM=0;
        }
        if(i==40)
        {
        i=0;
        PWM=1;
        }
}




到這里大家應該可以弄明白這個程序是怎么實現的了吧?
這個程序只用一個按鍵控制占空比,調占空比時不是很方便,大家在設計此類程序的時候可以用兩個按鍵。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:63571 發表于 2014-10-21 10:55 | 只看該作者
有沒有8只流水燈漸變的程序啊
回復

使用道具 舉報

板凳
ID:65837 發表于 2014-10-21 11:16 | 只看該作者
不錯,收下,謝謝!!!
回復

使用道具 舉報

地板
ID:84498 發表于 2015-12-9 18:43 | 只看該作者
謝謝樓主
回復

使用道具 舉報

5#
ID:98591 發表于 2015-12-10 21:29 | 只看該作者
我的好像也沒錯,但是萬用表測不出來,只有占空比在0.5附近才能明顯測到電壓約等于2.4v,其他時候都有4v多,但是接個led上去會亮。
//pwm的頻率f、占空比d,單片機定時器+1要是1us才準確
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define f 1000//輸出頻率f,Hz
#define d 0.5//占空比,H時的
sbit pwm=P2^7;//pwm輸出口
float t;
uchar temp1h,temp1l,temp2h,temp2l;//temp1為要H時定時器初值,temp2為要L時的初值
bit flag;//頻率一個周期中的標志位,當pwm輸出h為1,輸出l為0
void init_pwm()
{
        EA=1;
        TMOD=0X20;
        ET1=1;
        TH1=temp1h;
        TL1=temp1l;
        flag=1;
        TR1=0;
}//初始化設置定時器1,但沒有啟動
void main()
{
//        float f,d;
        uint a1,a2;
        t=1000000/f;//一個周期的時間t
        a1=65536-d*t;
        a2=65536-(1-d)*t;//因為%不能對小數,多加入了a1,a2取整
        temp1h=(65536-d*t)/256;
        temp1l=a1%256;
        temp2h=(65536-(1-d)*t)/256;
        temp2l=a2%256;
        init_pwm();
        TR1=1;
        while(1);
}
void t1() interrupt 3
{
        if(flag==0)//要h輸出時的t1初值
        {
                TH1=temp1h;
                TL1=temp1l;
                pwm=1;
                flag=1;
        }
        else        if(flag==1)//要L輸出時的t1初值
        {
                TH1=temp2h;
                TL1=temp2l;
                flag=0;
                pwm=0;
        }
}
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久91精品国产一区二区三区 | 久久99精品久久久久婷婷 | 91se在线 | 久久久噜噜噜www成人网 | 国产成人精品一区二区三区四区 | 伊人在线 | 久久精品欧美一区二区三区不卡 | 欧洲一区二区视频 | 成人高清视频在线观看 | 日韩精品一区二区三区中文字幕 | 天堂成人av| 欧州一区二区三区 | 精品国模一区二区三区欧美 | 在线一区| 又黑又粗又长的欧美一区 | 最新日韩欧美 | 欧美日韩久久精品 | 精品久久久久久久久久久久久久久久久 | 午夜精品久久久久久久久久久久久 | 欧美精品乱码99久久影院 | 欧美一区二区在线观看 | 涩在线| 黄色在线网站 | 国产在线a | 毛片com | 成年男女免费视频网站 | 欧美性受xxxx| 日韩精品一区二区三区中文在线 | 久久精品一| 福利精品 | a黄毛片| 日本一区不卡 | 欧美亚洲免费 | 日韩有码一区二区三区 | 中文在线日韩 | 欧美一级视频在线观看 | 天天天操操操 | 色姑娘av| 亚洲黄色片免费观看 | 观看av| 日本五月婷婷 |