找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 813|回复: 6
收起左侧

为什么这个单片机程序无法用红外控制灯泡的PWM

[复制链接]
ID:1002032 发表于 2022-12-4 17:21 | 显示全部楼层 |阅读模式
为什么我一初始化PWM(使用pwm_init(0XFF,0XF6,100,0);这个函数)就无法再接收来自红外的控制了呢!

单片机源程序如下:
#include <reg52.h>
#include <intrins.h>
#include "public.h"
#include "pwm.h"
sbit LED=P1^0;
u8 pwmdata=0;
u8 rec_data;
u8 duty=0;
u8 i;
void UART_Init()
{
        EA = 1;        //打开总中断
        ES = 1; //打开串口中断
        SM0 = 0;        SM1 = 1;//串口工作方式1,8位UART波特率可变
        REN = 1;//串口允许接收
        TR1 = 1;//启动定时器1
        TMOD |= 0x20;//定时器1,工作模式2 8位自动重装
        TH1 = 0xfd;
        TL1 = 0xfd;//设置比特率9600
}


void main()
{
                UART_Init();
                //pwm_init(0XFF,0XF6,100,0);
while(1)
{

//        duty=30+pwmdata*20;
//        pwm_set_duty_cycle(duty);//设置占空比

}

}

void uart() interrupt 4 //串口通信中断函数
{
        i=!i;
        RI = 0;                        //清除接收中断标志位
        rec_data=SBUF;        //存储接收到的数据
        if(rec_data==1)
        {
         if(i==1)
         {
          LED=1;
         }
                else
                {
                 LED=0;
                }        
        }
                if(rec_data==11)
        {
                delay_ms(20);//短暂延时
         pwmdata++;
               
        }
                        if(rec_data==12)
        {
                delay_ms(20);//短暂延时
         pwmdata--;         
        }
                                
}


PWM.C
#include "pwm.h"

//全局变量定义
u8 gtim_h=0;//保存定时器初值高8位
u8 gtim_l=0;//保存定时器初值低8位
u8 gduty=0;//保存PWM占空比
u8 gtim_scale=0;//保存PWM周期=定时器初值*tim_scale


/*******************************************************************************
* 函 数 名       : pwm_init
* 函数功能                 : PWM初始化函数
* 输    入       : tim_h:定时器高8位
                                   tim_l:定时器低8位
                                   tim_scale:PWM周期倍数:定时器初值*tim_scale
                                   duty:PWM占空比(要小于等于tim_scale)
* 输    出             : 无
*******************************************************************************/
void pwm_init(u8 tim_h,u8 tim_l,u16 tim_scale,u8 duty)
{
        gtim_h=tim_h;//将传入的初值保存在全局变量中,方便中断函数继续调用
        gtim_l=tim_l;
        gduty=duty;
        gtim_scale=tim_scale;

        TMOD|=0X01;        //选择为定时器0模式,工作方式1
        TH0 = gtim_h;        //定时初值设置
        TL0 = gtim_l;               
        ET0=1;//打开定时器0中断允许
        EA=1;//打开总中断
        TR0=1;//打开定时器
}

/*******************************************************************************
* 函 数 名       : pwm_set_duty_cycle
* 函数功能                 : PWM设置占空比
* 输    入       : duty:PWM占空比(要小于等于tim_scale)
* 输    出             : 无
*******************************************************************************/
void pwm_set_duty_cycle(u8 duty)
{
        gduty=duty;        
}

void pwm(void) interrupt 1        //定时器0中断函数
{
        static u16 time=0;

        TH0 = gtim_h;        //定时初值设置
        TL0 = gtim_l;
        
        time++;
        if(time>=gtim_scale)//PWM周期=定时器初值*gtim_scale,重新开始计数
                time=0;
        if(time<=gduty)//占空比        
                PWM=1;
        else
                PWM=0;               
}

PWM.h

#ifndef _pwm_H
#define _pwm_H

#include "public.h"


//管脚定义
sbit PWM=P1^0;

//变量声明
extern u8 gtim_scale;

//函数声明
void pwm_init(u8 tim_h,u8 tim_l,u16 tim_scale,u8 duty);
void pwm_set_duty_cycle(u8 duty);

#endif





回复

使用道具 举报

ID:68189 发表于 2022-12-4 22:19 | 显示全部楼层
以上的代码中,没有看到红外接收的相关内容!
PWM使用了定时器0   串口使用了定时器1,,,请问你的红外接收是如何实现的呢??????
回复

使用道具 举报

ID:77589 发表于 2022-12-5 09:38 | 显示全部楼层
你的PWM使用了Timer0,而且开启Timer0的中断,但是你的程序好像没有处理这个中断。
这个中断的优先级比UART的优先级高,导致UART没法正常接收数据。
回复

使用道具 举报

ID:584814 发表于 2022-12-5 14:54 | 显示全部楼层
貌似程序中只看到有个受控的LED灯,然后一切都是自动的
回复

使用道具 举报

ID:1002032 发表于 2022-12-5 21:40 | 显示全部楼层
Longan.Wang 发表于 2022-12-5 09:38
你的PWM使用了Timer0,而且开启Timer0的中断,但是你的程序好像没有处理这个中断。
这个中断的优先级比UAR ...

谢谢谢谢谢就是这个原因!!!!
回复

使用道具 举报

ID:1002032 发表于 2022-12-5 21:40 | 显示全部楼层
wpppmlah 发表于 2022-12-4 22:19
以上的代码中,没有看到红外接收的相关内容!
PWM使用了定时器0   串口使用了定时器1,,,请问你的红外接收是 ...

红外接收的程序忘记放了!已经解决!感谢回答
回复

使用道具 举报

ID:1002032 发表于 2022-12-5 21:41 | 显示全部楼层
man1234567 发表于 2022-12-5 14:54
貌似程序中只看到有个受控的LED灯,然后一切都是自动的

OKK红外接收的程序忘记放了!问题已经解决感谢回答!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表