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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2797|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)按鍵調(diào)光程序,調(diào)光正常,但就是不能關(guān)燈

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:585365 發(fā)表于 2019-10-17 19:36 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include "reg52.h"                //此文件中定義了單片機(jī)的一些特殊功能寄存器

typedef unsigned int u16;          //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
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;//選擇為定時(shí)器1模式,工作方式1,僅用TR1打開啟動(dòng)。

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

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

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();  //定時(shí)器1初始化
        while(1)
        {
                        if(k3==0)
                        {
                          delayms(10);
                                if(k3==1)
                                        a++;
                                if(a>1)
                                        a=0;
                        }
                                switch(a)        
                {
                        case(0): tiaoguang() ;break;//恢復(fù)亮度
                        case(1): led=0 ;break;//熄滅LED

                }        
        }               
}


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

}
程序運(yùn)行的時(shí)候不能關(guān)燈,用實(shí)驗(yàn)板進(jìn)行實(shí)驗(yàn)的,調(diào)光正常,但就是不能關(guān)燈,不明白哪里錯(cuò)了,像大神們請(qǐng)教下

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

板凳
ID:138097 發(fā)表于 2019-10-18 08:09 | 只看該作者
PWM好像就是無法關(guān)燈,以前我也關(guān)不了。你可以調(diào)節(jié)PWM的頻率使其關(guān)燈啊,調(diào)到最小不是和關(guān)燈一個(gè)現(xiàn)象嗎
回復(fù)

使用道具 舉報(bào)

地板
ID:616759 發(fā)表于 2019-10-18 09:00 | 只看該作者
變量的定義最好賦初值,然后你的k3==1的時(shí)候的按鍵抖動(dòng)延時(shí)沒有設(shè),看你k1,k2的抖動(dòng)延時(shí)也沒有設(shè),除了這些暫時(shí)還沒看出有什么不妥當(dāng)?shù)牡胤剑饕覍?duì)中斷這個(gè)定義不熟,沒辦法通篇理解程序
回復(fù)

使用道具 舉報(bào)

5#
ID:259898 發(fā)表于 2019-10-18 10:07 | 只看該作者
按鍵要延時(shí)抖動(dòng)
回復(fù)

使用道具 舉報(bào)

6#
ID:259898 發(fā)表于 2019-10-18 10:08 | 只看該作者
按鍵要延時(shí)抖動(dòng)
回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

