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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機一個io口驅動發光二極管并掃描按鍵程序調試

[復制鏈接]
跳轉到指定樓層
樓主
ID:777834 發表于 2021-9-3 08:24 來自手機 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
各位大佬,這個程序怎樣寫,我按照之前的一個帖子例程反復調試都不成功,LED1在P1.5口、LED2在P1.4口,路過幫幫忙,多謝啊

IMG_20210903_081739.jpg (1.46 MB, 下載次數: 75)

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

使用道具 舉報

沙發
ID:887371 發表于 2021-9-3 10:00 | 只看該作者
平時端口設為推挽,驅動led亮或滅。
需要讀取按鍵時,端口設為弱上拉。此時按鍵如果是按下的,端口電壓為1/11*Vcc,為低電平。按鍵如果沒按下,端口電壓是LED管壓降,如果是紅燈的話,約為2V。如果要準確識別為高電平的話,Vcc應小于2.85V(2/0.7=2.85)。綠燈管壓降燒大于紅燈,情形會稍微好點。

因此,這電路要能正常工作,Vcc電壓要足夠低才行。另外在檢測按鍵時按鍵又沒按下,燈會微弱發光。
總體上這電路不是很好。
回復

使用道具 舉報

板凳
ID:332444 發表于 2021-9-3 10:18 | 只看該作者
有必要這樣做?原先的獨立按鍵一個IO就能實現2個按鍵,51與32的原理都是一樣的只是寫法不同而已。可參https://blog.csdn.net/xianfajushi/article/details/106518315
回復

使用道具 舉報

地板
ID:796531 發表于 2021-9-3 10:45 | 只看該作者
為啥要這么接 ,是否考慮I/O用開漏輸出,發光管串電阻接vcc和I/O ,開關接I/O 和地, 寫一個sbitI/O輸出高電平 發光管亮;I/O輸出低電平 ,讀取I/O實際狀態,按鍵沒按讀到高電平,按鈕按下就會讀到低電平,這樣是否可行
回復

使用道具 舉報

5#
ID:415064 發表于 2021-9-3 14:39 | 只看該作者
分時復用,在小家電很常見。led你理解呼吸燈一亮一滅的,在滅的時候檢測按鍵就行了
回復

使用道具 舉報

6#
ID:777834 發表于 2021-9-3 15:05 來自手機 | 只看該作者
wojiaoguogai 發表于 2021-9-3 14:39
分時復用,在小家電很常見。led你理解呼吸燈一亮一滅的,在滅的時候檢測按鍵就行了

你好,我按照這個調試不行,可以幫看看
回復

使用道具 舉報

7#
ID:777834 發表于 2021-9-3 15:06 來自手機 | 只看該作者
wojiaoguogai 發表于 2021-9-3 14:39
分時復用,在小家電很常見。led你理解呼吸燈一亮一滅的,在滅的時候檢測按鍵就行了

可以幫看看嗎
http://www.zg4o1577.cn/bbs/dpj-194413-1.html
這個鏈接
回復

使用道具 舉報

8#
ID:161164 發表于 2021-9-3 15:30 | 只看該作者
jianuli 發表于 2021-9-3 15:06
可以幫看看嗎
http://www.zg4o1577.cn/bbs/dpj-194413-1.html
這個鏈接

你把你的代碼完整地貼上來看看
(不要截圖!不要截圖!不要截圖!)
回復

使用道具 舉報

9#
ID:887371 發表于 2021-9-3 16:38 | 只看該作者
jianuli 發表于 2021-9-3 15:06
可以幫看看嗎
http://www.zg4o1577.cn/bbs/dpj-194413-1.html
這個鏈接

我二樓已經分析清楚了。

另外我看了http://www.zg4o1577.cn/bbs/dpj-194413-1.html鏈接的帖子,代碼OK。
要正常工作,請把Vcc電壓調到2.5V。
回復

使用道具 舉報

10#
ID:887371 發表于 2021-9-3 17:10 | 只看該作者
樓主就不能有點獨立思考的能力?正確解答擺你面前,也不會分析驗證。就只會說不成功,求指導。

尋求解決問題的正確方式:
問題背景描述
問題現象
為解決問題做了哪些嘗試?有啥效果?
回復

使用道具 舉報

11#
ID:161164 發表于 2021-9-3 17:53 來自手機 | 只看該作者
datouyuan 發表于 2021-9-3 16:38
我二樓已經分析清楚了。

另外我看了http://www.zg4o1577.cn/bbs/dpj-194413-1.html鏈接的帖子,代碼OK。 ...

二樓的分析有一個問題
就是設置完弱上拉后
端口要先置1才可以讀取輸入狀態
這時端口電壓還是1/11 VCC嗎?

