找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1940|回复: 17
收起左侧

单片机控制led只有取反才亮,给1和给0都不亮?

  [复制链接]
ID:1076567 发表于 2024-5-16 13:47 | 显示全部楼层 |阅读模式
是不是少了什么初始化,我看网上的例程好像都没有

单片机源程序如下
#include <STC15.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

        sbit s1 = P3^3;
        sbit k1 = P3^2;        sbit k2 = P3^1;
        sbit k3 = P3^0;
        sbit led = P3^5;
        void main()
        {
                IT1 = 1;
                EX1 = 1;
                EA = 1;
           
                while(1)
                {
                         led        = !led;         //把这句改成led=1和led=0都不能点亮
                   }
       }
原理图如下
51hei.png
后面加了推挽输出确实可以了,只是一开始的话要先置0,不然按键按下会不起作用,感谢各位
P3M0 = 0x20;
P3M1 = 0x00;
led = 0;


                                       


回复

使用道具 举报

ID:192020 发表于 2024-5-16 15:06 | 显示全部楼层
还有这等子事?是不是中断里有控制LED的?把中断关了试试看?
回复

使用道具 举报

ID:23640 发表于 2024-5-16 15:28 | 显示全部楼层
取反是如何亮的,看你程序死循环又没有延时,取反的话应该是出现的脉冲电压,微亮吧
回复

使用道具 举报

ID:1076567 发表于 2024-5-16 15:35 | 显示全部楼层
yaosongjin 发表于 2024-5-16 15:28
取反是如何亮的,看你程序死循环又没有延时,取反的话应该是出现的脉冲电压,微亮吧

确实是微亮,那我把死循环去掉再加个延时试试吗
回复

使用道具 举报

ID:1076567 发表于 2024-5-16 15:36 | 显示全部楼层
qq475878026 发表于 2024-5-16 15:06
还有这等子事?是不是中断里有控制LED的?把中断关了试试看?

中断关了也不行
回复

使用道具 举报

ID:857072 发表于 2024-5-16 15:46 来自手机 | 显示全部楼层
15是需要设置IO模式的
回复

使用道具 举报

ID:466997 发表于 2024-5-16 16:26 | 显示全部楼层
先将IO模式设置成推挽输出,再将中断关掉,最后在WHILE循环中添加延时。
回复

使用道具 举报

ID:1109793 发表于 2024-5-16 18:37 | 显示全部楼层
看下那个MOS,5V能打开不。
回复

使用道具 举报

ID:796531 发表于 2024-5-16 19:12 | 显示全部楼层
把Q1源漏极短接一下看看你led串联后驱动电压够不够
回复

使用道具 举报

ID:69038 发表于 2024-5-16 21:45 | 显示全部楼层
Q1什么型号?P3.5输出的电压,经电阻分压后的Vgs电压能让它完全导通吗?
VCC多少V?6串LED,2V(RLED)/3.3V(GLED/BLED),能驱得动吗?
回复

使用道具 举报

ID:1117058 发表于 2024-5-17 00:24 | 显示全部楼层
设置输出模式为推挽输出
回复

使用道具 举报

ID:1076567 发表于 2024-5-17 10:17 | 显示全部楼层
j1ason 发表于 2024-5-16 16:26
先将IO模式设置成推挽输出,再将中断关掉,最后在WHILE循环中添加延时。

推挽输出是这样设吗,改了还是不行
#include <STC15.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

        sbit s1 = P3^3;
        sbit k1 = P3^2;
        sbit k2 = P3^1;
        sbit k3 = P3^0;
        sbit led = P3^5;


        void Delay1s(int t)
                {
                        uint i;
                        i=1000*t;
                        while(1)
                        {
                                i--;  
                                if(i==0)
                                {return;}
                        }
                }
        void main()
        {
                P3M0 |= 0x00;
                P3M1 |= 0x08;       
                          
                while(1)
                {
                        Delay1s(10);
                        led = 1;
                }
      }
回复

使用道具 举报

ID:161164 发表于 2024-5-17 10:38 | 显示全部楼层
R8/R9阻值是多少?分压了吧?
把R8去掉试试
回复

使用道具 举报

ID:69038 发表于 2024-5-18 17:40 | 显示全部楼层
Dokkis 发表于 2024-5-17 10:17
推挽输出是这样设吗,改了还是不行
#include
#include

P3.5设成推挽,应该是"P3M0|=0x20"
你核对一下。
STC的ISP软件本身自带的工具里边就有。。。


51hei.jpg
回复

使用道具 举报

ID:491923 发表于 2024-5-18 18:54 | 显示全部楼层
Vcc是多少?
回复

使用道具 举报

ID:1076567 发表于 2024-5-20 09:41 | 显示全部楼层
zhuls 发表于 2024-5-18 17:40
P3.5设成推挽,应该是"P3M0|=0x20"
你核对一下。
STC的ISP软件本身自带的工具里边就有。。。

嗷嗷好的 第一次用这个芯片 不太熟悉
回复

使用道具 举报

ID:1076567 发表于 2024-5-20 09:42 | 显示全部楼层

vcc是5v
回复

使用道具 举报

ID:1076567 发表于 2024-5-20 11:56 | 显示全部楼层
zhuls 发表于 2024-5-18 17:40
P3.5设成推挽,应该是"P3M0|=0x20"
你核对一下。
STC的ISP软件本身自带的工具里边就有。。。

你好 我设置成了推挽输出,但是它一通电就自己亮了,我写的程序是按键按下才亮,而且中断对它也没有反应
#include <STC15.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

        sbit s1 = P3^3;
        sbit k1 = P3^2;
        sbit k2 = P3^1;
        sbit k3 = P3^0;
        sbit led = P3^5;
        bit  seyFlag=0;

  void DELAY_MS (unsigned int t)
         {
     unsigned int a;
     while ( --t != 0 )   
                        {                               
        for (a=0;a<=600;a++);
      }
   }

        void DELAY_1s(int t)
                {
                        unsigned long int a,b,c,d,e,f,g;
                        a=60000*t;
                        b=60000*t;
                        c=60000*t;
                        d=60000*t;
                        e=60000*t;
                        f=60000*t;
                        g=60000*t;
                        while(1)
                        {
                                a--;
        b--;
                                c--;
                                d--;
                                e--;
                                f--;
                                g--;                               
                                if(seyFlag==1||g==0)
                                {
                                        led        = !led;
                                        seyFlag=0;
                                  return;
                                }
                        }
                }

        void Int1_Routine(void) interrupt 2
                        {
                                    //led        = !led;
                        seyFlag=1;
                        }

        void main()
        {
               
                P3M0 = 0x20;
                P3M1 = 0x00;       

                        IT1 = 1;
                        EX1 = 1;
                        EA = 1;
          
                while(1)
                {
                  if(seyFlag        ==        1)
                        {       
                                DELAY_MS(10);
                                led        = 1;
                               
                                if (k1==0)
                           {
                                 if (k2==1)
                                        {
                                                if (k3==1)
                                                 {
                                                         DELAY_1s(5);
                                                        }
                                                 
                                                else if(k3==0)
                                            {
                                                                DELAY_1s(10);
                                                        }
                                       
                                        }
                                }
                        }
                }
        }
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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