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

QQ登錄

只需一步,快速開始

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

3種按鍵實(shí)現(xiàn)不同功能的單片機(jī)源程序

[復(fù)制鏈接]
ID:553020 發(fā)表于 2019-7-19 17:27 | 顯示全部樓層 |閱讀模式
此程序?yàn)楸救艘郧皠倢W(xué)時(shí)候編寫的,還存在許多未經(jīng)優(yōu)化的地方,也沒有多少注釋,請(qǐng)多擔(dān)待。
功能如下:
1、按下k1,流水燈閃爍。
2、按下k2,開始從20開始計(jì)時(shí)。
3、按下k3,停止計(jì)時(shí),開始累加。

[W8WPN[Q62QXM5XMT3[34.png


以下為部分程序:
  1. #include  "reg52.h"
  2. #include "intrins.h"
  3. #define led P1   //定義LED
  4. sbit k1=P0^0;
  5. sbit k2=P0^1;
  6. sbit k3=P0^2 ;         //定義按鍵
  7. char code smguan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //數(shù)字定義
  8. #define num1   P2
  9. #define num2   P3//定義數(shù)碼管管腳
  10. int a=0,b=2;
  11. int c=0;d=2;

  12. void delay(int i)
  13. {
  14.   while(i--);
  15. }


  16. void delay800ms()   //誤差 0us
  17. {
  18.     unsigned char a,b,c;
  19.     for(c=95;c>0;c--)
  20.         for(b=138;b>0;b--)
  21.             for(a=29;a>0;a--);
  22.     _nop_();  //if Keil,require use intrins.h
  23.     _nop_();  //if Keil,require use intrins.h
  24. }

  25. void twinkle()
  26. {
  27.         
  28.   if(k1==1)                  //檢測(cè)按鍵K1是否按下
  29.         {        
  30.                 delay(1000);   //消除抖動(dòng) 一般大約10ms
  31.                 if(k1==1)         //再次判斷按鍵是否按下
  32.                 {        
  33.                                 while(1)
  34.                                 {led=0xaa;
  35.                            delay(50000);
  36.                                  led=~led; //led狀態(tài)取反
  37.                                  delay(50000);
  38.                                         if((k2==1)||(k3==1))break;
  39.                                 }
  40.                 }
  41.         }        
  42. }        


  43. void Timer1Init()
  44. {
  45.         TMOD|=0X10;//選擇為定時(shí)器1模式,工作方式1,僅用TR1打開啟動(dòng)。

  46.         TH1=0XFC;        //給定時(shí)器賦初值,定時(shí)1ms
  47.         TL1=0X18;        
  48.         ET1=1;//打開定時(shí)器1中斷允許
  49.         EA=1;//打開總中斷
  50.         TR1=1;//打開定時(shí)器                        
  51. }


  52. void time()
  53. {        
  54.         if(k2==1)                  //檢測(cè)按鍵K2是否按下
  55.         {        
  56.                 delay(1000);   //消除抖動(dòng) 一般大約10ms
  57.                 if(k2==1)         //再次判斷按鍵是否按下
  58.                 {        
  59.         Timer1Init();  //定時(shí)器1初始化
  60.                
  61.                 }
  62.         }

  63. }


  64. void Timer1() interrupt 3
  65. {
  66.         static int i;
  67.         TH1=0XFC;        //給定時(shí)器賦初值,定時(shí)1ms
  68.         TL1=0X18;
  69.         i++;
  70.         if(i==1000)
  71.         {

  72.                 i=0;
  73.                 num2=smguan[a++];
  74.                 num1=smguan[b];
  75.                 if(a==10)        
  76.                 {
  77.                   a=0;
  78.                         if(b==5)
  79.                         {
  80.                           b=2;
  81.                         }
  82.                         else b++;
  83.                 }         
  84.         }        
  85.         if((k1==1)||(k3==1))TR1=0;
  86. }

  87. void Timer0Init()
  88. {
  89.         TMOD|=0X01;//選擇為定時(shí)器0模式,工作方式1,僅用TR0打開啟動(dòng)。

  90.         TH0=0XFC;        //給定時(shí)器賦初值,定時(shí)1ms
  91.         TL0=0X18;        
  92.         ET0=1;//打開定時(shí)器0中斷允許
  93.         EA=1;//打開總中斷
  94.         TR0=1;//打開定時(shí)器                        
  95. }


  96. void leijia()
  97. {
  98.         while(1){
  99.                 if(k3==1)                  //檢測(cè)按鍵K1是否按下
  100.         {
  101.                    delay(80);   //消除抖動(dòng) 一般大約10ms
  102.                  if(k3==1)         //再次判斷按鍵是否按下
  103.                 { num2=smguan[c];
  104.                         num1=smguan[d];
  105.                         c=c+1;
  106.                  if(c==10)        
  107.                 {
  108.                   c=0;
  109.                         if(d==5)
  110.                         {
  111.                           d=2;
  112.                         }
  113.                         else d=d+1;
  114.                 }        

  115.    }
  116. }delay(20000);
  117.         if((k1==1)||(k2==1)){c=0;d=2;break;}
  118. }
  119. }

  120. void main()
  121. {
  122.   while(1)
  123.         {
  124.           twinkle();
  125.           time();
  126.                 leijia();
  127.         }        
  128. }
復(fù)制代碼
新建 Microsoft Word 文檔.docx (15.15 KB, 下載次數(shù): 5)

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表