單片機控制LED流水燈從中間向兩邊_第1頁
單片機控制LED流水燈從中間向兩邊_第2頁
單片機控制LED流水燈從中間向兩邊_第3頁
單片機控制LED流水燈從中間向兩邊_第4頁
單片機控制LED流水燈從中間向兩邊_第5頁
已閱讀5頁,還剩1頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 單片機控制LED流水燈從中間向兩邊,從兩邊向中間 這個就是把 先奇數亮再偶數亮,循環三次;一個燈上下循環三次;兩個分別從兩邊往中間流動三次;再從中間往兩邊流動三次;不過這個程序實現的 應該是這樣的 先奇數亮再偶數亮,循環三次;一個燈上下循環三次;兩個分別從兩邊往中間流動;再從中間往兩邊流動;#include< reg52.h>#include< intrins.h>#define uint unsigned int#define uchar unsigned char void delay();void main() uchar temp,temp1,temp2,a,

2、b; P3=0xff; while(1) for(b=3;b>0;b-) temp=0xaa; P1=temp; delay(); temp=0x55; P1=temp; delay(); for(a=3;a>0;a-) temp=0xfe; for(b=7;b>0;b-) P1=temp; temp=_crol_(temp,1); delay(); P1=temp; delay(); temp1=0xfe; temp2=0x7f; for(a=8;a>0;a-) temp=temp1&temp2; P1=temp; delay(); temp1=_crol_(

3、temp1,1); temp2=_cror_(temp2,1); void delay() uint a,b; for(a=100;a>0;a-) for(b=600;b>0;b-); 程序實現的第2種方法:下面是單片機12群里的朋友木信大俠提出的,實現單片機led流水燈從中間向兩邊,從兩邊向中間的效果,下面的程序就是實現思路,這個是直接調用,應該明白吧,數組那其實也可以改一下,如采用一維數組,在多次調用;也可以采用二維數組。主要看個人喜好.-#include< reg52.h> unsigned char code TABLE= 0xFF,0xE7,0xC3,0x81

4、,0x00, /從中間向兩側點亮0xFF,0xE7,0xC3,0x81,0x00, 0xFF,0xE7,0xC3,0x81,0x00, 0xFF,0x7E,0x3C,0x18,0x00, /從兩側向中間點亮 0xFF,0x7E,0x3C,0x18,0x00, 0xFF,0x7E,0x3C,0x18,0x00; unsigned char i; DELAY() unsigned int s; for(s=0;s<30000;s+); main() while(1) if(TABLEi!=0x01) P1=TABLEi; i+; DELAY(); else i=0; 匯編程序如下:; 花樣流

5、水燈(8個發光二極管以各種形式循環點亮); 功能:流水燈(8個發光二極管循環以1S間隔以各種形式循環點亮) ORG 0000H ;偽指令,指定程序從0000H開始存放 LJMP MAIN ;跳轉指令,程序跳轉至MAIN處執行 ORG 0030H ;偽指令,指定程序從0030H開始存放MAIN: MOV SP, #60H ;給堆棧指針賦初值 MOV P1,#0FFH ;給P1口賦值 MOV DPTR,#TABLE;查表LIGHT: MOV R4,#42 ;設置循環次數LOOP: MOV A,#42 ;給A賦初值 SUBB A,R4 ;將A的值與R4的值相減,結果存在A中 MOVC A,A+DPT

6、R ;將A+DPTR的值所對應的TABLE中的值賦給A MOV P1,A ;將A的值賦給P1口 LCALL DEL1S ;調用1S延時子程序 DJNZ R4,LOOP ;判斷R4是否為0,不為0跳轉,為0順序執行 LJMP LIGHT ;跳轉指令,跳轉至LIGHT處繼續執行;1S延時子程序(11.0592MHz晶振,誤差0微秒)DEL1S: MOV R5, #089HDL1S0: MOV R6, #0A4HDL1S1: MOV R7, #013H DJNZ R7, $ DJNZ R6, DL1S1 DJNZ R5, DL1S0 RETTABLE: ;定義表格數據DB 0FFH ;全滅DB 0F

