設計任意流水燈電路,實現兩種以上方式的流水燈效果,通過按鍵切換或者自動切換。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (26.96 KB, 下載次數: 80)
下載附件
2022-4-8 16:08 上傳
單片機源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define led P2
- typedef unsigned int u16; //對數據類型進行聲明定義
- typedef unsigned char u8;
- //延遲函數
- void delay(){
- u16 a, b;
- for(a = 0; a < 400; a++)
- for(b = 0; b < 400; b++);
- }
- // LED點亮方式:依次點亮(一次一個,循環三次)
- void yici(){
- char i, j;
- for(j = 0; j < 1; j++){
- led = 0xfe;
- for(i = 0; i < 7; i++){
- led = _cror_(led, 1);
- delay();
- }
- led = 0x7f;
- for(i = 0; i < 7; i++){
- led = _crol_(led, 1);
- delay();
- }
- }
- }
- // 從兩邊到中間
- char toMiddle[] = {0x7e, 0xbd, 0xdb, 0xe7, 0xdb, 0xbd, 0x7e};//LED燈點亮方式
- void bianToMiddle(){
- char i, j;
- for(j = 0; j < 1; j++){//循環三遍
- for(i = 0; i < 7; i++){//LED點亮方式:從兩邊到中間
- led = toMiddle[i];
- delay();
- }
- }
- }
- //由上向下依次點亮LED燈
- char toBottom[] = {0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00};
- void topToBottom(){
- char i, j;
- for(j = 0; j < 1; j++){
- led = 0xff;
- for(i = 0; i < 8; i++){
- led = led << 1;
- delay();
- }
- for(i = 6; i >= 0; i--){
- led = toBottom[i];
- delay();
- }
- }
- }
- void main(){
- while(1){
- yici(); //LED燈依次亮
- bianToMiddle();//LED燈從兩邊向中間逐次點亮
- led = 0xff; //關閉LED燈
- topToBottom();//由上向下依次點亮LED燈
- }
- }
復制代碼 Keil代碼與Proteus仿真下載:
實驗10.7z
(71.94 KB, 下載次數: 55)
2022-4-8 16:10 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|