Screenshot_2021-09-03-17-52-12-922_cn.wps.moffice_eng~01.jpg (184.66 KB, 下載次數: 57)

Screenshot_2021-09-03-17-52-12-922_cn.wps.moffice_eng~01.jpg
回復

使用道具 舉報

12#
ID:887371 發表于 2021-9-4 08:48 | 只看該作者
lkc8210 發表于 2021-9-3 17:53
二樓的分析有一個問題
就是設置完弱上拉后
端口要先置1才可以讀取輸入狀態

問題不大,mcu內部上拉等效電阻約為500k歐姆,對10K電阻上拉電阻影響太小了,1/11 VCC這個值沒錯。
另外端口要置1后才可以讀取輸入狀態,這是51mcu必須要的,否則端口值不是1/11 VCC了,而是接近于0V。
回復

使用道具 舉報

13#
ID:887371 發表于 2021-9-4 08:54 | 只看該作者
lkc8210 發表于 2021-9-3 17:53
二樓的分析有一個問題
就是設置完弱上拉后
端口要先置1才可以讀取輸入狀態
端口要先置1才可以讀取輸入狀態

這不是stc12le2052ad獨有的,這是所有準雙向的共有特性,包括但不限于51.
回復

使用道具 舉報

14#
ID:517951 發表于 2021-9-4 09:22 | 只看該作者
IO口帶上LED燈,還要檢測按鍵,這種操作怎么搞?按鍵拉低的時候,led燈就亮不了啦
回復

使用道具 舉報

15#
ID:887371 發表于 2021-9-4 09:33 | 只看該作者
rayin 發表于 2021-9-4 09:22
IO口帶上LED燈,還要檢測按鍵,這種操作怎么搞?按鍵拉低的時候,led燈就亮不了啦

圖上按鍵串聯了電阻,按鍵拉低的時候,不會影響led。
回復

使用道具 舉報

16#
ID:491577 發表于 2021-9-6 11:45 | 只看該作者
本帖最后由 hhh402 于 2021-9-6 11:54 編輯

樓主的電路有問題,10K電阻是來搗蛋的要去掉,接按鍵的電阻1K改為2.2k,想點亮LED就推挽輸出高電平,想檢測按鍵時設置成雙向模式,讀到0就是有按鍵按下。按鍵按下不會影響到LED.
回復

使用道具 舉報

17#
ID:777834 發表于 2021-9-14 20:00 | 只看該作者
#include <reg52.h>
#include<intrins.h>

sfr P1M0  = 0x91;
sfr P1M1  = 0x92;

sbit LED1 = P1^4;        //LED端口聲明
sbit LED2 = P1^5;
sbit LED3 = P1^6;
sbit LED4 = P1^7;

unsigned char KeySec=0;//鍵值變量

/**********************************
  1ms延時程序
**********************************/
void Delay1ms()                //@12.000MHz
{
        unsigned char i, j;

        _nop_();
        _nop_();
        i = 12;
        j = 168;
        do
        {
                while (--j);
        } while (--i);
}
/**********************************
        按鍵掃描程序
**********************************/
void key_scan()
{
        static unsigned char count=0;//靜態計數變量
        static bit sign_key=0;                        //靜態標志位
        unsigned char time_key,time_LED;//臨時變量

        time_LED=P1&0xf0;//保存4個LED狀態
        P1M0=0xf0;//P1.4~7設置弱上拉
        P1M1=0x00;//P1.4~7設置弱上拉
        P1|=0xf0; //P1.4~7置高電平        
        if(P1&0xf0!=0xf0)//有鍵按下
        {
                if(++count>=10 && sign_key==0)//消抖
                {
                        sign_key=1;//自鎖
                        time_key=P1&0xf0;//保存P1.4~7狀態
                        switch(time_key)
                        {
                                case 0xe0: KeySec=1; break;//輸出鍵值
                                case 0xd0: KeySec=2; break;
                                case 0xb0: KeySec=3; break;
                                case 0x70: KeySec=4; break;
                        }
                }
        }
        else //抬起
        {
                count=0;//計數變量清0
                sign_key=0;//鍵態標志清0
        }
        P1&=0x0f;    //P1.4~7清0
        P1|=time_LED;//還原4個LED狀態
        P1M0=0x00;   //還原P1.4~7推挽設置
        P1M1=0xf0;   //還原P1.4~7推挽設置
}
/*********************************
        按鍵服務程序
*********************************/
void key_service()
{
        switch(KeySec)
        {
                case 1:        LED1=~LED1;KeySec=0;break;
                case 2:        LED2=~LED2;KeySec=0;break;
                case 3:        LED3=~LED3;KeySec=0;break;
                case 4:        LED4=~LED4;KeySec=0;break;
        }                  
}
/********************************
        主程序
********************************/
void main()
{
        P1M0=0xf0;//P1.4~7設置推挽
        P1M1=0x00;//P1.4~7設置推挽
        while(1)
        {
                key_scan();
                key_service();
                Delay1ms();//控制主循環周期約1ms
        }
}

