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

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

QQ登錄

只需一步,快速開始

搜索
查看: 8078|回復(fù): 1
收起左側(cè)

單片機(jī)按鍵控制流水燈狀態(tài)(4種),仿真加程序,按鍵采用中斷掃描方式

[復(fù)制鏈接]
ID:347629 發(fā)表于 2020-5-15 22:32 | 顯示全部樓層 |閱讀模式
按鍵-LED實(shí)驗(yàn)                                                                                                  
實(shí)現(xiàn)現(xiàn)象:下載程序后
按下K1按鍵  12,34 交替亮滅
按下K2按鍵  13,24 交替亮滅
按下K3按鍵  1234循環(huán)點(diǎn)亮
按下K4按鍵  全滅

在本次仿真中,按鍵使用的是定時(shí)器0的按鍵掃描方式,
但是由于單片機(jī)的執(zhí)行是從上往下執(zhí)行的過程,加上程序中有延時(shí)函數(shù)的存在,
因此,有時(shí)候在當(dāng)前狀態(tài)未運(yùn)行完的情況下,按下按鍵并沒有立即反應(yīng),
等當(dāng)前狀態(tài)執(zhí)行完就可以執(zhí)行按鍵按下后的狀態(tài)了。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

仿真

仿真

代碼

代碼


單片機(jī)源程序如下:
  1. /**************************************************************************************
  2. *                *按鍵-LED實(shí)驗(yàn)                                                                                                  *
  3. *實(shí)現(xiàn)現(xiàn)象:下載程序后
  4. *按下K1按鍵  12,34 交替亮滅
  5. *按下K2按鍵  13,24 交替亮滅
  6. *按下K3按鍵  1234循環(huán)點(diǎn)亮
  7. *按下K4按鍵  全滅
  8. 注意事項(xiàng):無                                                                                                                                                                  
  9. ***************************************************************************************/
  10. #include "reg52.h"                         //此文件中定義了單片機(jī)的一些特殊功能寄存器
  11. #include<intrins.h>                //因?yàn)橐玫阶笥乙坪瘮?shù),所以加入這個(gè)頭文件
  12. typedef unsigned int u16;          //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
  13. typedef unsigned char u8;

  14. sbit k1=P1^0;         //按鍵1,   12,34 交替亮滅
  15. sbit k2=P1^1;         //按鍵2,  13,24 交替亮滅
  16. sbit k3=P1^2;         //按鍵3, 1234循環(huán)點(diǎn)亮
  17. sbit k4=P1^3;         //全滅


  18. sbit LED1=P2^0;         //定義P20口是led1
  19. sbit LED2=P2^1;         //定義P20口是led2
  20. sbit LED3=P2^2;         //定義P口是led3
  21. sbit LED4=P2^3;         //定義P口是led4
  22. #define led P2           //將P2口定義為led 后面就可以使用led代替P2口

  23. u8 key_value;

  24. /*******************************************************************************
  25. * 函 數(shù) 名         : delay
  26. * 函數(shù)功能                   : 延時(shí)函數(shù),i=1時(shí),大約延時(shí)10us
  27. *******************************************************************************/
  28. void delay(u16 i)
  29. {
  30.         while(i--);       
  31. }
  32. void Delay100ms()                //@12.000MHz
  33. {
  34.         unsigned char i, j, k;

  35.         _nop_();
  36.         _nop_();
  37.         i = 5;
  38.         j = 144;
  39.         k = 71;
  40.         do
  41.         {
  42.                 do
  43.                 {
  44.                         while (--k);
  45.                 } while (--j);
  46.         } while (--i);
  47. }

  48. /*******************************************************************************
  49. * 函 數(shù) 名         : Timer0Init
  50. * 函數(shù)功能                   : 定時(shí)器0初始化
  51. * 輸    入         : 無
  52. * 輸    出         : 無
  53. *******************************************************************************/
  54. void Timer0Init(void)                //10微秒@12.000MHz
  55. {
  56.         TMOD|=0X01;//選擇為定時(shí)器0模式,工作方式1,僅用TR0打開啟動(dòng)。
  57.         TL0 = 0x88;                //設(shè)置定時(shí)初值
  58.         TH0 = 0xFF;                //設(shè)置定時(shí)初值
  59.         ET0=1;//打開定時(shí)器0中斷允許
  60.         EA=1;//打開總中斷
  61.         TR0=1;//打開定時(shí)器       
  62. }

  63. /*******************************************************************************
  64. * 函 數(shù) 名         : keypros
  65. * 函數(shù)功能                   : 按鍵處理函數(shù),判斷按鍵是否按下
  66. *******************************************************************************/
  67. void keypros()
  68. {
  69.         if(k1==0)                  //檢測(cè)按鍵K1是否按下
  70.         {       
  71.                 delay(1000);   //消除抖動(dòng) 一般大約10ms
  72.                 if(k1==0)         //再次判斷按鍵是否按下
  73.                 {
  74.                           key_value = 1;  
  75.                 }
  76.                 while(!k1);         //檢測(cè)按鍵是否松開
  77.         }               
  78.        
  79.         if(k2==0)                  //檢測(cè)按鍵K1是否按下
  80.         {       
  81.                 delay(1000);   //消除抖動(dòng) 一般大約10ms
  82.                 if(k2==0)         //再次判斷按鍵是否按下
  83.                 {
  84.                         key_value = 2;
  85.                 }
  86.                 while(!k2);         //檢測(cè)按鍵是否松開
  87.         }


  88.         if(k3==0)                  //檢測(cè)按鍵K1是否按下
  89.                 {       
  90.                         delay(1000);   //消除抖動(dòng) 一般大約10ms
  91.                         if(k3==0)         //再次判斷按鍵是否按下
  92.                         {
  93.                                 key_value = 3;
  94.                         }
  95.                         while(!k3);         //檢測(cè)按鍵是否松開
  96.                 }
  97.                
  98.         if(k4==0)                  //檢測(cè)按鍵K1是否按下
  99.                 {       
  100.                         delay(1000);   //消除抖動(dòng) 一般大約10ms
  101.                         if(k4==0)         //再次判斷按鍵是否按下
  102.                         {
  103.                                 key_value = 4;
  104.                         }
  105.                         while(!k4);         //檢測(cè)按鍵是否松開
  106.                 }               
  107.        
  108. }

  109. void Mode1()            //模式1
  110. {
  111.                 LED1 = 0;    //亮
  112.                 LED2 = 0;    //亮
  113.                 LED3 = 1;    //滅
  114.                 LED4 = 1;    //滅
  115.                 Delay100ms();               
  116.                 LED1 = 1;    //滅
  117.                 LED2 = 1;    //滅
  118.                 LED3 = 0;    //亮
  119.                 LED4 = 0;    //亮
  120.                 Delay100ms();

  121. }
  122. void Mode2()            //模式2
  123. {
  124.                 LED1 = 0;    //亮
  125.                 LED3 = 0;    //亮
  126.                 LED2 = 1;    //滅
  127.                 LED4 = 1;    //滅
  128.                 Delay100ms();               
  129.                 LED1 = 1;    //滅
  130.                 LED3 = 1;    //滅
  131.                 LED2 = 0;    //亮
  132.                 LED4 = 0;    //亮
  133.                 Delay100ms();

  134. }
  135. void Mode3()            //模式3
  136. {
  137.         u8 i;
  138.         led=0xfe;
  139.         Delay100ms();
  140.          for(i=0;i<3;i++)         //將led左移一位
  141.                 {
  142.                         led=_crol_(led,1);
  143.                         Delay100ms();        
  144.                 }
  145.                 for(i=0;i<3;i++)        //將led右移一位
  146.                 {
  147.                         led=_cror_(led,1);
  148.                         Delay100ms();
  149.                 }       
  150. }
  151. void Mode4()            //模式4
  152. {
  153.         led=0xff;       //全滅
  154. }
  155. /*******************************************************************************
  156. * 函 數(shù) 名       : main
  157. * 函數(shù)功能                 : 主函數(shù)
  158. * 輸    入       : 無
  159. * 輸    出             : 無
  160. *******************************************************************************/
  161. void main()
  162. {       
  163.         Timer0Init();  //定時(shí)器0初始化
  164.         while(1)
  165.         {       
  166.                 keypros();  //按鍵處理函數(shù)       
  167.                 switch (key_value)
  168.                 {
  169.                         case 1 : Mode1();break;
  170.                         case 2 : Mode2();break;
  171.                         case 3 : Mode3();break;
  172.                         case 4 : Mode4();break;
  173.                 }
  174.                
  175.         }               
  176. }

  177. /*******************************************************************************
  178. * 函 數(shù) 名         : void Timer0() interrupt 1
  179. * 函數(shù)功能                   : 定時(shí)器0中斷函數(shù)
  180. * 輸    入         : 無
  181. * 輸    出         : 無
  182. *******************************************************************************/
  183. void Timer0() interrupt 1
  184. {
  185.         TL0 = 0x88;                //設(shè)置定時(shí)初值
  186.         TH0 = 0xFF;                //設(shè)置定時(shí)初值
  187.         keypros();
  188. }
