久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2769|回復: 8
打印 上一主題 下一主題
收起左側

單片機按鍵調光程序,調光正常,但就是不能關燈

[復制鏈接]
跳轉到指定樓層
樓主
ID:585365 發表于 2019-10-17 19:36 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include "reg52.h"                //此文件中定義了單片機的一些特殊功能寄存器

typedef unsigned int u16;          //對數據類型進行聲明定義
typedef unsigned char u8;

sbit k1=P1^0;
sbit k2=P1^1;
sbit led=P0^0;
sbit k3=P1^2;
u16 count,value,timer1;

void delayms(u16 ms)
{
        int i,j;
        for(i=ms;i>0;i--)
                for(j=110;j>0;j--);
}
void Timer1Init()
{
        TMOD|=0X10;//選擇為定時器1模式,工作方式1,僅用TR1打開啟動。

        TH1 = 0xFF;
        TL1 = 0xff;   //1us

        ET1=1;//打開定時器1中斷允許
        EA=1;//打開總中斷
        TR1=1;//打開定時器                        
}

void tiaoguang()
{
if(count>100)                                                        
                {  
                        count=0;
                        if(k1==0)                                //DIR控制增加
                        {
                          value++;
                        }                        
                        if(k2==0)
                        {
                          value--;
                        }

                }                                                                                                                                    

                if(value>=990)
                {
                 value=990;
                }
                if(value<=10)
                {
                  value=10;
                }            

                if(timer1>1000)  //PWM周期為1000*1us
                {
                        timer1=0;
                }

                if(timer1 <value)        
                {
                        led=1;               
                }
                else
                {
                        led=0;
                }        
}



void main()
{        
        u8 a;
        Timer1Init();  //定時器1初始化
        while(1)
        {
                        if(k3==0)
                        {
                          delayms(10);
                                if(k3==1)
                                        a++;
                                if(a>1)
                                        a=0;
                        }
                                switch(a)        
                {
                        case(0): tiaoguang() ;break;//恢復亮度
                        case(1): led=0 ;break;//熄滅LED

                }        
        }               
}


void Time1(void) interrupt 3    //3 為定時器1的中斷號  1 定時器0的中斷號 0 外部中斷1 2 外部中斷2  4 串口中斷
{
        TH1 = 0xFF;
        TL1 = 0xff;   //1us
        timer1++;
    count++;

}
程序運行的時候不能關燈,用實驗板進行實驗的,調光正常,但就是不能關燈,不明白哪里錯了,像大神們請教下

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:213173 發表于 2019-10-18 06:56 | 只看該作者
錯誤1.k3是控制亮滅,你不可能在10ms內做到if(k3==0)--delayms(10)--if(k3==1),所以不可能有a++;
錯誤2.定時器1中斷設置1us,但是完成中斷內指令需要16us,CPU沒有時間正常執行主循環任務
回復

使用道具 舉報

板凳
ID:138097 發表于 2019-10-18 08:09 | 只看該作者
PWM好像就是無法關燈,以前我也關不了。你可以調節PWM的頻率使其關燈啊,調到最小不是和關燈一個現象嗎
回復

使用道具 舉報

地板
ID:616759 發表于 2019-10-18 09:00 | 只看該作者
變量的定義最好賦初值,然后你的k3==1的時候的按鍵抖動延時沒有設,看你k1,k2的抖動延時也沒有設,除了這些暫時還沒看出有什么不妥當的地方,主要我對中斷這個定義不熟,沒辦法通篇理解程序
回復

使用道具 舉報

5#
ID:259898 發表于 2019-10-18 10:07 | 只看該作者
按鍵要延時抖動
回復

使用道具 舉報

6#
ID:259898 發表于 2019-10-18 10:08 | 只看該作者
按鍵要延時抖動
回復

使用道具 舉報