大佬們,幫看下哪里的問題,我反復調試好久都不行,謝謝啦
回復

使用道具 舉報

18#
ID:887371 發表于 2021-9-20 15:11 | 只看該作者

假如推挽和弱上拉設置沒錯的畫,io口驅動發光二極管并掃描按鍵這部分代碼沒有問題。
鍵值處理分析這部分有問題,你需要一個全局變量保存之前的鍵值。
我根據你的代碼修改了一下。
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. sfr P1M0 = 0x91;
  4. sfr P1M1 = 0x92;

  5. sbit LED1 = P1 ^ 4; //LED端口聲明
  6. sbit LED2 = P1 ^ 5;
  7. sbit LED3 = P1 ^ 6;
  8. sbit LED4 = P1 ^ 7;
  9. //unsigned char KeySec=0;//鍵值變量
  10. /**********************************
  11.   1ms延時程序
  12. **********************************/
  13. void Delay1ms() //@12.000MHz
  14. {
  15.         unsigned char i, j;
  16.         _nop_();
  17.         _nop_();
  18.         i = 12;
  19.         j = 168;
  20.         do
  21.         {
  22.                 while (--j);
  23.         } while (--i);
  24. }

  25. /*********************************
  26.         按鍵值讀取程序
  27. *********************************/
  28. unsigned char KeyGet(void)
  29. {
  30.         unsigned char r;
  31.         unsigned char time_LED;

  32.         //EA=0;//如能保證中斷不會在此期間操作P1.4~7,可注釋
  33.         time_LED = P1 & 0xf0; //保存4個LED狀態
  34.         P1M0 = 0xf0;                  //P1.4~7設置弱上拉
  35.         P1M1 = 0x00;                  //P1.4~7設置弱上拉
  36.         P1 |= 0xf0;                          //P1.4~7置高電平

  37.         _nop_();_nop_();_nop_();_nop_();_nop_();           //延時等待按鍵穩定
  38.         r = P1 & 0xf0; //讀鍵值

  39.         P1 &= 0x0f;                //P1.4~7清0
  40.         P1 |= time_LED; //還原4個LED狀態
  41.         P1M0 = 0x00;        //還原P1.4~7推挽設置
  42.         P1M1 = 0xf0;        //還原P1.4~7推挽設置
  43.         //EA=1;
  44.         return r;
  45. }
  46. /*********************************
  47.         按鍵服務程序
  48. *********************************/
  49. void key_service(unsigned char KeySec)
  50. {
  51.         if((KeySec&(1<<4))==0) LED1 = ~LED1;
  52.         if((KeySec&(1<<5))==0) LED2 = ~LED2;
  53.         if((KeySec&(1<<6))==0) LED3 = ~LED3;
  54.         if((KeySec&(1<<7))==0) LED4 = ~LED4;
  55. }
  56. /**********************************
  57.         按鍵掃描程序
  58. **********************************/
  59. void key_scan()
  60. {
  61.         static unsigned char keyOld = 0xf0; //上一次按鍵值
  62.         static unsigned char count = 0;                //靜態計數變量
  63.         unsigned char KeyCur;                                //當前按鍵值 臨時變量

  64.         KeyCur = KeyGet();
  65.         if (keyOld == KeyCur)
  66.         { //按鍵未變化
  67.                 if (++count == 0)
  68.                         --count;
  69.                 if (KeyCur != 0xf0)
  70.                 { //有鍵按下
  71.                         if (count == 10)
  72.                         { //消抖
  73.                                 key_service(KeyCur);
  74.                         }
  75.                 }
  76.         }
  77.         else
  78.         {
  79.                 count = 0; //計數變量清0
  80.                 keyOld = KeyCur;
  81.         }
  82. }


  83. /********************************
  84.         主程序
  85. ********************************/
  86. void main()
  87. {
  88.         // P1M0 = 0xf0; //P1.4~7設置推挽
  89.         // P1M1 = 0x00; //P1.4~7設置推挽
  90.         KeyGet();         //P1.4~7設置推挽
  91.         while (1)
  92.         {
  93.                 key_scan();
  94.                 //key_service();
  95.                 Delay1ms(); //控制主循環周期約1ms
  96.         }
  97. }
復制代碼



回復

使用道具 舉報

19#
ID:887371 發表于 2021-9-20 15:27 | 只看該作者

