當前位置:首頁 » 節日大全 » 單片機怎麼設置節日彩燈

單片機怎麼設置節日彩燈

發布時間: 2023-04-19 04:47:33

1、單片機彩燈控制


一、C語言程序中存在的問題
1.「for(i=0;i<7;i=i+2)」是「左移4次」而不是「左移3次」,i=0,i=2,i=4,i=6,當i=8時結束for循環。
2.「LED=(LED<<2)|0x03;」的含義是:將LED左移2位後,將最低兩位置1。
3.「LED=(LED>>2)|0xc0;」的含義是:將LED右移2位後,將最高兩位置1。
4.兩者結合,將「LED=(LED<<2)|0x03;」重復運行4次後,LED=0xff,其中不再存在值等於0的位。
之後無論「LED=(LED>>2)|0xc0;」還是「LED=(LED<<2)|0x03;」都不會再有值等於0的位產生。
看你的程序,發光二極體應該是低電平點亮,所以以後無論如何移位都不再有發光二極體點亮了。
5.解決方法:將「for(i=0;i<7;i=i+2)」改成「for(i=0;i<3;i++)」即可。
二、反匯編實際含義的問題
對「LED=(LED<<2)|0x03;」的反匯編:

;***********************************************************************    38:           LED=(LED<<2)|0x03; // 左.移2位,並設定最低兩位元為11      
C:0x000D    E5B0     MOV      A,P1(0x90)
C:0x000F    25E0     ADD      A,ACC(0xE0)
C:0x0011    25E0     ADD      A,ACC(0xE0)
C:0x0013    4403     ORL      A,#0x03
C:0x0015    F5B0     MOV      P1(0x90),A
;***********************************************************************

1.C程序中有從LED取值的指令「=...LED...」,因為LED在宏定義中為P1口,所以其對應匯編指令為「MOV A,P1」。
2.在單片機實驗中,P1口控制LED,常用灌電流直接驅動的方法。
在這樣的電路下,即使引腳被內置置0,其對應外部引腳實臘歷州際上還是被上拉成了高電平。
3.因此,讀取P1口值時將得到0xff,故而「LED=(LED<<2)|0x03;」後LED將直接的到0xff,所以以後發光二極體都不會亮了。
4.解決辦法:先對某個自定義寄存器進行移位處理,最後再將結構賦值給P1口。

 

修改後的程序:

/*主要是想讓燈兩個兩個的亮,可是程序不知道為什麼只執行一遍*/
/* ch03-3-3.c 輪蔽- 霹靂燈實驗程序  */
/*
一、C語言程序中存在的問題
1.「for(i=0;i<7;i=i+2)」是「左移4次」而不是「左移3次」,i=0,i=2,i=4,i=6,當i=8時結束for循環。
2.「LED=(LED<<2)|0x03;」的含義是:將LED左移2位後,將最低兩位置1。
3.「LED=(LED>>2)|0xc0;」的含義是:將LED右移2位後,將最高兩位置1。
4.兩者結合,將「LED=(LED<<2)|0x03;」重復運行4次後,LED=0xff,其中不再存在值等於0的位。
之後無論「LED=(LED>>2)|0xc0;」還是「LED=(LED<<2)|0x03;」都不會再有值等於0的位產生。
看你的程序,發光二極體應該是低電平點亮,所以以後無論如何移位都不再有發光二極體點亮了。
5.解決方法:將「for(i=0;i<7;i=i+2)」改成「for(i=0;i<3;i++)」即可。
二、反匯編實際含義的問題
對「LED=(LED<<2)|0x03;」的反匯編:
;**********************************************************************************
    38:                         LED=(LED<<2)|0x03; // 左.移2位,並設定最低兩位元為11      
C:0x000D    E5B0     MOV      A,P1(0x90)
C:0x000F    25E0     ADD      A,ACC(0xE0)
C:0x0011    25E0     ADD      A,ACC(0xE0)
C:0x0013    4403     ORL      A,#0x03
C:0x0015    F5B0     MOV      P1(0x90),A
;**********************************************************************************
1.C程序中有從LED取爛迅值的指令「=...LED...」,因為LED在宏定義中為P1口,所以其對應匯編指令為「MOV A,P1」。
2.在單片機實驗中,P1口控制LED,常用灌電流直接驅動的方法。
在這樣的電路下,即使引腳被內置置0,其對應外部引腳實際上還是被上拉成了高電平。
3.因此,讀取P1口值時將得到0xff,故而「LED=(LED<<2)|0x03;」後LED將直接的到0xff,所以以後發光二極體都不會亮了。
4.解決辦法:先對某個自定義寄存器進行移位處理,最後再將結構賦值給P1口。
*/
//==聲明區============================================
#include <reg51.h>   // 定義8051暫存器之標頭檔,P2-17~19 
#define LED P1   // 定義LED接至Port 1
//==子程序=============================================
/* 延遲函數,延遲約x 5ms */
//void delay(int x)  // 延遲函數開始  
void delay(unsigned char x)  // 延遲函數開始 

 int i,j;   // 聲明整數變數i,j 
 for (i=0;i<x;i++) // 計數x次,延遲x 5ms   
 for (j=0;j<600;j++);// 計數600次,延遲5ms 
}      // 延遲函數結束
//==主程序============================================
main()     // 主程序開始

 unsigned char i;   // 聲明無號數字元變數i(佔1Bytes)   
 unsigned char temp=0x03; 
 //(捨去)LED=0xfc;   // 初值=1111 1100,只有最右1燈亮  
 while(1)     /// 無窮循環,程序一直跑  
 { 
  for(i=0;i<3;i++)// 左移3次   
  { 
   delay(100); // 延遲100 5m=0.5s    
   //(捨去)LED=(LED<<2)|0x03; // 左.移2位,並設定最低兩位元為11  
   temp=temp<<2;
   LED=~temp;
  }    // 左移結束,只有最左1燈亮   
  for(i=0;i<3;i++)// 右移3次  
  { 
   delay(100); // 延遲100 5m=0.5s   
   //(捨去)LED=(LED>>2)|0xc0; // 右移2位,並設定最高位元為11 
   temp=temp>>2;
   LED=~temp;
  }    // 結束右移,只有最右1燈亮 
 }     // while循環結束
}      // 主程序結束

2、《單片機的原理與應用》節日彩燈的設計

程序如下,P0口改為P1、P2或P3口可以省略電路圖中的上拉電阻。

注意:無論選擇哪組I/O,每虧伏漏個LED都要串聯一個220Ω或470Ω的電阻。

#include "reg51.h"

#define uint unsigned int

#define uchar 廳察unsigned char

uchar code tab[]={0xfa,0xf5,0xaf,0x5f,0xaa,0x55,0x00,0xff};//分別為1和3亮、2和4亮、5和7亮、6和銷爛8亮、奇數位亮、偶數位亮、全亮、全滅

uchar t,num;

void InitUART(void)

{

TMOD=0x01; //定時器0 工作方式1即16位定時

TH0=0x3c; //裝入初值,定時50ms

TL0=0xb0;

TR0=1;

ET0=1; 

EA= 1;//打開總中斷

}

main()

{

InitUART();

P0=tab[num]; //先讓等處於第一種狀態

while(1)

{;}

}

Timer0() interrupt 1

{

TH0=0x3c; //手動重裝初值,定時50ms

TL0=0xb0;

t++;

if(t==20)

{

t=0;//夠20次,即計數時間為20*50ms=1s。計時次數清零,准備下一秒的計時

num++;//num指向下一種狀態

if(num==8) num=0;

P0=tab[num];//則切換至相應的狀態

}

}


純手打,望採納···

3、用單片機設計七彩循環裝飾燈控制器

