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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機不同按鍵控制不同IO口輸出驅動三極管遇到難題

[復制鏈接]
跳轉到指定樓層
樓主
4個按鍵  K1 K2 K3 K4 ,其中 K1是開啟和暫停鍵(本來想長按開顯示短按啟動定時器 新手還沒這么去編程),K2 K3 K4 按鍵每個按鍵下可以選擇工作時長:按一下能切 5分鐘 10分鐘 15分鐘  K2對應一個IO口驅動三極管 K3K4都是一樣的(工作時長略微不同而已)。 現在遇到的問題點是, 1.K2選好時間檔位,我按下K1開關/暫停 鍵,正常運行倒計時,時間沒到00能正常啟動/暫停,到00了選其他時間檔位就不能正常啟動了倒計時。。。2.K2控制的輸出IO口置高,然后其他2個輸出口為0,但是實際編出來的效果是暫停了 K2控制的IO口還是輸出高。。。不同按鍵單獨控制一個IO口 暫停時關閉,啟動是打開,思路是有,但是C語音編程就是沒效果。。。一直查資料2天了沒進展,附上 按鍵和定時器的編碼

單片機源程序如下:
void Key_Event_Handle()  
{
                if((K1==0)&&(munite_counts!=0))     
                                                {
                                                        DelayMS(10);
                                                        if(K1==0)
                                                        {
                                                                while(!K1);
                                                                ET0=~ET0;
                                                                TR0=~TR0;
                                                        /*        if((flag==1)&&(TR0==1))
                                                                {
                                                                        flag=0;
                                                                        SONIC=1;
                                                                        HEAT=0;
                                                                        UV=0;
                                                                }
                                                                if((flag1==1)&&(TR0==1))
                                                                {
                                                                        flag1=0;
                                                                        SONIC=0;
                                                                        HEAT=1;
                                                                        UV=0;
                                                                }        
                                                                if((flag2==1)&&(TR0==1))
                                                                {
                                                                        flag2=0;
                                                                        SONIC=0;
                                                                        HEAT=0;
                                                                        UV=1;
                                                                }        */        
                                                        }        
                                                }
               
                if(K2==0)
                {
                        DelayMS(10);
                                if(K2==0)
                                {
                                 flag=1;
                                        flag1=0;
                                        flag2=0;
                                                K2num++;           
                                                while(!K2);  
                                                K3num=0;
                                                K4num=0;
                                //                ET0=0;
                                        //        TR0=0;

                                                if(K2num==1)
                                                {
                                                        munite_counts=3;
                                                        Second_Counts=0;
                                                }
                                                if(K2num==2)                         //
                                                {
                                                        munite_counts=10;
                                                }
                                                if(K2num==3)                 //
                                                {
                                                        munite_counts=15;
                                                }
                                                if(K2num==4)                 //
                                                {
                                                        munite_counts=20;
                                                }
                                                if(K2num==5)                         //
                                                {
                                                        K2num=0;
                                                        munite_counts=2;
                                                }
                                        }
                                Key_Flag_Idx=0;
                                        i=0;
                        }        
               
                if(K3==0)
                {
                        DelayMS(10);  
                                if(K3==0)
                                {
                                        flag=0;
                                        flag1=1;
                                        flag2=0;
                                                K3num++;         
                                                while(!K3);
                                                K2num=0;
                                                K4num=0;
                                                //ET0=0;
                                                //TR0=0;

                                                if(K3num==1)  
                                                {
                                                        munite_counts=2;
                                                        Second_Counts=0;
                                                }
                                                if(K3num==2)                         //
                                                {
                                                        munite_counts=10;
                                                }
                                                if(K3num==3)                 //
                                                {
                                                        munite_counts=20;
                                                }
                                                if(K3num==4)                         //
                                                {
                                                        munite_counts=30;
                                                }
                                                if(K3num==5)                         //
                                                {
                                                        K3num=0;
                                                        munite_counts=3;
                                                }
                                }
                                Key_Flag_Idx=0;
                                i=0;
                        }
                                
                if(K4==0)
                        {
                        DelayMS(10);
                                if(K4==0)
                                {
                                        flag=0;
                                        flag1=0;
                                        flag2=1;
                                while(!K4);
                                                K2num=0;
                                                K3num=0;
                                //ET0=0;
                                //TR0=0;
                                munite_counts=1;
                                        Second_Counts=0;
                                }
                                Key_Flag_Idx=0;
                                i=0;
                        }
}


void DSY_Refresh() interrupt 1
{
        TH0=(65536-5000)/256;
        TL0=(65536-5000)%256;
        i++;
        if(i==2)  
        {
                i=0;
                Second_Counts++;                        
                if(Second_Counts==60)
                {
                        Second_Counts=0;
                        munite_counts--;
                        if(munite_counts==0)
                        {
                                TR0=0;
                        }
                }
        }
}

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

