原代碼
按鍵1 控制亮滅,按下時燈滅,再按下繼續流水
按鍵2 控制暫停,按下時暫停,保持該LED燈亮,再按下繼續
單片機源程序如下:
- #include<reg52.h>
- sbit KEY=P3^2; //按鍵1
- sbit KEY1=P3^3; //按鍵2
- unsigned char code d[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
- 0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0x00,0xff}; //燈的效果(常量)
- void time();
- void timer();//調用中斷
- bit flag; //標志位1
- bit flag1; //標志位2
- void main()
- {
- time();
- while(1)
- {
- if(!KEY)
- {
-
- if(!KEY)
- {
- while(!KEY); //控制燈停止的按鍵
- {flag=~flag;}
- }
- }
- if(!KEY1)
- {
-
- if(!KEY1)
- {
- while(!KEY1); //控制燈熄滅的按鍵
- {flag1=~flag1;}
- }
- }
- }
- }
- void time()
- {
- TMOD|=0x01;
- //設置定時器工作模式TMOD(定時器工作方式寄存器);
- //GATE(定時器/計數器的開關控制選項)設置為0;即定時器/計數器的開關控制僅由TCON寄存器中的TRx(x = 0,1)控制
- //C/T位(定時器模式和計數器模式選擇位)設置為0使其工作在定時器模式下;將該位置1則為定時器模式。
- //M1M0設置為01,使用16位計數
- TH0 = 0xD8; //65536-10000
- TL0 = 0xF0; //55536
- EA =1; //開啟總中斷
- EX0=1; //開啟0號外部中斷
- IT0=1; //設置外部中斷0觸發方式,1 - 負跳變觸發
- TR0=1; //定時器0運行控制位,將該位置1時啟動定時器0
- ET0=1; //定時器/計數器0中斷允許位
- }
- void timer() interrupt 0
- {
- P2=0xff;
- }
- void timeer() interrupt 1
- {
- static unsigned int k=0;
- static unsigned char i=0;
- TH0=(65536-2000)/256;
- TL0=(65536-2000)%256; //實現延時
- if((!flag)&&(!flag1))
- {
- k++;
- if(k<150) //當兩個按鍵都沒有被按下時,燈進行流水效果
- {P2=d[i];}
- if(k==300)
- {
- k=0;
- i++;
- if(i==18)
- i=0;
- }
- }
- }
復制代碼
全部資料51hei下載地址:
Proteus 8.7模擬.zip
(52.52 KB, 下載次數: 18)
2019-5-1 12:04 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
hex原文件.zip
(607 Bytes, 下載次數: 12)
2019-5-1 12:04 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|