剛查了下手冊,你配置弱上拉除了錯。
讀鍵值代碼如下:
  1. /*********************************
  2.         按鍵值讀取程序
  3. *********************************/
  4. unsigned char KeyGet(void)
  5. {
  6.         unsigned char r;
  7.         unsigned char time_LED;

  8.         //EA=0;//如能保證中斷不會在此期間操作P1.4~7,可注釋
  9.         time_LED = P1 & 0xf0; //保存4個LED狀態
  10.         //P1M0 = 0xf0;                  //P1.4~7設置弱上拉
  11.         P1M1 = 0x00;                  //P1.4~7設置弱上拉
  12.         P1 |= 0xf0;                          //P1.4~7置高電平

  13.         _nop_();_nop_();_nop_();_nop_();_nop_();           //延時等待按鍵穩定
  14.         r = P1 & 0xf0; //讀鍵值

  15.         P1 &= 0x0f;                //P1.4~7清0
  16.         P1 |= time_LED; //還原4個LED狀態
  17.         P1M0 = 0x00;        //還原P1.4~7推挽設置
  18.         P1M1 = 0xf0;        //還原P1.4~7推挽設置
  19.         //EA=1;
  20.         return r;
  21. }
復制代碼
回復

使用道具 舉報

20#
ID:777834 發表于 2021-9-24 00:23 來自手機 | 只看該作者
datouyuan 發表于 2021-9-20 15:27
剛查了下手冊,你配置弱上拉除了錯。
讀鍵值代碼如下:

以上程序都跑過了,也調試了好久,就是關閉LED時燈還有微亮,
回復

使用道具 舉報

21#
ID:887371 發表于 2021-9-24 09:05 | 只看該作者
jianuli 發表于 2021-9-24 00:23
以上程序都跑過了,也調試了好久,就是關閉LED時燈還有微亮,

請看我2樓的分析。
回復

使用道具 舉報

22#
ID:777834 發表于 2021-9-24 09:31 來自手機 | 只看該作者
datouyuan 發表于 2021-9-24 09:05
請看我2樓的分析。

實際10K電阻我沒接,接與不接結果都一樣,還有不可能像你說的要把電壓調低才能用吧,像充電寶之類的很多產品都用這種電路,它們關閉后都沒有微亮,
回復

使用道具 舉報

23#
ID:887371 發表于 2021-9-24 11:09 | 只看該作者
jianuli 發表于 2021-9-24 09:31
實際10K電阻我沒接,接與不接結果都一樣,還有不可能像你說的要把電壓調低才能用吧,像充電寶之類的很多 ...

我的分析是沒有錯的,10K不接的話,需要更低些的電壓才能正常。
充電寶電路和這電路肯定不一樣,我做過4個IO同時驅動6個燈6個按鍵。
回復

使用道具 舉報

24#
ID:161164 發表于 2021-9-28 02:11 | 只看該作者
jianuli 發表于 2021-9-24 00:23
以上程序都跑過了,也調試了好久,就是關閉LED時燈還有微亮,

是有微亮
經過一整晚的研究
終于發現微亮的成因和解決方法
已經夜深,明天再說

答案提示:PWM
回復

使用道具 舉報

25#
ID:777834 發表于 2021-9-28 08:33 來自手機 | 只看該作者
lkc8210 發表于 2021-9-28 02:11
是有微亮
經過一整晚的研究
終于發現微亮的成因和解決方法

是吧,我實際搭電路驗證的,確實關閉后有微亮,但就是有人不信,我也覺得有解決方法,但是本人還是菜鳥一個,沒法解決
回復

使用道具 舉報

26#
ID:1064915 發表于 2023-6-28 15:55 | 只看該作者
STC89C52RC可以試驗嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品 欧美精品 | 精品久久久久一区二区国产 | 欧美视频一区二区三区 | 国产精品国产三级国产aⅴ中文 | 日韩免费一级 | 亚洲不卡在线观看 | 九九九久久国产免费 | 免费看av大片| 久久成人一区 | 亚洲视频一区在线观看 | 99热激情 | 国产欧美日韩久久久 | 国产成人一区二区三区久久久 | 成人影院在线观看 | 国产精品自拍视频网站 | 免费簧片视频 | 欧美日韩黄色一级片 | 国产精品久久午夜夜伦鲁鲁 | 在线视频亚洲 | 国产精品入口麻豆www | 成人福利网站 | 九九热精品视频 | av天天爽 | 亚洲免费在线观看 | 精品中文字幕一区 | 亚洲免费一区二区 | 亚洲精品专区 | 国产永久免费 | 少妇精品久久久久久久久久 | 久久久久久久久国产 | 成人在线中文字幕 | 欧美大片一区二区 | 免费一区二区三区 | 亚洲日本一区二区三区四区 | 人人干人人艹 | 日韩中文字幕在线观看 | 国产一区视频在线 | 日韩毛片在线视频 | 国产福利91精品一区二区三区 | 黄色国产在线播放 | 男女羞羞视频免费 |