51单片机PWM

由定时器产生PWM信号,可手动按键调节PWM的占空比,按键由外部中断实现

#include <reg51.h>
#include <intrins.h>

#define CYCLE 6000               //周期6000 * 1us = 6ms
#define SCALE (CYCLE / 100)      //比例 1%

#define ONE        0x10
#define TWO        0x01
#define THREE    0x40
#define FOUR    0x04

typedef unsigned char uchar;
typedef unsigned int  uint;

sbit pwm_out = P2^6;               //PWM信号输出
uchar key_value = 0;            //按键值

uchar const cycle = 100;
uchar scale = 50;
uchar num = 0;

/*************************************************************
*ms延时函数
*************************************************************/
void delay_ms(uchar n)
{
    uchar j = 0;
    for(; n>0; n--)
        for(; j<125; j++);
}

/*************************************************************
*定时器初始化
*************************************************************/
void Init_Timer()
{
    TMOD = 0x01;
    TH0 = (65536 - SCALE)/256;            //定时器0初值
    TL0 = (65536 - SCALE)%256;
}

void main()
{
    Init_Timer();

    ET0 = 1;                              //开定时器中断
//    IE0 = 1;
    IT0 = 0;
    EX0 = 1;
    EA = 1;                                //开总中断

    pwm_out = 1;
    TR0 = 1;                              //定时器0开始计数

    while(1)
    {
        switch(~key_value & 0x55)
        {
            case ONE :
                scale = 25;
            break;

            case TWO :
                scale = 50;
            break;

            case THREE :
                scale = 75;
            break;

            case FOUR :
                scale = 99;
            break;

            default :
            break;
        }
       key_value = 0;
    }

}

/*************************************************************
*外部中断0(按键)
*************************************************************/
void Int0_isr() interrupt 0
{
    key_value = P1;

    delay_ms(1);

    if(key_value != P1)
        key_value = 0;
}

/*************************************************************
*定时器中断0(波形发生)
*************************************************************/
void Timer0_isr() interrupt 1
{
    TH0 = (65536 - SCALE)/256;
    TL0 = (65536 - SCALE)%256;
    num++;
    if(num == scale)
        pwm_out = 0;
    if(num == cycle)
    {
        num = 0;
        pwm_out = 1;
    }
}
时间: 2025-01-05 09:34:09

51单片机PWM的相关文章

51单片机PWM直流电机调速

直流电动机的PWM调压调速原理 直流电动机转速N的表达式为:N=U-IR/Kφ 由上式可得,直流电动机的转速控制方法可分为两类:调节励磁磁通的励磁控制方法和调节电枢电压的电枢控制方法.其中励磁控制方法在低速时受磁极饱和的限制,在高速时受换向火花和换向器结构强度的限制,并且励磁线圈电感较大,动态响应较差,所以这种控制方法用得很少.现在,大多数应用场合都使用电枢控制方法. 对电动机的驱动离不开半导体功率器件.在对直流电动机电枢电压的控制和驱动中,对半导体器件的使用上又可分为两种方式:线性放大驱动方式

51单片机PWM程序详解

#include<reg51.h> //程序是基于KEIL-C51编写,引入8051头文件 sbit P10=P1^0; sbit P11=P1^1; unsigned int scale; //占空比控制变量 void main(void) { unsigned int n; //延时循环变量 TMOD=0x02; //定时器0,工作模式2(0000 0010),8位定时 TH0=0x06; //定时250us(12M晶振) TL0=0x06; //预置值 TR0=1; //启动定时器0 E

单片机(simple chip microcomputer)概论、51单片机、MCS-51单片机、STM32、ARM

catalogue 1. 单片机概论 2. 51单片机 3. MCS-51单片机 4. QX-MINI51开发板(STC89C52芯片) 5. STM32单片机 6. stm32f103zet6开发板实验 1. 单片机概论 0x1: 仿真器 单片机应用系统的软硬件调试需要专门的开发工具,称为"单片机开发系统"或"仿真机".常用的开发方式是把开发系统(例如PC)中的CPU和RAM暂时出借给用户系统,利用开发系统对用户系统的软硬件进行调试(又称仿真),然后将调试好的程序

51单片机300个proteus仿真实例下载

51单片机300个proteus仿真实例下载,不仅有230个51单片机的proteus仿真实例,还有59个经典案例,50个经典电路制作实例,下面只是部分截图和资料,还有更多的proteus仿真/程序在闯客网可以找到,并且免费下载,有需要的朋友可以下载学习,还有技术交流群:613377058 下载链接:https://bbs.usoftchina.com/thread-201293-1-1.html 100000秒以内的计时程序.DSN 10秒的秒表 (2).DSN 10秒的秒表.DSN 1286

51单片机之串口通信(三)

51单片机之串口通信(三) 已有 47 次阅读2015-12-29 00:21 |个人分类:51单片机| 单片机, 通信 用串口实现发送和接收同时可操作: 电脑显示结果如图: 源程序: /*项目名称:串口发送接收实验项目内容:串口发送接收同时进行,计算机发送数据给单片机控制P0口,从而控制LED灯的亮灭,单片机发送数据到计算机,计算机显示出来时间:2015年12月23日项目负责人:YUAN*/#include <reg52.h>typedef unsigned char uChar8;type

51单片机中断机制(定时器/计数器)

单片机中断简介 52单片机一共有6个中断源,它们的符号,名称以及各产生的条件分别如下: INT0 - 外部中断0,由P3.2端口线引入,低电平或下降沿引起 INT1 - 外部中断1,由P3.3端口线引入,低电平或下降沿引起 T0    - 定时器/计数器0中断, 由T0计数器计满回零引起 T1    - 定时器/计数器1中断, 由T1计数器计满回零引起 T2    - 定时器/计数器2中断, 由T2计数器计满回零引起 TI/RI - 串行口中断,串行端口完成一帧字符发送/接收后引起 其中T2是5

51单片机课程设计:基于DS18B20的温度报警器

51单片机课程设计:基于DS18B20的温度报警器 本程序用于读取DS18B20温度,同时具备报警功能,工程分为3个文件,main.c.temp.c.temp.h,经本人修改部分代码,适用于吉林农业大学51开发板,其他朋友亦可移植到其他型号开发板.工程文件在文章最下方. 1.main.c文件 /*********************************说明****************************************** 本程序用于读取温度检测模块DS18B20数值,并

51单片机课程设计:基于MQ-3的酒精浓度报警器

51单片机课程设计:基于MQ-3的酒精浓度报警器 本程序用于将MQ-3上读取到的模拟信号转换为对应的数字信号,经51单片机处理后,在数码管显示,同时具有报警功能,当检测值高于预警值,蜂鸣器报警.除了可以检测MQ-3酒精浓度模块的AD值,也适用于MQ系列的其他模块,原理基本都相同,都是将读取到的AD值转换为数字信号,程序修改后,如果接线方法正确,可以在吉林农业大学51开发板上完美运行,相关工程文件见最下方附件. /*************************************说明***

51单片机特别功用存放器和位界说

接下来的几节,我们会带着人人编写第一个单片机程序.在此之前,我们先来理解一些 51 单片机特有的程序语法以及 Keil 软件的根本操作步调,请人人必定要有耐烦.我们次要是用 C 言语来对单片机编程,而有的单片机有那么几条很特别的独有的编程语句,51 单片机就有,先引见 2 条.第一条语句是:sfr  P0 = 0x80;sfr 这个症结字,是 51 单片机特有的,他的感化是界说一个单片机特别功用存放器(special function register).51 单片机外部有许多个小模块,每一个模