PWM技术实现灯光的无极调节(代码+详细注释)

课程设计,我只放代码,代码借鉴网上某位师兄的,其中有些错误,做了修改,并自己写了很多注释,适合小白阅读。不熟悉汇编,可能有纰漏,不过代码亲测可用,在学校机房试过了。注释只供借鉴,请禁止抄袭,代码请随便用。为51单片机的

DIRLOP  EQU     38H                //显示字节数
DISP0   EQU     39H                //串行显示寄存器0
DISP1   EQU     3AH                //串行显示寄存器1
DISP2   EQU     3BH                //串行显示寄存器2
LDAN    EQU     58H                //电灯亮度档值
T2H     EQU     59H                //T1高8位定时值存储器
T2D     EQU     5AH                //T1低8位定时值存储器
LAMP    EQU     P1.2               //电灯控制位

ORG 0000H
; 复位
; ORG 是汇编的伪指令 告诉编译器我的代码放在什么位置
; 在单片机复位的时候 在你没有做任何改变的时候 程序指针会是指向00000H的地址
; 所以我们把 START 卸载地址00H 让单片机复位后直接跳转到 START的程序段去执行
AJMP START
ORG 000BH
; 000BH是定时器T0中断源入口地址
LJMP TIME1                         //T0中断程序(产生PWM基频)

ORG 001BH
; 001BH是定时器T1中断源入口地址
LJMP TIME2                         //T1中断程序(控制脉冲宽度)
ORG 0030H
; ORG 30H 是你程序的代码开始地址,由于30H以前有中断向量入口和寄存器的地址,所以一般用户程序都是从30H开始的。
START:SETB LAMP                    //程序初始化
      MOV A,#0
      MOV LDAN,A
      MOV DISP0,A
      MOV DISP1,A
      MOV DISP2,A
    ;   将电灯亮度档值、串行显示寄存器0、1、2的初始值都设置为0
      MOV TMOD,#11H                //设定两定时器为16位定时器
    ;   11H --> 0001 0001 TMOD,设置两个定时器,
    ; GATE为0,表示“或门”输出恒为1,“与门”的输出信号K由TRx决定(即此时K=TRx),定时器不受INTx输入电平的影响,由TRx直接控制定时器的启动和停止。
    ; C/T为0,为定时功能
    ; M1 M0 --> 0 1 ,为方式1,16位定时器/计数器
      MOV IE,#10001010B            //开启两定时器的中断请求
    ;   51单片机中断允许寄存器IE
    ; 设置为1,为开,设置为0,为关;
    ; D7:全局中断位,1,开;        1
    ; D6:无效位;                  0
    ; D5:定时/计数2(52单片机)    0
    ; D4:串行口中断,0,关         0
    ; D3:定时/计数1,1,开         1
    ; D2:外部中断1,0,关      
  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个STM32F4系列微控制器的通用定时器PWM互补输出的代码注释详细说明了每个步骤的实现方法: ```c // 定义PWM频率和占空比 #define PWM_FREQ 10000 #define PWM_DUTY_CYCLE 50 // 初始化通用定时器 void TIM_PWM_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // 使能定时器时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // TIM2初始化为PWM模式 TIM_TimeBaseStructure.TIM_Period = 100-1; // 设置计数器自动重装值 TIM_TimeBaseStructure.TIM_Prescaler = 84-1; // 设置预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 设置时钟分割 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 设置计数器模式为向上计数 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // PWM输出模式配置 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 输出性为高电平 TIM_OCInitStructure.TIM_Pulse = (uint16_t)(PWM_DUTY_CYCLE/100.0f*TIM_TimeBaseStructure.TIM_Period); // 计算占空比对应的脉冲宽度 TIM_OC1Init(TIM2, &TIM_OCInitStructure); // 配置通道1 // PWM互补输出模式配置 TIM_BDTRInitTypeDef TIM_BDTRInitStructure; TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; // 初始输出为高电平 TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; // 初始输出为低电平 TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; // 不使用锁定功能 TIM_BDTRInitStructure.TIM_DeadTime = 10; // 设置死区时间,避免开关损伤 TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; // 不使用断路功能 TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low; // 断路输出性为低电平 TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; // 自动输出使能 TIM_BDTRConfig(TIM2, &TIM_BDTRInitStructure); // 配置BDTR寄存器 // 通道2输出互补PWM信号 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; // PWM模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; // 输出性为低电平 TIM_OCInitStructure.TIM_Pulse = (uint16_t)(PWM_DUTY_CYCLE/100.0f*TIM_TimeBaseStructure.TIM_Period); // 计算占空比对应的脉冲宽度 TIM_OC2Init(TIM2, &TIM_OCInitStructure); // 配置通道2 // 使能定时器 TIM_Cmd(TIM2, ENABLE); } ``` 需要注意的是,不同的微控制器的通用定时器的具体实现方式可能有所不同,具体实现方法需要参考相关的微控制器手册。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值