7#
ID:585365 發表于 2019-10-27 09:31 | 只看該作者
更正,經過調試,如果想要按k3關閉led的燈光可以將主程序判斷k3==1處改為k3==0 如下:
void main()
{        
        u8 a;
        Timer1Init();  //定時器1初始化
        while(1)
        {
                        if(k3==0)
                        {
                          delayms(10);
                                if(k3==0)
                                        a++;
                                if(a>1)
                                        a=0;
                        }
                                switch(a)        
                {
                        case(0): tiaoguang() ;break;//恢復亮度
                        case(1): led=0 ;break;//熄滅LED

                }        
        }               
}
現在還有一個問題是,在調暗led燈是在20%的亮度左右會閃爍。我看了下有人說做進中斷里就可以解決。但不太了解運行的方式(程序)
望各位可以指導一下。謝謝
回復

使用道具 舉報

8#
ID:585365 發表于 2019-10-27 09:31 | 只看該作者
在硬件上,開關是做了處理的了,程序里就不在寫延時了
回復

使用道具 舉報

9#
ID:140489 發表于 2019-11-4 15:29 | 只看該作者
  1. //短按開關燈,開燈狀態下,長按調光         2019/10/22 調試完成
  2. #include<reg51.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit OUT=P1^1;//  P1.1輸出pwm
  6. sbit OUT1=P1^2;//  P1.1輸出pwm
  7. //sbit LED3=P1^7;//  

  8. sbit KEY1 = P3^0;

  9. #define const_key_time1 100   //短按去抖動延時的時間
  10. #define const_key_time2 2000  //長按延時的時間

  11. uint uiKeyTimeCnt1=0; //按鍵去抖動延時計數器
  12. uint uiKeyTimeCnt2=0; //調光速度變量
  13. uint uiKeyTimeCnt3=0; //調光速度變量
  14. uchar ucKeyLock1=0;   //按鍵觸發后自鎖的變量標志
  15. uchar pwm_t;              //pwm周期
  16. bit flag;                      //調光加減標志
  17. uchar pwm_led_val = 50;//LED占空比值
  18. bit flag1;                                //開關燈標志
  19. bit flag2;                                //短按觸發標志
  20. bit flag3;                                //長按調光啟停標志

  21. void keyscan()
  22. {
  23.         if(KEY1==1)        //按鍵沒按下 要及時清零一些標志
  24.         {

  25.                 ucKeyLock1=0;   //按鍵自鎖標志清零
  26.                 uiKeyTimeCnt1=0;//按鍵去抖動延時計數器清零,此行非常巧妙,是我實戰中摸索出來的。
  27.                 flag3=0;                //長按松手,停止調光
  28.                 if(flag2 == 1)        //短按觸發標志
  29.                 {
  30.                         flag2=0;
  31.                         flag1 = !flag1;//開關燈標志,松手后才開燈
  32.                 }
  33.        
  34.         }
  35.         else if(ucKeyLock1==0)//按鍵按下,且是第一次感應
  36.         {       
  37.                 ++uiKeyTimeCnt1;  //延時計數器
  38.                 if(uiKeyTimeCnt1>const_key_time1)//短按
  39.                 {       
  40.                         flag2 = 1;//
  41.                         OUT= OUT1=0; //按下就把燈打開
  42.                 }               
  43.                 if(uiKeyTimeCnt1>const_key_time2)//長按
  44.                 {
  45.                        
  46.                         flag2=0;                //清除短按標志
  47.                         ucKeyLock1=1; //自鎖按鍵置位,避免一直觸發
  48.        
  49.                         uiKeyTimeCnt1=0;
  50.        
  51.                         flag3=1;  //啟動調光
  52.                        
  53.                 }
  54.         }
  55.        
  56. //------------------調光-----------------------       
  57.         if(flag3)
  58.         {
  59.                 ++uiKeyTimeCnt2;  //延時計數器
  60.                 if(uiKeyTimeCnt2==100)
  61.                 {
  62.                         uiKeyTimeCnt2=0;
  63. //                        ++uiKeyTimeCnt3;
  64. //                        if(uiKeyTimeCnt3==10)//10ms調一步,此處調節調光速度,值越大,調光越慢
  65.                         {

  66.                                  uiKeyTimeCnt3=0;
  67.                      if(flag == 0)
  68.                       {
  69.        
  70.                          if(pwm_led_val < 100)
  71.        
  72.                           {
  73.                               pwm_led_val++;        //亮度變暗
  74.        
  75.                               if(pwm_led_val==99)//此處賦值100可以調滅
  76.                                   flag = 1;
  77.                           }
  78.                       }
  79.        
  80.                       if( flag ==1 )
  81.                       {
  82.                           if(pwm_led_val > 0)
  83.                           {
  84.                               pwm_led_val--;        //亮度變亮
  85.                               if(pwm_led_val==0)//
  86.                                   flag = 0;
  87.                           }
  88.                       }               
  89.                          }
  90.                 }
  91.         }
  92.        
  93. }


  94. void main()
  95. {
  96.         TMOD |= 0x02;        //設置定時器模式 8為自動重裝
  97.         TL0 = 0xF7;                //設置定時初值        10us   @11.0592M
  98.         TH0 = 0xF7;                //設置定時重載值
  99.     EA=1;//開總中斷
  100.     ET0=1;//開定時器0中斷
  101.     TR0=1;//啟動定時器0
  102. //        LED3=0;
  103.     while(1)
  104.     {
  105.                 keyscan();
  106.     }                        
  107. }

  108. void tim0() interrupt 1
  109. {
  110.         if(flag1)

  111.         {
  112.                 pwm_t++;
  113.                 if(pwm_t==100)//周期1ms   頻率1000Hz
  114.                 {pwm_t=0;}
  115.                 if( pwm_led_val < pwm_t )
  116.                 {OUT = 0; OUT1 = !OUT;}
  117.                 else {OUT=1; OUT1 = !OUT;}
  118.         }
  119.         else OUT=OUT1=1;

  120. //        if(flag3)
  121. //        {
  122. //                ++uiKeyTimeCnt2;  //延時計數器
  123. //                if(uiKeyTimeCnt2==100)
  124. //                {
  125. //                        uiKeyTimeCnt2=0;
  126. //                        ++uiKeyTimeCnt3;
  127. //                        if(uiKeyTimeCnt3==10)//10ms調一步,此處調節調光速度,值越大,調光越慢
  128. //                        {
  129. //
  130. //                                 uiKeyTimeCnt3=0;
  131. //                     if(flag == 0)
  132. //                      {
  133. //       
  134. //                         if(pwm_led_val < 100)
  135. //       
  136. //                          {
  137. //                              pwm_led_val++;        //亮度變暗
  138. //       
  139. //                              if(pwm_led_val==99)//此處賦值100可以調滅
  140. //                                  flag = 1;
  141. //                          }
  142. //                      }
  143. //       
  144. //                      if( flag ==1 )
  145. //                      {
  146. //                          if(pwm_led_val > 0)
  147. //                          {
  148. //                              pwm_led_val--;        //亮度變亮
  149. //                              if(pwm_led_val==0)//
  150. //                                  flag = 0;
  151. //                          }
  152. //                      }               
  153. //                         }
  154. //                }
  155. //        }

  156. }
