找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1292|回复: 8
打印 上一主题 下一主题
收起左侧

单片机DIY,无法实现用开关进行LED灯色温切换,不知问题出在哪里? 附程序

[复制链接]
跳转到指定楼层
楼主
想利用墙上开关进行开--关切换LED灯的色温,第一次开白光亮,第二次开黄光亮,第三次开白光黄光同时亮。程序借鉴了论坛大佬上传的。但好像实现不了,无法切换!

单片机源程序如下:
#include<reg51.h>       //*使用S0P-8 STC15F104W芯片*//
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

uint key2_time_cnt;//*按键去抖计数器*//
uchar key2_lock;//*按键有效标志*//
uchar key2_num_s;//*开关开关有多少种功能*//
char key2_touch_s_flag;//*交流电断电有效标志*//
uint shuzi;//*开关次数
uchar SYS1MS;//*时标开关标志*//
uchar AUXR;
sbit W=P3^4;//*白光*//
sbit C=        P3^5;//*黄光*//

sbit PWM=P3^2;//*交流信号检测*//
void Timer0Init()//*定时器0初始化*//
{
        AUXR &= 0x7F;                //定时器12T时钟模式
        TMOD &= 0xF0;                //设置定时器的模式
        TL0 = 0x00;                //*定时器初值
        TH0 = 0xDC;               
        TF0 = 0;         //清除TFO标志        
        TR0 = 1;  //定时器0开始计时                     
                                                        
        EA=1;                   //中断总开关
        ET0=1;                  //允许中断
        
                                
                        
              
}

void key_scan2()//*交流电信号的判断*//
{
if(PWM==1)
{
  key2_lock=0;
  key2_time_cnt=0;
  if(key2_touch_s_flag==1)
  {
     
      key2_touch_s_flag=0;
      key2_num_s++;
      if(key2_num_s>2)key2_num_s=0;
  }

}
else if(key2_lock==0)
{
   key2_time_cnt++;
   if(key2_time_cnt>149)
  {
     key2_touch_s_flag=1;
     key2_time_cnt=0;
     key2_lock=1;
     
  }
}
}

void key_service2()//*开关功能的内容*//
{

switch(key2_num_s)
{
  case 0:
        W=1;
        C=0;
        
  
        //key2_num_s=0;
        break;
   case 1:
       W=0;
        C=1;
               

        //key2_num_s=0;
        break;
   case 2:
        W=1;
        C=1;
                                
       // key2_num_s=0;
        break;
  
  }
  
}

void main()//*主程序*//
{
        Timer0Init();
while(1)
{
if(SYS1MS==1)
{
SYS1MS=0;
key_scan2();
}
key_service2();
}
}

void exint0()interrupt 0//*中断函数*//
{
      if((TR0&ET0)==1)
  {   
        TR0=0;
         ET0=1;
                                                
        TL0 = 0x00;        //*定时器低8位初装数值*//        
        TH0 = 0xDC;//*        定时器高8位初装值*//
                                       
            shuzi++;
            if(shuzi==2)
            {
               shuzi=0;
               SYS1MS=1;
            }
           
            
            TR0=1;
  }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2022-10-31 20:37 | 只看该作者
这个应用电路非常简单。市售的家用灯具大量使用。其基本原理就是利用开关短暂断电给单片机提供低电平信号,用以切换灯串的不同组合。单片机靠滤波电容维持短暂供电。






回复

使用道具 举报

板凳
ID:213173 发表于 2022-10-31 20:45 | 只看该作者
按上图示意,可以用 STC15F104W  P3.2外部中断做功能切换。
回复

使用道具 举报

地板
ID:161164 发表于 2022-10-31 21:52 | 只看该作者
你开了定时器的中断但没有中断函数
回复

使用道具 举报

5#
ID:123289 发表于 2022-11-1 09:18 | 只看该作者
除沙发说的用电容记忆方案外,还有用EEPROM记忆的方案:

1、用内部EEPROM做个计数器WY。WY=00,01,10,11。对应不亮,白、黄、白黄灯亮。初始WY=00。
2、每次上电后,将WY+1,如果=00,就改成01,不是00不改以防出现开关开启后灯不亮。并据之输出灯控制信号,让对应的灯亮。N秒后再将WY-1,恢复原态,这里假设N取1秒。
这样就成功了。
原理:
1、开关上电后,由于WY+1,所以会改变亮灯的状态,做到依次:白、黄、白黄。
2、N秒后将WY-1,退回原态,这样只要每次通电多于N分钟,则下次通电时,灯的状态组合就不变了。
3、如果通电时间<N秒,则WY来不及-1,恢复原状态,下次开灯必然变态了。
要点:WY用非易失性存储器。这样掉电后WY不变。

比较:
电容记忆方案:需要检测交流电是否掉电,电容储能必须保证掉电后,系统能继续工作N秒以上,节省了EEPROM。
EEPROM方案:要EEPROM就行了。

回复

使用道具 举报

6#
ID:706724 发表于 2022-11-4 11:35 | 只看该作者
wulin 发表于 2022-10-31 20:45
按上图示意,可以用 STC15F104W  P3.2外部中断做功能切换。

这个 单片机好像是上升沿或下降沿中断触发的。低电平不触发的,还没想到该怎么写中断?本人小白也
回复

使用道具 举报

7#
ID:706724 发表于 2022-11-4 11:39 | 只看该作者
lkc8210 发表于 2022-10-31 21:52
你开了定时器的中断但没有中断函数

你好,本人小白请指教一下,我后面改了:
void Timer0()interrupt 1 using 0//*¶¨ê±Æ÷ÖD¶Ïoˉêy*//
{
      if((TR0&TF0)==1)
  {   
                                TR0=0;
        TF0=0;
                                               
                                TL0 = 0x00;        //*¶¨ê±Æ÷μí8λ3õ×°êyÖμ*//       
                                TH0 = 0xDC;//*        ¶¨ê±Æ÷¸ß8λ3õ×°Öμ*//
                                       
            shuzi++;
            if(shuzi==2)
            {
               shuzi=0;
               SYS1MS=1;
            }
           
            
            TR0=1;
  }
}
回复

使用道具 举报

8#
ID:706724 发表于 2022-11-4 11:41 | 只看该作者
yzwzfyz 发表于 2022-11-1 09:18
除沙发说的用电容记忆方案外,还有用EEPROM记忆的方案:

1、用内部EEPROM做个计数器WY。WY=00,01,10, ...

感谢提供了这么好的思路,先按照电容供电这个弄,弄好了再学习EEPROM这个,实力不济啊!
回复

使用道具 举报

9#
ID:213173 发表于 2022-11-4 12:00 | 只看该作者
木示 发表于 2022-11-4 11:35
这个 单片机好像是上升沿或下降沿中断触发的。低电平不触发的,还没想到该怎么写中断?本人小白也

你真是小白,洁白无瑕,从高电平转换到低电平不就是下降沿?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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