使用道具 舉報

沙發
ID:10947 發表于 2020-7-24 14:39 | 只看該作者
感覺1個定時器就可以了吧
回復

使用道具 舉報

板凳
ID:451718 發表于 2020-7-24 15:34 | 只看該作者
TR0=0; 這個操作最好少用,定時器一旦啟用,就讓它運行下去。 你這樣隨手關掉, 下次再啟用的時候,你能保證初值沒有溢出么?     而且,你這個是在定時器中斷里面 做這樣的操作。  定時器都不動了,外面的程序如何判斷計時。
回復

使用道具 舉報

地板
ID:799716 發表于 2020-7-24 16:08 | 只看該作者
現在不會如何檢驗K2按下打開超聲,K3按下打開加熱,K4按下 打開智能模式。。一個按鍵只打開一個功能
回復

使用道具 舉報

5#
ID:799716 發表于 2020-7-24 16:11 | 只看該作者
lfc315 發表于 2020-7-24 14:39
感覺1個定時器就可以了吧

我如何設計 K2按下打開加熱功能,K3按下打開另外一種功能(加熱功能關閉),K4按下再打開另外一種功能(其他功能關閉)。有思路,就是哪個鍵按下 就寫個標記位置1,但是切到別的按鍵思路就不清晰了
回復

使用道具 舉報

