找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2768|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)定時(shí)計(jì)數(shù)器生成100hz頻率的PWM控制程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
ID:818532 發(fā)表于 2021-5-25 23:25 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
#include <reg51.h>
#include "delay.h"

sbit PWM=P2^1;                        //PWM輸出
sbit key_s=P3^2;

unsigned char PWM_bz=100;                //0-100   改變脈沖寬度
unsigned char PWMFF;        //定義變量,計(jì)算周期
void Timer0Init(void);            //聲明定時(shí)計(jì)數(shù)器0
void EX0_Init(void);       //聲明外部中斷0


void main()
{
        EX0_Init();       //外部中斷0初始化
        Timer0Init();                //初始化定時(shí)計(jì)數(shù)器0        
        EA=1;        //中斷總開關(guān)
        while(1)
        {

        }
}

void EX0_Init(void)                        //外部中斷0設(shè)置
{
        IT0=1;
        EX0=1;

}
void Timer0Init(void)                //100微秒@12.000MHz
{
        TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
        TMOD |= 0x01;                //設(shè)置定時(shí)器模式
        TL0 = 0x9C;                //設(shè)置定時(shí)初值
        TH0 = 0xFF;                //設(shè)置定時(shí)初值
        TF0 = 0;                //清除TF0標(biāo)志
        ET0=1;
        //EA=1;                                //總中斷
        TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)
}

void EX0_isr(void)        interrupt 0                //外部中斷0入口
{
        static unsigned char PWM_KEY;        //定義脈寬調(diào)整變量
        if(key_s==0)                                        //按鍵判斷
        {
        delayms(10);
        if(key_s==0)
        {
                PWM_KEY++;                                        //每進(jìn)入一次中斷加一
        }while(key_s==0);                                       //松手運(yùn)行
        }
                                       
        switch(PWM_KEY)
        {
                case 1:PWM_bz=25;break;
                case 2:PWM_bz=50;break;
                case 3:PWM_bz=75;break;
                case 4:PWM_bz=100;break;        
                case 5:PWM_bz=0;PWM_KEY=0;break;        //清零
                default:break;
        }
}        

void Timer0_isr(void)        interrupt 1                //定時(shí)1ms
{
        TR0 = 0;
        TL0 = 0x9C;                                                        //設(shè)置定時(shí)初值
        TH0 = 0xFF;                                                        //設(shè)置定時(shí)初值
        PWMFF++;
        if(PWMFF>=100)
        {
                PWMFF=0;
        }
        if(PWMFF<PWM_bz)
                PWM=1;
        else
                PWM=0;
        TR0 = 1;
}

仿真.7z

31.26 KB, 下載次數(shù): 38

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:981835 發(fā)表于 2022-11-30 14:57 | 只看該作者
我還以為是源碼,誰知竟是DSN文件原理圖
回復(fù)

使用道具 舉報(bào)

樓主
ID:818532 發(fā)表于 2021-5-26 10:48 | 只看該作者
void Delay10ms()                //@12.000MHz
{
        unsigned char i, j;

        i = 20;
        j = 113;
        do
        {
                while (--j);
        } while (--i);
}
上面延時(shí)子程序補(bǔ)充
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表