之前學單片機做的一個,以下是可實現的功能:
1. K1 為“啟動鍵”,首次按壓 K1 可產生“自下向上” 的
流水燈運動;
2. K2 為“停止鍵”,按壓 K2 可終止流水燈的運動;
3. K3 和 K4 為“方向鍵”,分別產生 “自上向下”和 “自
下向上” 運動。
4. K5 為“閃爍鍵”,按壓 K5 可以使 4 個燈同時閃爍。
有很多不足,請多多指教。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
1.png (77.49 KB, 下載次數: 56)
下載附件
2022-3-22 16:37 上傳
2.png (84.22 KB, 下載次數: 36)
下載附件
2022-3-22 16:37 上傳
單片機源程序如下:
- #include<reg51.h>
- char led1[]={0xfe,0xfd,0xfb,0xf7}; //LED亮燈控制字
- char led2[]={0xf0,0xff}; //LED閃爍控制字
- bit dir=0,run=0,tao=0; //全局變量
- unsigned char ms=0,i=0,j=3,k=0; //全局變量
- unsigned char set; //全局變量
- timer() interrupt 1 //T0方式延時延時函數
- {
- TH0=0x3c;
- TL0=0xb0; //該初值為延時50ms,運行10次后再進行變量加一或減一即可實現延時500ms
- ms++;
- if(ms==10)
- {
- ms=0;
- switch(set)
- {
- case 1:i++;break;
- case 2:j--;break;
- case 3:k++;break;
- }
- }
- }
- key() interrupt 0 //鍵控中斷函數
- {
- switch(P0&0x0f) //修改標志位狀態
- {
- case 0x0e:run=1;break;
- case 0x0d:run=0,dir=0;break;
- case 0x0b:dir=1;tao=0;break;
- case 0x07:dir=0;tao=0;break;
- case 0x0f:tao=1;break;
- }
- }
- void main()
- {
- TMOD = 0x01; //初始化T0,工作方式為工作方式1
- TH0 = 0x3C;
- TL0 = 0xB0;
- ET0 = 1;
- TR0 = 1;
-
- IT0=1;EX0=1; //初始化外部中斷INT0
-
- EA=1; //開總中斷
- PX0=0;PT0=1; //設置中斷優先級
- while(1)
- {
- if(run==1)
- {
- if(tao==1) //若run=1,tao=1,閃爍
- {
- set=3;
- if(k==2)
- {
- k=0;
- }
- P2=led2[k];
- }
- else
- {
- if(dir==1) //若run=dir=1,自上向下流動
- {
- set=1;
- if(i==4)
- {
- i=0;
- }
- P2=led1[i];
- }
- else //若run=1;dir=0,自下向上流動
- {
- set=2;
- if(j==-1)
- {
- j=3;
- }
- P2=led1[j];
- }
- }
- }
- else
- {
- P2=0xff; //燈全滅
- }
- }
- }
復制代碼
Keil代碼與Proteus仿真下載:
流水燈.zip
(60.29 KB, 下載次數: 22)
2022-3-22 16:37 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|