标题: 51单片机定时计数器生成100hz频率的PWM控制程序 [打印本页]

作者: 2916136381    时间: 2021-5-25 23:25
标题: 51单片机定时计数器生成100hz频率的PWM控制程序
#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;        //定义变量,计算周期
void Timer0Init(void);            //声明定时计数器0
void EX0_Init(void);       //声明外部中断0


void main()
{
        EX0_Init();       //外部中断0初始化
        Timer0Init();                //初始化定时计数器0        
        EA=1;        //中断总开关
        while(1)
        {

        }
}

void EX0_Init(void)                        //外部中断0设置
{
        IT0=1;
        EX0=1;

}
void Timer0Init(void)                //100微秒@12.000MHz
{
        TMOD &= 0xF0;                //设置定时器模式
        TMOD |= 0x01;                //设置定时器模式
        TL0 = 0x9C;                //设置定时初值
        TH0 = 0xFF;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        ET0=1;
        //EA=1;                                //总中断
        TR0 = 1;                //定时器0开始计时
}

void EX0_isr(void)        interrupt 0                //外部中断0入口
{
        static unsigned char PWM_KEY;        //定义脉宽调整变量
        if(key_s==0)                                        //按键判断
        {
        delayms(10);
        if(key_s==0)
        {
                PWM_KEY++;                                        //每进入一次中断加一
        }while(key_s==0);                                       //松手运行
        }
                                       
        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                //定时1ms
{
        TR0 = 0;
        TL0 = 0x9C;                                                        //设置定时初值
        TH0 = 0xFF;                                                        //设置定时初值
        PWMFF++;
        if(PWMFF>=100)
        {
                PWMFF=0;
        }
        if(PWMFF<PWM_bz)
                PWM=1;
        else
                PWM=0;
        TR0 = 1;
}

仿真.7z

31.26 KB, 下载次数: 38


作者: 2916136381    时间: 2021-5-26 10:48
void Delay10ms()                //@12.000MHz
{
        unsigned char i, j;

        i = 20;
        j = 113;
        do
        {
                while (--j);
        } while (--i);
}
上面延时子程序补充
作者: 小烧友    时间: 2022-11-30 14:57
我还以为是源码,谁知竟是DSN文件原理图




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1