找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1136|回复: 7
收起左侧

单片机程序有问题,已经用adc测得光敏数值,然后想用pwm控制led,有占空比的那种

[复制链接]
ID:1068108 发表于 2023-4-17 10:10 来自手机 | 显示全部楼层 |阅读模式
已经用adc测得光敏数值,然后想用pwm控制led,有占空比的那种,但是led不亮,想问问什么原因,下面是程序
#include "STC15F2K60S2.h"
#include "main.h"
#include "LCD1602.h"
#include "ADC.h"
#include "led.h"


unsigned char str[5];
unsigned int backup=0;
unsigned char aa[]={'L','I','G','H','T'  ,':'};
unsigned int result;
unsigned int result1;
sbit light_pwm=P2^1;
unsigned char duty_cycle=0;
bit flag=0;



void delay_nms(unsigned int n)
{
        unsigned int i,j;
        for(i=0;i<n;i++)
        {
                for(j=0;j<125;j++);
        }
}

void main()
{        
//        zd_count=0;
//        update_count=0;
//        pwm_value=0;
//        flag=0;
//
        Timer0Init();


        ET0=1;  //打开定时器0中断
  EA=1;        //打开总中断
        



  light_pwm=1;
        init();
        Init_ADC();
  LCD_Write_String(0,1,aa);               


        while (1)
        {        
                adc_light_display();
                        if(!flag)
                        {
                                duty_cycle++;
                                if(duty_cycle==255)
                                {
                                        flag=1;
                                }
                        }
                        else
                        {
                                duty_cycle--;
                                if(duty_cycle==0)
                                {
                                        flag=0;
                                }
                        }

                        light_pwm= (duty_cycle == 0 || duty_cycle == 255) ? 0 : 1;
                        delay_nms(10);
                                
        }

}

//ADC数值读取转化
void adc_light_display()
{
         result1=ADC_Chang(2);
         result=result1*4.75;
        
                         while (result!=backup)
                        {
        
                                str[0]=result/1000%100+'0';        
                                str[1]=result/100%10+'0';
                                str[2]='.';
                                str[3]=result/10%10+'0';
        str[4]=result%10+'0';                                
                                str[5]='\0';
                                                
                                LCD_Write_String(6,1,str);  
                          backup=result;
                                
                        }
}







//定时器0初始化函数,可由ISP软件生成
void Timer0Init(void)                //1毫秒@11.0592MHz
{
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器为16位自动重装载模式,较常使用
        TL0 = 0xCD;                //设置定时初值
        TH0 = 0xD4;                //设置定时初值
        
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
        

}



//定时器0中断服务函数
void Time0_Int(void) interrupt 1        //定时器1为3
{
  TL0 = 0xCD;                //设置定时初值
        TH0 = 0xD4;                //设置定时初值
  light_pwm=duty_cycle;
        }
回复

使用道具 举报

ID:584814 发表于 2023-4-17 11:08 | 显示全部楼层
STC的单片机用PWM控制,可以直接在厂家的例程里CV。
回复

使用道具 举报

ID:1072104 发表于 2023-4-17 11:21 | 显示全部楼层
根据你提供的代码,LED不亮的问题可能有以下原因:
1.PWM输出管脚配置错误;
2.PWM占空比计算有误;
3.LED驱动电路连接错误;
4.程序逻辑问题。
其中,1和2是比较常见的问题。可以分别检查这两个方面。
PWM输出管脚配置错误
根据你的代码,PWM的输出管脚为P2.1,但是没有看到相关初始化操作。因此,需要确认是否已经正确设置端口的工作模式,以及是否打开了PWM输出使能。

修改方法:在程序中添加以下代码,初始化PWM输出引脚,并打开PWM输出使能:

sfr PWM4_MAP = 0xFE; // PWM pin map register
sfr PWMCON1  = 0xF7; // PWM 1-4 control register

void InitPWM(void)
{
    PWM4_MAP |= 0x10;  // P2.1 mapped to PWM4
    PWMCON1 |= 0x40;   // PWM4 output enabled
}
在主函数中调用InitPWM()函数进行初始化。

PWM占空比计算有误
根据你的代码,PWM占空比是通过修改light_pwm变量实现的。但是,light_pwm被定义为一个sbit类型,只能存储0或1(即PWM占空比为0或100%),不能存储其他值。因此,需要使用另外一个变量存储PWM占空比,例如duty_cycle变量。

另外,根据你的程序逻辑,在电平切换之间,通过delay_nms函数延时了10ms。这样可能会导致PWM频率比较低,影响LED的亮度。因此,建议调整延时时间,例如设为1ms。

修改方法:将light_pwm变量改为duty_cycle变量,并定义一个flag变量来控制PWM占空比的增减。修改代码如下:

sbit light_pwm = P2^1;
unsigned char duty_cycle = 0;  // PWM占空比
bit flag = 0;  // 标志位,用于控制PWM占空比的增减

void main()
{      
    // ...

    InitPWM();

    while (1)
    {      
        adc_light_display();

        if (!flag)
        {
            duty_cycle++;
            if (duty_cycle == 255)
            {
                flag = 1;
            }
        }
        else
        {
            duty_cycle--;
            if (duty_cycle == 0)
            {
                flag = 0;
            }
        }

        light_pwm = (duty_cycle == 0 || duty_cycle == 255) ? 0 : 1;

        delay_nms(1);   
    }
}
修改后,可以尝试重新编译、下载并运行程序,测试PWM是否能够正确控制LED的亮度。如果还有问题,可以依次检查其他可能的原因。
回复

使用道具 举报

ID:1068108 发表于 2023-4-17 12:06 来自手机 | 显示全部楼层
man1234567 发表于 2023-4-17 11:08
STC的单片机用PWM控制,可以直接在厂家的例程里CV。

厂家历程是stc里面的吗
回复

使用道具 举报

ID:1068108 发表于 2023-4-17 12:59 来自手机 | 显示全部楼层
张大炮ie 发表于 2023-4-17 11:21
根据你提供的代码,LED不亮的问题可能有以下原因:
1.PWM输出管脚配置错误;
2.PWM占空比计算有误;

谢谢帮助
回复

使用道具 举报

ID:94031 发表于 2023-4-17 14:38 | 显示全部楼层
STC15系列A版单片机,部分端口复位后,不是准双向口,需要设置才能正常使用。
回复

使用道具 举报

ID:1068108 发表于 2023-4-17 16:43 来自手机 | 显示全部楼层
xuyaqi 发表于 2023-4-17 14:38
STC15系列A版单片机,部分端口复位后,不是准双向口,需要设置才能正常使用。

请问怎么设置
回复

使用道具 举报

ID:1068108 发表于 2023-4-17 16:45 来自手机 | 显示全部楼层
张大炮ie 发表于 2023-4-17 11:21
根据你提供的代码,LED不亮的问题可能有以下原因:
1.PWM输出管脚配置错误;
2.PWM占空比计算有误;

大佬,你好,我现在修改了,但是我的仿真led是一会亮一会灭,好像没有根据光线的值改变亮暗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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