① 單片機多級外部中斷控制,請問如何加入流水燈,現在在進行課程設計,迫切需要實現的方法。
功能:先保持全滅一段時間,然後順序點亮8個燈,全亮後再保持一段時間,然後從從頭開始
SS2:
MOV A,#0FFH ;全部熄滅
MOV P1,A ;送顯示
ACALL DELAY1S ;延時一段時間,保持全滅1S
SS1:
RL A ;循環左移1位
CLR ACC.0 ;將最低位置0,點亮1個等
MOV P1,A ;送顯示
ACALL DELAY100ms ;延時一段時間,感覺上100ms比較合適,根據情況自己調整一下
JNZ SS1 ;A不等於0,說明還有燈未點亮,循環繼續下一個
ACALL DELAY1S ;A=0,保持全部點亮1S鍾
JMP SS2 ;再次開始
延時子程序我就不寫了,你應該會的。
建議:牽涉到延時,最好用定時中斷實現,實際運用中ms級的延時一般都會使用中斷實現,否則CPU的資源就浪費了。如果是作業就算了,如果你想學些東西最好用中斷的方式再嘗試一下。
② 單片機C語言編程:控制流水燈
#include<reg52.h>
#include<intrins.h>
#define uintunsignedint
#define ucharunsignedchar
sbitk1=P1^0;//左循環按鈕
sbitk2=P1^1;//右循環按鈕
sbitk4=P1^2;//恢復暫停
sbitk3=P3^2;//暫停
voidinit();
voidshowLED();
voiddelay(uintxms);
uintdelayTime;
uintgoLeft=1;
uintgoRight=0;
uintsFlag=0;
voidmain()
{
init();
while(1)
{
if(k1==0)
{
delay(10);
if(k1==0)
{
while(k1==0);
goLeft=1;
goRight=0;
}
}
if(k2==0)
{
delay(10);
if(k2==0)
{
while(k2==0);
goLeft=0;
goRight=1;
}
}
}
}
voiddelay(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
voidinit()
{
P0=0xfe;
TMOD=0x02;//T0工作模式2自動裝填8位 200us
TH0=0x38;
TL0=0x38;
EA=1;
ET0=1;
TR0=1;
EX0=1;
IT0=1;
}
voidshowLED()
{
if(goLeft==1)
P0=_crol_(P0,1);
if(goRight==1)
P0=_cror_(P0,1);
}
voidmoveDelay()interrupt1 //一次中斷200us
{
if(delayTime==5000)
{
showLED();
delayTime=0;
}
else
delayTime++;
}
voidstopLED()interrupt0
{
while(1)
{
if(k4==0)
{
delay(10);
if(k4==0)
{
while(k4==0);
break;
}
}
}
}
③ 單片機匯編語言流水燈,定時器中斷控制,(500ms)延時
單片機匯編語言流水燈,用定時器中斷控制,可以初始化設置定時器時間(如50mS註定時器最大定時時間到不了500mS,需要加計數存儲,中斷10就是500mS),有多種方式實現如作一個流水狀態表,定時讀取寫入IO埠 表加一,,或者用左移太移等方式都可以實現在,網上有很多這種實例。
④ 51單片機按鍵中斷控制流水燈
#include<reg51.h>
#include<intrins.h>
#defineucharunsignedchar
ucharled,time=0;
sbitkey=P1^0;
voidt0isr()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
led=_crol_(led,1);
P0=led;
time++;
if(time>=200)TR0=0;
}
main()
{
ucharkeyval=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1;
while(1)
{
if(key==0)
{
while(key==0);
keyval++;
keyval%=3;
}
switch(keyval)
{
case0:led=0xff;P0=led;break;
case1:TR0=1;led=0xfe;break;
case2:TR0=0;break;
default:break;
}
}
}
⑤ 單片機外部中斷做流水燈
單片機控制led燈亮和滅,led燈初始狀態從左到右兩個燈間隔一個燈循環亮滅,然後從右到左循環亮滅,,當按下按鍵,led燈全亮,然後全滅。然後再恢復循環。
二、實驗過程
(一)實驗項目的方案分析
1.設計原理
STC12C5A60S2單片機內部包括微處理器、存儲器(存放程序指令或數據的ROM、RAM等)、輸入/輸出口(I/O口)及其他功能部件如定時/計數器、中斷系統等。它們通過地址匯流排、數據匯流排和控制匯流排連接起來。
本實驗充分利用了8051晶元的I/O引腳。系統已採用STC12C5A60S2系列單片機為中心器件來設計數碼管顯示系統,實現數碼管循環顯示。
2.器件配置清單
表1器件配置表
名稱
型號
數值
數量
麵包板
MB-102
165*55*
(二)實驗項目的硬體電路設計
通過Proteus模擬電路軟體搭建電路
(三)實驗項目的程序設計
1、C51程序編寫
2、keil軟體調試截圖
通過Keil軟體進行C51控製程序的編寫,通過不斷調試修改,最終的調試好的Keil
調試無措的Keil程序
(四)實驗項目的虛擬模擬
打開Keil C軟體將上面程序輸入,調試無誤後編譯輸出".hex"文件,打開Proteus軟體,將之前編譯好的".hex"文件加入到晶元中,開始運行模擬。
(五)實驗項目的實際驗證電路及驗證結果
將單片機C51程序編譯無誤後,生成HEX文件,通過STC-ISP下載到單片機中,下載的軟體界面搭建的實際
⑥ 請教單片機利用中斷方式實現流水燈的問題
1.主程序中的for(i=0;i<100;i++);起到短延時的作用,因為send函數並不是執行完就發送完成了,還需要等待iic發送數據
2.send函數中的clk=1;
clk=0;
是輸出了一個跳變,是時鍾線
3.ledp是發送指示燈的開關,在send函數前打開,在send之後關上
⑦ 匯編語言 51單片機,外部中斷控制流水燈
ORG 0000H ; 試試這個 流水燈的編碼隨便改
LJMP MAIN
ORG 0003H
LJMP LINT0
ORG 000BH
LJMP LT0ZD
ORG 0030H
MAIN: MOV SP, #60H
MOV TMOD, #00H
MOV IE, #81H
MOV TL0, #(8192-2500)MOD 32
MOV TH0, #(8192-2500)/32
SETB TR0
MOV R5, #20
LOOP: MOV R3, #48
CJNE R3, #0, $
LJMP LOOP
LINT0: CPL ET0
RETI
LT0ZD: PUSH PSW ; T0 中斷
PUSH ACC
MOV TL0, #(8192-2500)MOD 32
MOV TH0, #(8192-2500)/32
DJNZ R5, LT0Z2
MOV R5, #30 ; 可以調整速度
MOV A, R3
LCALL LSDIN
MOV P1, A
DEC R3
LT0Z2: POP ACC
POP PSW
RETI
LSDIN: MOVC A,@A+PC
RET
LSDBM: DB 11111110B,11111101B,11111011B,11110111B ; 流水燈的編碼1
DB 11101111B,11011111B,10111111B,01111111B
DB 01111111B,10111111B,11011111B,11101111B
DB 11110111B,11111011B,11111101B,11111110B
DB 11111100B,11111001B,11110011B,11100111B ; 流水燈的編碼2
DB 11001111B,10011111B,00111111B,01111110B
DB 01111110B,00111111B,10011111B,11001111B
DB 11100111B,11110011B,11111001B,11111100B
DB 11111000B,11110001B,11100011B,11000111B ; 流水燈的編碼3
DB 10001111B,00011111B,00111110B,01111100B
DB 01111100B,00111110B,00011111B,10001111B
DB 11000111B,11100011B,11110001B,11111000B
END