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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
樓主
按鍵-LED實驗                                                                                                  
實現現象:下載程序后
按下K1按鍵  12,34 交替亮滅
按下K2按鍵  13,24 交替亮滅
按下K3按鍵  1234循環點亮
按下K4按鍵  全滅

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

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


單片機源程序如下:
  1. /**************************************************************************************
  2. *                *按鍵-LED實驗                                                                                                  *
  3. *實現現象:下載程序后
  4. *按下K1按鍵  12,34 交替亮滅
  5. *按下K2按鍵  13,24 交替亮滅
  6. *按下K3按鍵  1234循環點亮
  7. *按下K4按鍵  全滅
  8. 注意事項:無                                                                                                                                                                  
  9. ***************************************************************************************/
  10. #include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器
  11. #include<intrins.h>                //因為要用到左右移函數,所以加入這個頭文件
  12. typedef unsigned int u16;          //對數據類型進行聲明定義
  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循環點亮
  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. * 函 數 名         : delay
  26. * 函數功能                   : 延時函數,i=1時,大約延時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. * 函 數 名         : Timer0Init
  50. * 函數功能                   : 定時器0初始化
  51. * 輸    入         : 無
  52. * 輸    出         : 無
  53. *******************************************************************************/
  54. void Timer0Init(void)                //10微秒@12.000MHz
  55. {
  56.         TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
  57.         TL0 = 0x88;                //設置定時初值
  58.         TH0 = 0xFF;                //設置定時初值
  59.         ET0=1;//打開定時器0中斷允許
  60.         EA=1;//打開總中斷
  61.         TR0=1;//打開定時器       
  62. }

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


  88.         if(k3==0)                  //檢測按鍵K1是否按下
  89.                 {       
  90.                         delay(1000);   //消除抖動 一般大約10ms
  91.                         if(k3==0)         //再次判斷按鍵是否按下
  92.                         {
  93.                                 key_value = 3;
  94.                         }
  95.                         while(!k3);         //檢測按鍵是否松開
  96.                 }
  97.                
  98.         if(k4==0)                  //檢測按鍵K1是否按下
  99.                 {       
  100.                         delay(1000);   //消除抖動 一般大約10ms
  101.                         if(k4==0)         //再次判斷按鍵是否按下
  102.                         {
  103.                                 key_value = 4;
  104.                         }
  105.                         while(!k4);         //檢測按鍵是否松開
  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. * 函 數 名       : main
  157. * 函數功能                 : 主函數
  158. * 輸    入       : 無
  159. * 輸    出             : 無
  160. *******************************************************************************/
  161. void main()
  162. {       
  163.         Timer0Init();  //定時器0初始化
  164.         while(1)
  165.         {       
  166.                 keypros();  //按鍵處理函數       
  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. * 函 數 名         : void Timer0() interrupt 1
  179. * 函數功能                   : 定時器0中斷函數
  180. * 輸    入         : 無
  181. * 輸    出         : 無
  182. *******************************************************************************/
  183. void Timer0() interrupt 1
  184. {
  185.         TL0 = 0x88;                //設置定時初值
  186.         TH0 = 0xFF;                //設置定時初值
  187.         keypros();
  188. }
復制代碼

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



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:989932 發表于 2021-12-9 10:27 來自觸屏版 | 只看該作者
第二個是啥
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天干天天色 | 日中文字幕在线 | 91亚洲精品久久久电影 | 久久精品国产清自在天天线 | 亚洲天堂中文字幕 | 色婷婷久久久亚洲一区二区三区 | 国产精品成人一区二区 | 欧美极品少妇xxxxⅹ免费视频 | 亚洲精品中文字幕中文字幕 | 91视视频在线观看入口直接观看 | 综合激情av | 黄免费在线 | 精彩视频一区二区三区 | 亚洲国产精品自拍 | 国产韩国精品一区二区三区 | 亚洲一区欧美一区 | 国产欧美精品在线观看 | 草樱av| 中文字幕 在线观看 | 亚洲国产高清在线观看 | 精品国产一区二区三区免费 | 99久久99| 亚洲精品久久久一区二区三区 | 五十女人一级毛片 | 日韩精品一区在线观看 | 欧美日韩一区二区三区视频 | 视频1区2区 | 天天宗合网 | 日韩国产中文字幕 | 国产一区在线免费 | 秋霞在线一区二区 | 欧美亚洲国产日韩 | 欧美精品一区在线 | 麻豆久久久9性大片 | 日本精品视频在线 | 久久精品福利 | 日韩中文字幕2019 | 国产三级精品三级在线观看四季网 | 久久精品国产一区老色匹 | 一区二区免费在线观看 | 精品视频在线一区 |