51單片機8個流水燈編程
① 51單片機8位流水燈8種變化程序
第一種:1個LED發光,循環右移。
第二種:2個LED發光,循環右移。
第三種:3個LED發光,循環右移。
第四種:4個LED發光,循環右移。
再改成左移,就又有四種。
這就有八種了。
一邊移動,一邊閃爍;
再改變一下速度;
這能有多少種了?
② 八隻流水燈當開關k1按下時流水燈循環,開關k2按下時停止循環(循環往復) 單片機c51編程
1. 開外部中斷0,1,控制LED
2. 定義兩個全局標志位,控制主函數裡面的流水燈即可
③ 用51單片機編寫8盞流水燈程序,
ORG0000H
LJMPMAIN
ORG0030H
MAIN:
MOVA,#0FEH
MOVR2,#8
LOOP:
MOVP0,A
LCALLDELAY
RLA
DJNZR2,LOOP
CPLA
LCALLDELAY
CPLA
LCALLDELAY
RLA
LCALLDELAY
CPLA
LCALLDELAY
MOVR2,#7
SJMPMAIN
END
④ 很簡的51單片機c語言流水燈程序
1、51單片機C語言實現循環8個流水燈左移三次,後右移三次。
常式:
#include<reg51.h>//51單片機頭文件
#include<intrins.h>//包含有左右循環移位子函數的庫
#defineuintunsignedint//宏定義
#defineucharunsignedchar//宏定義
sbitbeep=P2^3;
voiddelay(uintz)//延時函數,z的取值為這個函數的延時ms數,如delay(200);大約延時200ms.
{//delay(500);大約延時500ms.
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidmain()//主函數
{
uchara,i,j;
while(1)//大循環
{
a=0xfe;//賦初值
for(j=0;j<3;j++)for(i=0;i<8;i++)//左移三次
{
P1=a;//點亮小燈
beep=0;//開啟蜂鳴器
delay(50);//延時50毫秒
beep=1;//關閉蜂鳴器
delay(50);//再延時50毫秒
a=_crol_(a,1);//將a變數循環左移一位
}
a=0x7f;
for(j=0;j<3;j++)for(i=0;i<8;i++)//右移三次
{
P1=a;//點亮小燈
beep=0;//開啟蜂鳴器
delay(50);//延時50毫秒
beep=1;//關閉蜂鳴器
delay(50);//再延時50毫秒
a=_cror_(a,1);//將a變數循環右移一位
}
}
}
2、51單片機是對所有兼容Intel 8031指令系統的單片機的統稱。該系列單片機的始祖是Intel的8031單片機,後來隨著Flash rom技術的發展,8031單片機取得了長足的進展,成為應用最廣泛的8位單片機之一,其代表型號是ATMEL公司的AT89系列,它廣泛應用於工業測控系統之中。很多公司都有51系列的兼容機型推出,今後很長的一段時間內將佔有大量市場。51單片機是基礎入門的一個單片機,還是應用最廣泛的一種。
⑤ 51單片機中如何用匯編語言編寫流水燈
流水燈就是51單片機控制led燈依次點亮的控制方式。具體程序如下:
ORG 0000H ;復位啟動
AJMP START ;
ORG 001BH ;T1中斷
AJMP T1INT ;
;定義變數========================
YSJS EQU 30H;延時計數器
LED EQU 31H;LED控制緩沖器
;主程序==========================
START: MOV LED,#0FEH ;初始化數據
MOV YSJS,#0 ;
MOV TMOD,#10H ;定時器1工作於方式1,16位定時器
MOV TL1,#0B0H ;設置定時初值
MOV TH1,#3CH ;定時時間=50mS
SETB ET1 ;使能定時器1中斷
SETB TR1 ;啟動定時器1
SETB EA ;開總中斷
MOV P1,LED ;初始化流水燈
LOOP: JMP LOOP ;循環等待中斷
T1INT: PUSH PSW ;定時器1中斷程序
PUSH ACC ;保護現場
MOV TH1,#3CH ;定時時間=50mS
MOV TL1,#0B0H ;
INC YSJS ;
PUSH ACC ;保護ACC
MOV A,YSJI ;
CJNE A,#2,QT1 ;50mS*2=100mS
MOV P1,LED ;
MOV A,LED ;
RL A ;累加器A的值循環左移1位
MOV LED,A ;
MOV YSJS,#0 ;
QT1: POP ACC ;恢復現場
POP PSW ;
RETI ;返回主程序
END ;匯編程序結束
(5)51單片機8個流水燈編程擴展閱讀:
實現流水燈的三個方法:
第一種,匯流排方法實現流水燈。這是一種比較笨但又最易理解的方法,採用順序程序結構,用位指令控制P1口的每一個位輸出高低電平,加上延時函數,即可控制每個LED燈的亮滅。
第二種,移位方法實現流水燈採用循環程序結構編程。首先在程序開始給P1.0口送一個低電平,其它位為高。然後延時一段時間再讓低電平往高位移動,這樣就實現「流水」的效果了。
第三種,庫函數實現流水燈。利用左移函數進行。
⑥ 單片機流水燈C語言程序(8個燈,依次點亮每個燈,延時500MS)
單片機流水燈C語言程序的源代碼如下:
#include //51系列單片機定義文件
#define uchar unsigned char //定義無符號字元
#define uint unsigned int //定義無符號整數
void delay(uint); //聲明延時函數
void main(void)
{
uint i;
uchar temp;
while(1)
{
temp=0x01;
for(i=0;i<8;i++) //8個流水燈逐個閃動
{
P1=~temp;
delay(100); //調用延時函數
temp<<=1;
}
temp=0x80;
for(i=0;i<8;i++) //8個流水燈反向逐個閃動
{
P1=~temp;
delay(100); //調用延時函數
temp>>=1;
}
temp=0xFE;
for(i=0;i<8;i++) //8個流水燈依次全部點亮
{
P1=temp;
delay(100); //調用延時函數
temp<<=1;
}
temp=0x7F;
for(i=0;i<8;i++) //8個流水燈依次反向全部點亮
{
P1=temp;
delay(100); //調用延時函數
temp>>=1;
}
void delay(uint t) //定義延時函數
{
register uint bt;
for(;t;t--)
for(bt=0;bt<255;bt++);
}
(6)51單片機8個流水燈編程擴展閱讀
51單片機流水燈的源代碼如下
#include<reg51.h>
#include<intrins.h>
voiddelay(inta)
{
inti;
while(a--)for(i=0;i<110;i++);
}
main()
{
inti;
while(1)
{
P0=0xfe;
for(i=0;i<8;i++)
{
P0=_crol_(P0,1);
delay(500);
}
}
}
⑦ 51單片機c語言編寫一個流水燈程序,要求如下(不能用數組,8個led指示燈從兩邊往中間移動,然後再分開)
簡單點的,用表格,事先計算好,放到ROM中,用的時候逐行編譯輸出就可以。
復雜點的,開一個緩沖區,用循環程序,根據花樣的不同,每次填充一行,並輸出,然後再計算一下行。除非表格太大,不建議這樣用。
#define len 8
char tablelist[][len] =
{
"",
"",
"",
"",
"",
}
outline( char * s )
{
int i;
for(i=0; i<len; ++i )
{
if ( s[i] == '0' )
{
// 對應的燈亮
}
else
{
// 對應的燈滅
}
}
}
main()
{
for(;;)
{
outline( tablelist[i]);
delay(..);
}
}
⑧ 求一c51單片機,8位流水燈程序
下列程序調試成功。使用晶振為12M。
//軟體延時,使P1口外接的8個發光二極體,以每秒1位的速度,輪流發光。
//發光順序:0123,1234,2345,3456,4567,5670,6701,7012。循環。
//----------------------------
#include<reg52.h>
#include<intrins.h>
unsigned char a;
void main()
{
unsigned char i, j, k;
a = 0x0f;
while(1) {
P1 = a; //假設8個發光二極體接在P1口.
a = _crol_(a, 1);
for(i = 8; i > 0; i--)
for(j = 250; j > 0; j--)
for(k = 250; k > 0; k--);
}
}
//----------------------------
補充提問:0123不是同時亮,而是0 1 2 3 按順序亮,再1234按順序亮...
回答補充提問,改動如下:
#include<reg52.h>
#include<intrins.h>
void main()
{
unsigned char a, b, c, i, j, k;
a = 0xfe;
while(1) {
b = a;
for(c = 0; c < 4; c++) {
P1 = b;
b = _crol_(b, 1);
for(i = 8; i > 0; i--)
for(j = 250; j > 0; j--)
for(k = 250; k > 0; k--);
}
a = _crol_(a, 1);
}
}
⑨ 51單片機流水燈程序
程序如下:
#include <reg52.h>
sbit led1 = P2^0;
sbit led2 = P2^1;
sbit led3 = P2^2;
sbit led4 = P2^3;
sbit led5 = P2^4;
sbit led6 = P2^5;
sbit led7 = P2^6;
sbit led8 = P2^7;
void main()
{
int i,j;
//點亮第一個燈
led1 = 1;
led2 = 0;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 0;
led7 = 0;
led8 = 0;
//延時1秒
for(i = 0;i < 110; ++i)
{
for(j = 0; j < 1000; ++j)
{
;//什麼也不做
}
}
//點亮第二個燈
led1 = 0;
led2 = 1;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 0;
led7 = 0;
led8 = 0;
//點亮剩餘的燈
//省略……
while(1);
}
(9)51單片機8個流水燈編程擴展閱讀:
流水燈幾點說明:
void:因為該延時函數不需要返回值,所以寫為void
delay1s:該函數的函數名,命名需要符合C語言的標識符命名規則。
(): 不需要傳入參數,所以括弧中為空
至此我們可以把流水燈程序寫為以下形式:
⑩ 51單片機匯編控制8個流水燈
思路:
循環控制常亮狀態的值,將其從最高位循環到最低位。這個用於最後狀態的常亮
在常亮循環中,控制不是常亮的其它所有位進行再次循環,逐漸從最低位亮滅循環到最高位
代碼如下:
#include<reg51.h>
unsignedcharPData;//整體結果
unsignedcharCurrData;//變化的最高位
//延時,本函數是非精確延時,若需要精確延遲則需要根據本函數的匯編語句進行精確計算後調整循環體次數
voiddelay(unsignedintms){
unsignedchari;
while(ms--){
for(i=0;i<120;t++){
;
}
}
}
voidmain(){
unsignedchari=0,j=0;
PData=0x00;//全滅狀態
for(i=8;i>0;i--){//控制常亮的位置,先從最高位開始,依次循環到最低位
for(j=0;j<i-1;j++){//從最低位循環到不是常亮的最高位
P1=~(PData+(1<<j));//第i位亮
delay(500);
P1=~PData;//第i位滅
delay(500);
}
PData=PData+(1<<(i-1));//置最高位為常亮狀態
P1=~PData;
delay(500);
}
//停機
while(1){
;
}
}