復制代碼
看我這個程序,你就知道怎么關燈了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一一在线 | 91极品尤物在线播放国产 | 日韩一区二区在线视频 | 欧美一级视频在线观看 | 国产精品一二区 | 免费国产视频在线观看 | 国产乱码久久久久久 | 精品二区 | 日韩久久久久 | 久久网亚洲 | 久草视频观看 | 久久婷婷国产麻豆91 | 国产精品一区在线 | 日日躁狠狠躁aaaaxxxx | 日韩成人免费视频 | 日日夜夜天天 | 欧美a∨ | 91久久国产综合久久 | 欧洲视频一区二区 | 欧美激情欧美激情在线五月 | 成人国产午夜在线观看 | 精品一二区 | 亚洲精品一区二区网址 | 国产精品一区二区久久 | 综合视频在线 | 国产男女视频 | 日韩欧美中文在线 | 99久久久久久 | 久久精品色视频 | 天堂中文字幕av | 在线观看国产精品一区二区 | 成人av网站在线观看 | 狠狠撸在线视频 | 免费在线日韩 | 黄色毛片在线观看 | 精品亚洲视频在线 | 国产精品亚洲一区二区三区在线 | 精品av久久久久电影 | 日操夜操 | 欧美在线视频免费 | 国产日韩欧美激情 |