7、EH 0FDH 0FBH 0F7H 0EFH 0DFH 0BFH 07FH ;依次逐個點亮DB 0FEH 0FCH 0F8H 0F0H 0E0H 0C0H 080H 000H ;依次逐個疊加DB 080H 0C0H 0E0H 0F0H 0F8H 0FCH 0FEH 0FFH ;依次逐個遞減DB 07EH 0BDH 0DBH 0E7H 0E7H 0DBH 0BDH 07EH ;兩邊靠攏后分開DB 07EH 03CH 018H 000H 000H 018H 03CH 07EH ;兩邊疊加后遞減DB 000H ;全亮 END ;程序結束指令C語言程序如下:/* 該實驗是花樣流水燈(8個發光二極管以各

8、種方式循環點亮),功能是花樣流水燈(8個發光二極管以1S間隔以各種方式循環點亮) */#include/包含reg.52文件#define uint unsigned int/宏定義#define uchar unsigned char/宏定義void delay(uint z);/聲明延時函數uint a;/定義循環用變量uchar code table=0xff,/全滅0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,/依次逐個點亮0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,/依次逐個疊加0x80,0xc0,0xe0,0xf

9、0,0xf8,0xfc,0xfe,0xff,/依次逐個遞減0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e,/兩邊靠攏后分開0x7e,0x3c,0x18,0x00,0x00,0x18,0x3c,0x7e,/兩邊疊加后遞減0x00,/全亮;/定義循環用數據表格/*亮的現象:先是全滅,然后依次逐個點亮,然后依次逐個疊加,然后依次逐個遞減,然后兩邊靠攏后分開,然后兩邊疊加后遞減,最后全亮。循環!*/void main()/main函數 a=0;/給a賦初值 while(1)/while循環 P1=tablea;/將a所在的table中的值賦給P1口 delay(1000

10、);/1S延時子程序 a+;/a的值加一 if(a=42)/測試a是否等于42 a=0;/給a賦值 void delay(uint z)/1ms延時子程序,通過z值改變延時時間 uint x,y; for(x=z;x>0;x-) for(y=110;y>0;y-);/*動態數顯的設計思路,首先是我們要先知道怎樣才能使哪個位亮,顯示的段是什么數值,接下來就是中斷時間的問題了,設計步驟如下,如果要讓八個數碼管靜態顯示1到8,我們可以修改中斷時間,如把50000改成100或更低*/#include<reg52.h> #include<intrins.h>#defi

11、ne uint unsigned int#define uchar unsigned charsbit duan=P26; sbit wei=P27;uchar a,numw,numd;uchar code tabled=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /*第二步驟,創建段顯數值的對碼表09數值.如果要顯示18數值,最好多加前后兩位數0跟9, 因為后面+移位時就能按我們常規順序亮下去,至于如何顯示對應數值請先看數碼顯示電路圖*/ uchar code tablew=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,

12、0xbf,0x7f; /第二步驟,創建位顯,就是顯示的位置,這個碼表相對簡單,用二進制表示1111111001111111,是0的為八位數顯管的位置void main() a=0; /定義個時間函數 numw=0; /附位顯初值為0位 numd=0; /附段顯初值為0位 TMOD=0X01; /第四步驟,附中斷暫存器初值 TH0=(65535-50000)/256; /附中斷請求時間初值,高8位 TL0=(65536-50000)%256; /附中斷請求時間初值,低8位 EA=1; /開啟總中斷 ET0=1; /開啟定時中斷 TR0=1; /啟動定時中斷 while(1) if(a=10) /

13、第三步驟,執行速度,如果等20差不多是1秒,則往下執行,相當于單位數值亮的時間 a=0; /重新附值初值0 numd+; /段顯值+ if(numd=9) /如果段值在對碼表第9位則轉下執行 numd=1; /*重新附值段顯值對應對碼表第1位,因為+所以0位并不在數碼管中顯示. 如果要顯示,也會因為+而在第二輪中顯示出*/ duan=1; /開啟段顯端 P0=tablednumd;/附段顯P0值對應段顯值對碼表 duan=0; /鎖存 wei=1; /開啟位顯端 P0=tablewnumw;/附位顯P0值對應位顯值對碼表 wei=0; /鎖存 numw+; /相當于位顯移位 if(numw=8

14、) /如果位顯值到對應位顯對碼表第八位則轉下執行 numw=0; /重新附值位顯值對應對碼表第0位起/*下面是簡單的單個數碼管顯示例證 第一驟, 修改后在第三步驟內#include"reg52.h"#include"intrins.h"sbit duan=P26; /段顯端口sbit wei=P27; /位顯端口void main() /P0=0xff; 數碼管不顯示任何信號,默認情況下通電本身就不顯示,可以不寫 duan=1; /開啟段顯端口 P0=0x06; /附值段顯數值為1,可以查閱數碼管電路圖相對應顯示的對碼表 duan=0; /鎖存,保持上一步段顯狀態,硬件說明請查閱74HC573功能 wei=1; /開啟位顯端口

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論