該燈電路設計新穎,結構簡單,成本低廉,趣味性強,可用在賓館、酒樓作廣告燈,也適用作節日彩燈。該彩燈是根據三基色原理,以紅、綠、藍三種基色組成一個可變色彩單元。將三種基色燈裝入磨砂玻璃罩內,通過燈罩的混色作用(混色原理是:紅色+綠色=黃色,藍色+紅色=紫色,綠色+藍色=青色,紅色+藍色+綠色=白色)對外循環顯示七種顏色,即紅、藍、綠、紫、青、黃、白。工作原理:七彩裝飾燈的電路如圖派禪肆所示:
220V交流電經C1降壓、DW穩壓、VD整流、C2濾波後輸出12V直流電壓供控制電路工作。IC1時基集成電路NE555和R1、RP、C3組成一個可調節器的時鍾脈沖發生器,為後級電路提供所需的時鍾脈沖信號。IC2為C180,它是一塊具有同步加法計數功能的COMS集成電路,在它的復位端(R)連接C5、R2,使電路每次連通電源瞬間自動清零復位。CP是時鍾脈沖輸入端,Q1~Q4為輸出端,其輸出邏輯狀態見真值表。從表中可以看出,當從C180的CP端輸入第一個時鍾脈沖時,其Q1端輸出為高電平,三極體V1導通,觸發雙向可控硅SCR1導通,第一個基色燈泡H1點亮,燈罩顯示紅色;當第二個時襲裂鍾脈沖觸發C180時,其Q2端輸出為高電平,V2、SCR2導通,第二個基色燈泡H2點亮,燈罩顯示綠色,當第三個時鍾脈沖觸發C180時,Q1、Q2端同時輸出高電平,V1、V2、SCR1、SCR2均導通,H1、H2同時點亮,根據混色原理,燈罩顯示黃色;當第四個時鍾脈沖觸發C180時,Q3端輸出高電平,第三個基色燈泡H3點亮,燈塵轎罩顯示藍色。依此類推,C180的Q1、Q2、Q3端輸出組成7種邏輯狀態,可使三基色燈H1、H2、H3的混色有7種顏色,因而燈罩可以顯示出7種彩色燈光。當第8個時鍾脈沖觸發C180時,Q4輸出高電平,C180復位,電路又開始循環上述過程。S為定色開關,若需要固定哪種顏色時,斷開開關S即可。
輸出
時鍾
Q4
Q3
Q2
Q1
1
0
0
0
1
2
0
0
1
0
3
0
0
1
1
4
0
1
0
0
5
0
1
0
1
6
0
1
1
0
7
0
1
1
1
8
1
0
0
0
C180真值表元件選擇與安裝:RP選擇470K電位器,它可調節該燈色彩循環速率。C1選用耐壓值400V金屬膜紙介質無極性電容器。DW用12V的穩壓二極體。三隻雙向可控硅CSR選用耐壓400V。其它元件均按圖中標注選擇。安裝時,彩燈H1~H3固定在燈罩內,其它元件安裝在一個小塑料盒內。將RP電位器和定色開關S固定在小塑料盒的面板上,以便調控。另外在焊接CMOS集成電路C180時,電烙鐵要可靠接地,以防損壞集成塊。

4、C51單片機 節日彩燈的程序設計 用匯編語言編制

ORG 0000H
AJMP MAIN
MAIN:
MOV P1,#05H
CALL DELAY
MOV P1,#0AH
CALL DELAY
MOV P1,#50H
CALL DELAY
MOV P1,#55H
CALL DELAY
MOV P1,#0AAH
CALL DELAY
MOV P1,#0FFH
CALL DELAY
MOV P1,#00H
CALL DELAY
AJMP MAIN

DELAY:
MOV R3,#1000
BC: MOV R2,#995
DEC R2
DJNZ R2,$
DJNZ R3,BC
RET

END
;說悔指辯明:該程碧缺序逗州採用P1口作為發光二極體的控制,陽極接P1口,陰極接地即可

5、以單片機為核心,設計一個節日彩燈控制器,要求如下:

你可以參考《吳鑒鷹單片機項目實戰精講》裡面的資料,我也在學吳鑒鷹51單片機開發板

熱點內容
新泰特產 發布:2020-09-14 19:00:13 瀏覽:505
適合開業的音樂 發布:2020-09-17 11:28:55 瀏覽:503
送男生十字綉 發布:2020-09-16 16:05:07 瀏覽:503
神秘商店皮膚贈送 發布:2020-09-16 15:38:37 瀏覽:503
手繪聖誕賀卡 發布:2020-09-16 14:48:57 瀏覽:503
青島初中升學率 發布:2020-09-16 09:55:57 瀏覽:503
送媽媽的生日蛋糕圖片 發布:2020-09-16 09:10:18 瀏覽:503
夢生日 發布:2020-09-16 18:24:33 瀏覽:502
紙禮物盒 發布:2020-09-16 15:55:47 瀏覽:502
wow角色定製 發布:2020-09-16 14:46:32 瀏覽:502