1. 用AT89C51單片機做循環彩燈實驗
我用的是每50msT1溢出中斷一次#include<reg52.h>#include<intrins.h>#define LedPort P1#define uchar unsigned char#define uint unsigned intsbit led=P1^0;uchar temp1=0xfe,temp2=0xbf;uchar flag,timeNum;void Init(){ TMOD=0x01; TH1=(65536-50000)/256; TL1=(65536-50000)%256; EA=1; ET1=1; TR1=1;}void main(){ Init(); while(1) { }}void timer1() interrupt 3{ TH0=(65536-50000)/256; TL0=(65536-50000)%256; timeNum++; if(timeNum==10) { timeNum=0; if(flag<8) { LedPort=temp1; temp1=_crol_(temp1,1); } else if(flag>=8&&flag<15) { LedPort=temp2; temp2=_cror_(temp2,1); } else if(flag==15) { LedPort=0; } else if(flag==16) { LedPort=0xff; } flag++; if(flag==17) flag=0; }}
2. 這是個單片機控制循環彩燈程序,哪位高手具體解釋下這個程序,實現的彩燈花樣有哪幾種
DB 01H,03H,07H,0FH,1FH,3FH,7FH,0FFH,0FEH,0FCH DB 0F8H,0F0H,0E0H,0C0H,80H,00H,0FFH,00H,0FEH DB 0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH,0BFH,0DFH DB 0EFH,0F7H,0FBH,0FDH,0FEH,00H,0FFH,00H 這個是彩燈循環花樣 其中把十六進制數換成二進制的 是一的位彩燈就亮。比如第一個01H換成二進制就是00000001,所以是第一個燈亮,依此可推出彩燈循環花樣
3. 51單片機循環彩燈12個彩燈依次亮
跑馬燈IC 或直接成品的單片。
4. 基於51單片機的循環彩燈控制設計
老兄,東西不復雜的,自己思考,別碰到1+1的問題也要來問。要給你畫流程,沒人有那麼多時間的,
硬體:51用p1口接電阻驅動三級管,用三極體驅動二極體動作。
軟體:網上很多現成的資料,自己去整理。
;************;
;小燈控製程序;
;************;
;
;************;
;中斷入口程序;
;************;
;
ORG 0000H ;程序執行開始地址
LJMP START ;跳至START執行
ORG 0003H ;外中斷0中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 000BH ;定時器T0中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 0013H ;外中斷1中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 001BH ;定時器T1中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 0023H ;串列口中斷入口地址
RETI ;中斷返回(不開中斷)
;
;************;
; 初始化程序 ;
;************;
;
CLEAR: MOV 20H,#00H ;20H單元內存清0(閃爍標志清0)
SETB 00H ;20H.0位置1(上電時自動執行閃爍功能1)
RET ;子程序返回
;
;************;
; 主 程 序 ;
;************;
;
START:ACALL CLEAR ;調用初始化子程序
MAIN: LCALL KEYWORK ;調用鍵掃描子程序
JB 00H,FUN0 ;20H.0位為1時執行FUN0
JB 01H,FUN1 ;20H.1位為1時執行FUN1
JB 02H,FUN2 ;20H.2位為1時執行FUN2
JB 03H,MAIN ;備用
AJMP MAIN ;返回主程序MAIN
;
;************;
; 功能程序 ;
;************;
;第1種閃爍功能程序
FUN0: MOV A,#0FEH ;累加器賦初值
FUN00:MOV P1,A ;累加器值送至P1口
LCALL DL05S ;延時
JNB ACC.7,MAIN ;累加器最高位為0時轉MAIN
RL A ;累加器A中數據循環左移1位
AJMP FUN00 ;轉FUN00循環
;
;第2種閃爍功能程序
FUN1:MOV A,#0FEH ;累加器賦初值
FUN11:MOV P1,A ;累加器值送至P1口
LCALL DL05S ;延時
JZ MAIN ;A為0轉MAIN
RL A ;累加器A中數據循環左移1位
ANL A,P1 ;A同P1口值相與
AJMP FUN11 ;轉FUN11循環
;
; 第3種閃爍功能程序
FUN2:MOV A,#0AAH ;累加器賦初值
MOV P1,A ;累加器值送至P1口
LCALL DL05S ;延時
CPL A ;A中各位取反
MOV P1,A ;累加器值送至P1口
LCALL DL05S ;延時
AJMP MAIN ;轉MAIN
;************;
; 掃鍵程序 ;
;************;
;
KEYWORK:MOV P3,#0FFH ;置P3口為輸入狀態
JNB P3.0,KEY0 ;讀P3.0口,若為0轉KEY0
JNB P3.1,KEY1 ;讀P3.1口,若為0轉KEY1
JNB P3.2,KEY2 ;讀P3.2口,若為0轉KEY2
JNB P3.3,KEY3 ;讀P3.3口,若為0轉KEY3
RET ;子程序返回
;
;閃爍功能0鍵處理程序
KEY0:LCALL DL10MS ;延時10毫秒消抖
JB P3.0,OUT0 ;P3.0為1,子程序返回(干擾)
SETB 00H ;20H.0位置1(執行閃爍功能1標志)
CLR 01H ;20H.1位清0
CLR 02H ;20H.2位清0
CLR 03H ;20H.3位清0
OUT0:RET ;子程序返回
;
; 閃爍功能1鍵處理程序
KEY1:LCALL DL10MS
JB P3.1,OUT1
SETB 01H ;20H.1位置1(執行閃爍功能2標志)
CLR 00H
CLR 02H
CLR 03H
OUT1:RET
;
;閃爍功能2鍵處理程序
KEY2:LCALL DL10MS
JB P3.2,OUT2
SETB 02H ;20H.2位置1(執行閃爍功能3標志)
CLR 01H
CLR 00H
CLR 03H
OUT2:RET
;
;閃爍功能(備用)鍵處理程序
KEY3:LCALL DL10MS
JB P3.3,OUT3
SETB 03H ;20H.3位置1(執行備用閃爍功能標志)
CLR 01H
CLR 02H
CLR 00H
OUT3:RET
;
;************;
; 延時程序 ;
;************;
;0.5毫秒延時子程序,執行一次時間為513微秒
DL512:MOV R2,#0FFH
LOOP1: DJNZ R2,LOOP1
RET
;
;10毫秒延時子程序(調用20次0.5毫秒延時子程序)
DL10MS:MOV R3,#14H
LOOP2: LCALL DL512
DJNZ R3,LOOP2
RET
;
;延時子程序,改變R4寄存器初值可改變閃爍的快慢(時間為15×25毫秒)
DL05S:MOV R4,#0FH
LOOP3: LCALL DL25MS
DJNZ R4,LOOP3
RET
;
;25毫秒延時子程序,用調用掃鍵子程序延時,可快速讀出功能按鍵值
DL25MS:MOV R5,#0FFH
LOOP4:LCALL KEYWORK
DJNZ R5,LOOP4
RET
END ;程序結束
5. 單片機彩燈循環控製程序(匯編程序)
既然有人答過C語言的,我就寫個匯編的吧。
有點長,放在我的網路空間了:
http://hi..com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/5adeb99112822680a877a415.html
6. 單片機彩燈循環控製程序
ORG 0000H
LJMP MAIN
ORG 4000H
MAIN: MOV A,#0F8H ;用P1低六位控制燈
MOV P1,A
CALL DELAY
CLR A ;取反
MOV P1,A ;點亮下三個,滅上三個
CALL DELAY
LJMP MAIN
DELAY: .......
自己添上吧,很簡單
.......
END
7. 8051單片機,用P0口控制8個LED實現循環彩燈。
跑馬燈。網上一大把。
我就解釋下間隔一秒的那個,時間常數。
看你用的定時器方式。一般用方式1。若頻率是24mhz,機器周期為0.5us。所以計數次數為1s/0.5us=200000次超過了范圍。所以用循環。可以50000循環4次或其他次數。算出技術初值。
8. 單片機程序設計 循環彩燈
我用的是每50msT1溢出中斷一次
#include<reg52.h>
#include<intrins.h>
#define LedPort P1
#define uchar unsigned char
#define uint unsigned int
sbit led=P1^0;
uchar temp1=0xfe,temp2=0xbf;
uchar flag,timeNum;
void Init()
{
TMOD=0x01;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET1=1;
TR1=1;
}
void main()
{
Init();
while(1)
{
}
}
void timer1() interrupt 3
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
timeNum++;
if(timeNum==10)
{
timeNum=0;
if(flag<8)
{
LedPort=temp1;
temp1=_crol_(temp1,1);
}
else if(flag>=8&&flag<15)
{
LedPort=temp2;
temp2=_cror_(temp2,1);
}
else if(flag==15)
{
LedPort=0;
}
else if(flag==16)
{
LedPort=0xff;
}
flag++;
if(flag==17)
flag=0;
}
}也可以用編碼表的方式,把燈亮滅的情況放在數組里,中斷里再用
9. 求單片機彩燈循環控製程序
ORG0000H
AJMPMAIN
ORG0100H
MAIN:JBP2.0,m1
JBP2.1,m2
JBP2.2,m3
JBP2.3,m4
JBP2.4,m5
JBP2.5,m6
JBP2.6,m7
JBP2.7,m8
SJMPMAIN
m1:MOVR1,#02H;四亮四閃
LOOP:MOVP1,#00H
XRLA,#0AAH
MOVP1,A
CALLDELAY
DJNZR1,LOOP
SJMPMAIN
m2:MOVR1,#08H;向右閃爍
MOVA,#0FEH
LOOP1:MOVP1,A
CALLDELAY
RLA
DJNZR1,LOOP1
SJMPMAIN
m3:MOVR1,#02H;整體閃爍
LOOP2:MOVP1,#00H
CALLDELAY
MOVP1,#0FFH
CALLDELAY
DJNZR1,LOOP2
SJMPMAIN
m4:MOVR1,#08H;奇數向右閃爍
MOVA,#0AAH
LOOP3:MOVP1,A
RRA
CALLDELAY
DJNZR1,LOOP3
SJMPMAIN
m5:MOVR1,#08H;兩邊中間
LOOP4:MOVP1,#3CH
CALLDELAY
MOVP1,#0C3H
CALLDELAY
;MOVP1,#7EH
;CALLDELAY
;MOVP1,#0BDH
;CALLDELAY
;MOVP1,#0DBH
;CALLDELAY
;MOVP1,#0E7H
;CALLDELAY
DJNZR1,LOOP4
SJMPMAIN
m6:MOVR1,#04H
LOOP5:MOVP1,#0F0H;亮一半滅一半
CALLDELAY
MOVP1,#0FH
CALLDELAY
DJNZR1,LOOP5
JMPMAIN
m7:MOVR1,#02H;中間往兩邊滅
LOOP6:MOVP1,#00H
CALLDELAY
MOVP1,#18H
CALLDELAY
MOVP1,#3CH
CALLDELAY
MOVP1,#7EH
CALLDELAY
MOVP1,#0FFH
CALLDELAY
DJNZR1,LOOP6
LJMPMAIN
m8:MOVR1,#01H;雙燈循環
LOOP7:MOVP1,#3FH
CALLDELAY
MOVP1,#0FCH
CALLDELAY
MOVP1,#0CFH
CALLDELAY
MOVP1,#0F3H
CALLDELAY
DJNZR1,LOOP7
JMPMAIN
DELAY:MOVR5,#10
DEL1:MOVR7,#200
DEL:MOVR6,#123
NOP
NOP
DJNZR6,$
DJNZR7,DEL
DJNZR5,DEL1
RET
就是沒有數碼管顯示!一共八種模式!
10. 求用單片機製作的循環彩燈原理圖及程序
不用154這么麻煩吧,直接把16個燈分別串1K電阻 從P1+P2口就接到行了
#include"reg52.h"
void delay(unsigned int m)
{
unsigned int j=0;
while(m--)for(j=0;j<125;j++){;}
}
void mian(void)
{
while(1)
{
P1=0x01;delay(500);
P1=0x02; delay(500);
P1=0x04; delay(500);
P1=0x08; delay(500);
P1=0x10; delay(500);
P1=0x20; delay(500);
P1=0x40; delay(500);
P1=0x80; delay(500);
P1=0x00;
P2=0x01;delay(500);
P2=0x02; delay(500);
P2=0x04; delay(500);
P2=0x08; delay(500);
P2=0x10; delay(500);
P2=0x20; delay(500);
P2=0x40; delay(500);
P2=0x80; delay(500);
P2=0x00;
}
}