标题: 为什么用低电平驱动灯泡不亮啊 [打印本页]

作者: 程成成    时间: 2017-7-1 11:32
标题: 为什么用低电平驱动灯泡不亮啊
当温度低于30度时,单片机控制P2.3输出低电平,可是灯泡不亮,是程序问题还是原理图呀
主程序如下:#include<reg52.h>
#include "LCD.h"
#include "DS18B20.h"
#include "DS1302.h"
sbit  outv=P2^0;           //电机转动时PWM输出口;
sbit  ctr =P2^3;           //控制加热设备输出
uchar  flag2=1;
uchar  tflag=1;
uchar  timeflag=0;
uchar  per=10;             //PWM低电平所占时间
void  initall();
void  chesu();
void  initT0();
void  DispTemp(uint tem);
void  DispTime();
void  DispSP();
/*****************主函数**********************/
void  main()
{   
    initall();
    while(1)
    {   
        DispTemp(gettemp());
        DispTime();
        if(timeflag)
           DispSP();   
    }
}
/******************温度显示函数*******************/
void  DispTemp(uint tem)        
{
    if(tflag)               //第一次调用温度显示函数
    {
        tflag=0;
        write_string(0,10,"Tem:");
    }
    if(tem<300)            //随着温度的改变,PWM的占空比发生变化,同时加热设备也发生变化
    {   
        per=10;
        ctr=0;
    }
    else
    {
        ctr=1;
        if(tem>=300&&tem<=330)
            per=5;
        else
            per=0;
    }
    write_com(0x80+14);
    write_data(tem/100+48);
    write_data(tem%100/10+48);
    write_data('.');
    write_data(tem%10+48);                        
    write_data(0);          //显示摄氏度
}
/***************DS1302时间显示函数*********************/
void  DispTime()                     
{
    uchar  j;   
    gettime();  
    write_com(0x80);
    for(j=0;j<8;j++)
        write_data(buf[j]);
}
/*******************初始化****************************/
void  initall()
{
    initLCD();
    if((read(0x83)==0x00)&(read(0x81)==0x80)) //判断1302的秒的第8位是否为1,即是否处于低功耗状态(振荡器停止)
    {
       write(0x8E,0x00);//取消写保护
       write(0x80,0x00);
       write(0x8E,0x80);//写保护
    }
    initT0();
    outv=0;
    write_string(1,0,"Speed: 000r/min");
}
/**********************中断初始化**********************/
void  initT0()
{
    TMOD=0x51;
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    TH1=0;
    TL1=0;
    EA=1;   
    ET0=1;
    TR0=1;TR1=1;           
}
/*****************中断函数*********************/
void  T0_time()   interrupt 1
{
    uchar times;
    times++;   
    if(times%20>per)
        outv=1;
    else
        outv=0;
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    if(times==200)
    {
        times=0;
        timeflag=1;     
    }   
}
/*******************电机转速显示函数*********************************/
void   DispSP()
{
    uint  count=0;
    timeflag=0;
    write_com(0xc0+7);
    count=TH1*256+TL1;  
    write_data(count*6/100+48);
    write_data(count*6%100/10+48);
    write_data(count*6%10+48);
    TH1=0;
    TL1=0;  
}

1.png (20.37 KB, 下载次数: 102)

1.png

作者: 程成成    时间: 2017-7-1 11:37
求大神指点
作者: 小潘哥    时间: 2017-7-1 13:08
先不管其它功能,写个程序验证一下这电路有没有问题,就只让P23为低电平,看看亮不亮先。
另外,我感觉proteus里的三极管也是有点问题
作者: cjjcjj1    时间: 2017-7-1 13:45
提示: 作者被禁止或删除 内容自动屏蔽
作者: aiohu    时间: 2017-7-1 16:47
先看看你的电源是不是够驱动继电器,方法为在PNP的C脚接一个电流表,看一下是否有毫安的电流流过
这样你就可以判断是不是在低电平时电流输出来,
作者: aiohu    时间: 2017-7-1 17:01
加一个12V的VCC1接到PNP的E-------你会加的,给P2.3一个低电平,   在继电器的线圈端加一个小灯泡,仿真在PROTEUS 里做,单独的做一个程序,就上述几句
作者: 程成成    时间: 2017-7-1 17:03
cjjcjj1 发表于 2017-7-1 13:45
你好!程序不全,仿真截图没法测试,直接把程序和仿真打包发一下吧
加我QQ 1413753805

已加qq

作者: 程成成    时间: 2017-7-1 17:03
吕强军 发表于 2017-7-1 14:01
你把你的程序和仿真图以文件的形式发给我,加我QQ 2211818451

已经加了qq

作者: 程成成    时间: 2017-7-1 19:57
aiohu 发表于 2017-7-1 17:01
加一个12V的VCC1接到PNP的E-------你会加的,给P2.3一个低电平,   在继电器的线圈端加一个小灯泡,仿真在PR ...

已经解决谢谢
作者: 程成成    时间: 2017-7-1 19:58
aiohu 发表于 2017-7-1 17:01
加一个12V的VCC1接到PNP的E-------你会加的,给P2.3一个低电平,   在继电器的线圈端加一个小灯泡,仿真在PR ...

已解决,谢谢
作者: zl2168    时间: 2017-7-1 20:55
加一个12V的VCC1接到PNP的E,结果是无论输出高低电平,小灯泡都会亮!
作者: 3760609865    时间: 2017-7-2 16:26
你把三极管B级电阻改为200R,保证灯的工作电压设置为5v灯就亮了。
作者: mszhappy    时间: 2017-7-3 09:13
一般去推继电器我喜欢用NPN的管子,PNP老是怕不饱合
作者: wangyuan06    时间: 2017-7-3 11:14
用万用表测量一下,看到底是不是低电平。看看灯泡两端有没有电压。
作者: 112384    时间: 2017-7-4 09:47
先不管其它功能,写个程序验证一下这电路有没有问题,就只让P23为低电平,看看先。 另外,我感觉proteus里的三极管也是有点问题
作者: ahshmj    时间: 2017-7-4 21:01
继电器吸合不吸合?
作者: lllllllllxxxxx    时间: 2017-7-5 17:30
来个上拉电阻




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