復(fù)制代碼

所有資料51hei提供下載:
仿真.rar (50.96 KB, 下載次數(shù): 51)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:989932 發(fā)表于 2021-12-9 10:27 來自手機(jī) | 顯示全部樓層
第二個(gè)是啥
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 蜜桃视频一区二区三区 | 成人av在线播放 | 成年人在线观看 | 亚洲三级av| 国产高清视频在线 | 欧美成人免费在线视频 | 欧美一区免费在线观看 | 不卡一二区 | 人人人艹| 国产精品久久久久久久久久久久 | 午夜精品久久久久久久久久久久久 | 最新中文字幕在线 | 欧美日韩国产精品一区 | 久久久精品网站 | 国产成人在线一区 | www亚洲免费国内精品 | 国产精品视频久久久 | 天天玩天天干天天操 | 天天综合久久 | 91日韩 | 丁香婷婷久久久综合精品国产 | 久久久久久久久久一区 | 黄色小视频入口 | 国产精品久久性 | www.99热.com| 成人在线不卡 | 亚洲国产第一页 | 国产午夜在线 | 久草资源在线 | 99久久精品国产一区二区三区 | 成人免费精品 | 白浆在线 | 中文字幕成人 | 久久久久久久久久一区 | 久久大 | 成在线人视频免费视频 | 911精品美国片911久久久 | 国产96在线 | 日韩在线一区二区三区 | 欧美成人精品在线 | 精品欧美乱码久久久久久 |