6#
ID:213173 發表于 2020-7-24 22:19 | 只看該作者
k1啟動/暫停,k2~k4  3路獨立倒計時,數碼管16進制顯示 t  x  x  x,P1.0~P1.2低電平輸出,全部到0恢復初始狀態。
  1. #include  <reg51.h>
  2. #define  uchar  unsigned  char
  3. #define  uint unsigned int
  4. #define duan P0

  5. sbit k1=P2^4;
  6. sbit k2=P2^5;
  7. sbit k3=P2^6;
  8. sbit k4=P2^7;
  9. sbit OUT1=P1^0;
  10. sbit OUT2=P1^1;
  11. sbit OUT3=P1^2;

  12. uchar code table[]={//共陽數碼管段碼"0~f-."
  13.                 0xc0,0xf9,0xa4,0xb0,
  14.                 0x99,0x92,0x82,0xf8,
  15.                 0x80,0x90,0x88,0x83,
  16.                 0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
  17. uchar data dis_buf[4];
  18. uchar a,b,c,d;
  19. uint count;
  20. bit sign;
  21. bit flag;
  22. uint num=0,num1=0,num2=0,num3=0;


  23. void delay(uint t)
  24. {        
  25.         uint i,j;
  26.         for(i=t;i>0;i--)
  27.                 for(j=112;j>0;j--);
  28. }
  29. void InitTimer0(void)
  30. {
  31.     TMOD = 0x01;
  32.     TH0 = 0x3C;
  33.     TL0 = 0xB0;
  34.     EA = 1;
  35.     ET0 = 1;
  36.     TR0 = 1;
  37. }
  38. void display()
  39. {
  40.         if(flag)
  41.                 dis_buf[0]=0x87;
  42.         else
  43.                 dis_buf[0]=0xbf;
  44.         dis_buf[1]=table[b];
  45.         dis_buf[2]=table[c];
  46.         dis_buf[3]=table[d];

  47.         P2&=0xf0;//位清0
  48.         P2|=0x01<<num;
  49.         duan=dis_buf[num];//送段碼
  50.         num++;
  51.         num%=4;
  52. }

  53. void main()
  54. {
  55.     InitTimer0();
  56.         while(1)
  57.         {
  58.                 if(!k1 || !k2 || !k3 || !k4)
  59.                 {
  60.                         count++;//消抖計數
  61.                         if(count>=10 && sign==0)
  62.                         {
  63.                                 sign=1;//鎖定鍵態
  64.                                 if(!k1){flag=~flag;}
  65.                                 if(!k2){b=b+5;if(b>15)b=0;}
  66.                                 if(!k3){c=c+5;if(c>15)c=0;}
  67.                                 if(!k4){d=d+5;if(d>15)d=0;}
  68.                         }
  69.                 }         
  70.                 else{count=0;sign=0;}
  71.                 if(b!=0)OUT1=0;else OUT1=1;
  72.                 if(c!=0)OUT2=0;else OUT2=1;
  73.                 if(d!=0)OUT3=0;else OUT3=1;
  74.                 display();
  75.                 delay(1);//控制主循環周期約1ms
  76.         }
  77. }
  78. void Timer0Interrupt(void) interrupt 1
  79. {
  80.     TH0 = 0x3C;
  81.     TL0 = 0xB0;
  82.         if(flag)
  83.         {
  84.                 if(b!=0)
  85.                 {
  86.                         num1++;       
  87.                         if(num1>=1200)
  88.                         {
  89.                                 num1=0;
  90.                                 b--;
  91.                         }
  92.                 }
  93.                 if(c!=0)
  94.                 {
  95.                         num2++;       
  96.                         if(num2>=1200)
  97.                         {
  98.                                 num2=0;
  99.                                 c--;
  100.                         }
  101.                 }
  102.                 if(d!=0)
  103.                 {
  104.                         num3++;       
  105.                         if(num3>=1200)
  106.                         {
  107.                                 num3=0;
  108.                                 d--;
  109.                         }
  110.                 }
  111.                 if(b==0&&c==0&&d==0)
  112.                         flag=0;
  113.         }
  114. }
復制代碼







回復

使用道具 舉報

7#
ID:799716 發表于 2020-7-25 08:28 | 只看該作者
wulin 發表于 2020-7-24 22:19
k1啟動/暫停,k2~k4  3路獨立倒計時,數碼管16進制顯示 t  x  x  x,P1.0~P1.2低電平輸出,全部到0恢復初始 ...

感謝指導,昨天晚上我也想了,用一個標記來判斷哪個鍵按下,看到你的 : 按鍵狀態鎖定 這個說明后 明朗了 我再繼續學習
回復

使用道具 舉報

8#
ID:799716 發表于 2020-7-25 15:40 | 只看該作者
void Key_Event_Handle(void)                                                 /按鍵處理函數
{
        if(!K1||!K2||!K3||!K4)                                                                                        
        {
                count++;                                                                //消抖
                if(count>=10&&sign==0)
                {
                        sign=1;                                                                //按鍵狀態鎖定
                        if(!K1){flag=~flag;}
                        if(!K2)
                        {
                                K2NUM++;
                                K3NUM=0;
                                K4NUM=0;
                                if(K2NUM>4)K2NUM=1;
                                switch(K2NUM)
                                {
                                case 1:
                                        time_counts=60;                        //60s工作時間               
                                break;
                               
                                case 2:
                                        time_counts=120;
                                break;
                               
                                case 3:
                                        time_counts=180;
                                break;
                               
                                case 4:
                                        time_counts=660;
                                break;
                                }                                                       
                        }
                if(!K3)
                        {
                                K3NUM++;
                                K2NUM=0;
                                K4NUM=0;
                                if(K3NUM>4)K3NUM=1;
                                switch(K3NUM)
                                        {
                                        case 1:
                                                time_counts=120;                                               
                                        break;
                                       
                                        case 2:
                                                time_counts=180;
                                        break;
                                       
                                        case 3:
                                                time_counts=240;
                                        break;
                                       
                                        case 4:
                                                time_counts=1320;
                                        break;
                                        }
                        }
               
                if(!K4)
                        {
                                K4NUM++;
                                K2NUM=0;
                                K3NUM=0;
                                time_counts=900;                                                                                               
                        }
                }
        }
                else{count=0;sign=0;}
                if((K2NUM!=0)&&(flag==1)||(K4NUM!=0)&&(flag==1)&&(time_counts<=840))SONIC=1;else SONIC=0;
                if((K3NUM!=0)&&(flag==1)||(K4NUM!=0)&&(flag==1)&&(time_counts<=840))UV=1;else UV=0;
                if((K4NUM!=0)&&(flag==1)&&(time_counts>=840))HEAT=1;else HEAT=0;
}
今天調試出來了,K2 K3 K4能選不同檔位工作時間,IO孔輸出控制也正常了,我是檢測到按鍵按下 就讓K2NUM K3NUM K4NUM計數,誰的計數不為零就判斷哪個按鍵按下。。。。(不知道對不對)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: а_天堂中文最新版地址 | 欧美五月婷婷 | 全部免费毛片在线播放网站 | 色婷婷狠狠| 中文字幕一区二区三区日韩精品 | 黄色片a级 | 国产精品久久久久久吹潮日韩动画 | 亚洲免费视频网址 | 精品美女久久久 | 天天操天天操 | 欧洲尺码日本国产精品 | 亚洲不卡av在线 | 99色在线| 国产精品国产a级 | 精品欧美一区二区精品久久久 | 国产成人免费 | 成人精品国产免费网站 | 日韩综合在线 | 国产视频久久 | 婷婷综合 | 久久专区 | 麻豆av片 | av手机在线 | 精品一区二区在线观看 | 天天操天天射综合网 | 中文字幕一区二区三区乱码在线 | 国产精品免费大片 | 日韩精品视频在线 | 成人一区av偷拍 | 国产精品一区二区电影 | 热久久免费视频 | 成人久久| 成人做爰www免费看视频网站 | 久久久久久免费毛片精品 | 毛片大全 | 国产成人免费网站 | 亚洲精品在线视频 | 国产一区二区三区在线 | 黄色在线观看网址 | 欧美成人一区二区三区 | 日韩免费网站 |