9#
ID:140489 發(fā)表于 2019-11-4 15:29 | 只看該作者
  1. //短按開關(guān)燈,開燈狀態(tài)下,長(zhǎng)按調(diào)光         2019/10/22 調(diào)試完成
  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   //短按去抖動(dòng)延時(shí)的時(shí)間
  10. #define const_key_time2 2000  //長(zhǎng)按延時(shí)的時(shí)間

  11. uint uiKeyTimeCnt1=0; //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器
  12. uint uiKeyTimeCnt2=0; //調(diào)光速度變量
  13. uint uiKeyTimeCnt3=0; //調(diào)光速度變量
  14. uchar ucKeyLock1=0;   //按鍵觸發(fā)后自鎖的變量標(biāo)志
  15. uchar pwm_t;              //pwm周期
  16. bit flag;                      //調(diào)光加減標(biāo)志
  17. uchar pwm_led_val = 50;//LED占空比值
  18. bit flag1;                                //開關(guān)燈標(biāo)志
  19. bit flag2;                                //短按觸發(fā)標(biāo)志
  20. bit flag3;                                //長(zhǎng)按調(diào)光啟停標(biāo)志

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

  25.                 ucKeyLock1=0;   //按鍵自鎖標(biāo)志清零
  26.                 uiKeyTimeCnt1=0;//按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器清零,此行非常巧妙,是我實(shí)戰(zhàn)中摸索出來的。
  27.                 flag3=0;                //長(zhǎng)按松手,停止調(diào)光
  28.                 if(flag2 == 1)        //短按觸發(fā)標(biāo)志
  29.                 {
  30.                         flag2=0;
  31.                         flag1 = !flag1;//開關(guān)燈標(biāo)志,松手后才開燈
  32.                 }
  33.        
  34.         }
  35.         else if(ucKeyLock1==0)//按鍵按下,且是第一次感應(yīng)
  36.         {       
  37.                 ++uiKeyTimeCnt1;  //延時(shí)計(jì)數(shù)器
  38.                 if(uiKeyTimeCnt1>const_key_time1)//短按
  39.                 {       
  40.                         flag2 = 1;//
  41.                         OUT= OUT1=0; //按下就把燈打開
  42.                 }               
  43.                 if(uiKeyTimeCnt1>const_key_time2)//長(zhǎng)按
  44.                 {
  45.                        
  46.                         flag2=0;                //清除短按標(biāo)志
  47.                         ucKeyLock1=1; //自鎖按鍵置位,避免一直觸發(fā)
  48.        
  49.                         uiKeyTimeCnt1=0;
  50.        
  51.                         flag3=1;  //啟動(dòng)調(diào)光
  52.                        
  53.                 }
  54.         }
  55.        
  56. //------------------調(diào)光-----------------------       
  57.         if(flag3)
  58.         {
  59.                 ++uiKeyTimeCnt2;  //延時(shí)計(jì)數(shù)器
  60.                 if(uiKeyTimeCnt2==100)
  61.                 {
  62.                         uiKeyTimeCnt2=0;
  63. //                        ++uiKeyTimeCnt3;
  64. //                        if(uiKeyTimeCnt3==10)//10ms調(diào)一步,此處調(diào)節(jié)調(diào)光速度,值越大,調(diào)光越慢
  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可以調(diào)滅
  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;        //設(shè)置定時(shí)器模式 8為自動(dòng)重裝
  97.         TL0 = 0xF7;                //設(shè)置定時(shí)初值        10us   @11.0592M
  98.         TH0 = 0xF7;                //設(shè)置定時(shí)重載值
  99.     EA=1;//開總中斷
  100.     ET0=1;//開定時(shí)器0中斷
  101.     TR0=1;//啟動(dòng)定時(shí)器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;  //延時(shí)計(jì)數(shù)器
  123. //                if(uiKeyTimeCnt2==100)
  124. //                {
  125. //                        uiKeyTimeCnt2=0;
  126. //                        ++uiKeyTimeCnt3;
  127. //                        if(uiKeyTimeCnt3==10)//10ms調(diào)一步,此處調(diào)節(jié)調(diào)光速度,值越大,調(diào)光越慢
  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可以調(diào)滅
  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. }
復(fù)制代碼
看我這個(gè)程序,你就知道怎么關(guān)燈了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩国产一区二区三区 | 激情国产视频 | 精品不卡| 久久久精品视频免费看 | 国产91av视频在线观看 | 9久9久9久女女女九九九一九 | 免费国产一区二区视频 | 成人一区二区三区在线 | 一级电影免费看 | 岛国在线免费观看 | 日韩精品在线一区 | 国产一区二区在线免费 | 欧美一区二区三区在线观看视频 | 精品久久久久久久久久久久久 | 国产成人精品免费视频大全最热 | 高清一区二区三区 | 久久久久久久一区 | 在线免费观看成年人视频 | 一本一道久久a久久精品蜜桃 | 国产精品美女久久久久aⅴ国产馆 | 夜夜爽99久久国产综合精品女不卡 | 欧美乱大交xxxxx另类电影 | 国产超碰人人爽人人做人人爱 | 日韩电影免费观看中文字幕 | 亚洲欧美久久 | 色婷婷av久久久久久久 | 国产 日韩 欧美 在线 | 国产一区 | 国产欧美一区二区三区国产幕精品 | 久草在线免费资源 | 亚洲国产精品99久久久久久久久 | 亚洲国产成人精品女人久久久野战 | 欧美成人激情 | 99久久成人 | 国产免费观看视频 | 久久精品国产一区二区三区不卡 | 精品成人69xx.xyz | 久久69精品久久久久久久电影好 | 911网站大全在线观看 | 国产精品三级 | 中文区中文字幕免费看 |