❶ 51單片機八個燈的流水燈代碼
51單片機八個燈的流水燈代碼:
1、用精確定時的方法,設置流水燈運行時的時間間隔,延時時間為500MS。
2、#include "reg51.h"首先寫出單片機的頭函數。
3、#include "intrins.h"輸入位移函數。
4、unsigned int count=0,led;定義函數。
5、輸入主函數,定義單片機的埠,寫入延時函數。
編輯推薦
對於剛接觸單片機的學習者,似乎都很迷茫,C語言、匯編語言、電路、開發板,不知道從哪兒開始學起。其實在學習單片機原理與應用系統開發時,只有在學習一些理論知識的基礎上,多閱讀單片機應用系統開發案例,注重單片機應用系統開發實踐訓練,才能透徹地理解和掌握單片機結構與原理,才能更快更好地掌握單片機應用知識和單片機應用系統開發技能。
❷ 基於51單片機紅外遙控代碼(C語言)
以下文件是51單片機實現遙控解碼,通過數碼管顯示鍵碼的程序,P0口驅動數碼管段選,p2.6和p2.7為數碼管位選,接收頭連到P3.2口。此程序以通過驗證,可以直接編譯使用,另外還有一個繼電器和蜂鳴器的控制,不用可以屏蔽掉。
;********************************************************************************
;* 描述: *
;* 遙控鍵值讀取器 *
;* 數碼管顯示, P0口為數碼管的數據口 *
;* *
;********************************************************************************
;遙控鍵值解碼-數碼管顯示 *
;********************************************************************************/
#include <reg51.h>
#include <intrins.h>
void IR_SHOW();
void delay(unsigned char x);//x*0.14MS
void delay1(unsigned char ms);
void beep();
sbit IRIN = P3^2;
sbit BEEP = P3^7;
sbit RELAY= P1^3;
sbit GEWEI= P2^7;
sbit SHIWEI= P2^6;
unsigned char IRCOM[8];
unsigned char code table[16] =
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
main()
{
IE = 0x81; //允許總中斷中斷,使能 INT0 外部中斷
TCON = 0x1; //觸發方式為脈沖負邊沿觸發
delay(1);
IRIN=1;
BEEP=1;
RELAY=1;
for(;;)
{
IR_SHOW();
}
} //end main
void IR_IN() interrupt 0 using 0
{
unsigned char i,j,k,N=0;
EA = 0;
I1:
for (i=0;i<4;i++)
{
if (IRIN==0) break;
if (i==3) {EA =1;return;}
}
delay(20);
if (IRIN==1) goto I1; //確認IR信號出現
while (!IRIN) //等 IR 變為高電平
{delay(1);}
for (j=0;j<4;j++)
{
for (k=0;k<8;k++)
{
while (IRIN) //等 IR 變為低電平
{delay(1);}
while (!IRIN) //等 IR 變為高電平
{delay(1);}
while (IRIN) //計算IR高電平時長
{
delay(1);
N++;
if (N>=30) {EA=1;return;}
}
IRCOM[j]=IRCOM[j] >> 1;
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
IRCOM[5]=IRCOM[2] & 0x0F;
IRCOM[6]=IRCOM[2] & 0xF0;
IRCOM[6]=IRCOM[6] >> 4;
beep();
EA = 1;
}
void IR_SHOW()
{
P0 = table[IRCOM[5]];
GEWEI = 0;
SHIWEI = 1;
delay1(4);
P0 = table[IRCOM[6]];
SHIWEI = 0;
GEWEI = 1;
delay1(4);
}
void beep()
{
unsigned char i;
for (i=0;i<100;i++)
{
delay(5);
BEEP=!BEEP;
}
BEEP=1;
}
void delay(unsigned char x)//x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
void delay1(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i<120; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
❸ 51單片機能DIY哪些小東西
51單片機能DIY:
1.
多功能時鍾,秒錶,報警器,計數器,紅外門禁檢測,密碼門;
2.
計算器,能想到的東西都可以啊,還有溫濕度等付感器相關的;
3.
或者電壓表,電流表,測電阻的,測電容電感的,無線通信類的東西,或者電源逆變之類的;
4.
還有機械控制電機之類的。
❹ 求51單片機代碼詳細注釋/解釋
首先,這代碼不全……
其次,你需要解釋哪些東西?這程序主體包含讀卡頭初始化、液晶初始化、顯示時間/字元串等多種功能,基本上就是做個帶液晶顯示的讀卡器。
❺ 朋友們幫忙寫個51單片機的按鍵小程序匯編的
(1);P3.3小鍵盤清告按下P1.3亮再按0.5秒滅。
org 0000h
ajmp main0
org 0080h
MAIN0:
CLR 21H ;清標志
main:
mov c,p3.3 ;檢測按鍵
jc main
MOV R6,#200 ;設定延時
MOV R7,#200
TT0:
JNB 21H,TT2 ;檢測燈狀態
tt:
mov c,p3.3 ;檢測按鍵
jnc tt1
JNB 20H,MAIN ;檢測時間標志
CLR 20H
AJMP TT3
TT2:
mov c,p3.3 ;檢測按鍵
jnc tt2
TT3:
CPL 21H ;改變燈狀態
cpl p1.3
ajmp main
TT1: NOP ;延時但不是子程序
NOP
NOP
NOP
NOP
NOP
DJNZ R6,TT
MOV R6,#200
DJNZ R7,TT
MOV R7,#200
SETB 20H
AJMP TT
end
(2)數碼管數據 p0,數碼管控制p2 獨立按鍵p1口 ,;對獨立鍵進行按鍵次數計數,三位數碼管顯示。 *
;K1按下後,進行加1計數 *
;K2按下後,進行減1計數。 *
;K3按下後,進行加5計岩正磨數。 *
;K4按下後,清計數單元,數碼管顯示0。 *
;按住鍵可以快速計數。
K1 BIT P1.4
K2 BIT P1.5
K3 BIT P1.6
K4 BIT P1.7
K_OLD EQU 30H
K_NEW EQU 31H
K_COUNT EQU 32H
DISSTART EQU 40H ;顯示單元首地址
LED_DATA EQU P0 ;數碼管數據口定粗斗義
;---------------------------------------------------------
ORG 0000H
JMP MAIN
ORG 0080H
;---------------------------------------------------------
MAIN:
MOV SP,#60H
MOV P1,#0FFH
MOV P0,#0FFH
MOV K_OLD,#00H
MOV K_COUNT,#00H
MAIN1:
CALL CONVT
CALL PLAY
CALL KEY_PROG
JMP MAIN1
KEY_PROG:
CALL K_SCAN ;鍵掃描
MOV A,K_NEW
CJNE A,K_OLD,KEY_P1
JMP KEY_P_END
KEY_P1:
MOV R4,#20
KEY_P2:
CALL CONVT ;用顯示程序來進行鍵延時
CALL PLAY
DJNZ R4,KEY_P2
CALL K_SCAN ;再判斷鍵是否按下
MOV A,K_NEW
CJNE A,K_OLD,KEY_P3
JMP KEY_P_END
KEY_P3:
JB ACC.0,LOOP1 ;K1按下
JB ACC.1,LOOP2 ;K2按下
JB ACC.2,LOOP3 ;K3按下
JB ACC.3,LOOP4 ;K4按下
JMP KEY_P_END
LOOP1:
INC K_COUNT ;鍵計數加1
JMP KEY_P_END
LOOP2:
DEC K_COUNT ;鍵計數減1
JMP KEY_P_END
LOOP3:
INC K_COUNT ;鍵計數加5
INC K_COUNT
INC K_COUNT
INC K_COUNT
INC K_COUNT
JMP KEY_P_END
LOOP4:
MOV K_COUNT,#00H ;鍵計數單元清零
KEY_P_END:
RET
;---------------------------------------------------------
;代碼變換 (HEX TO BCD)
;---------------------------------------------------------
CONVT:
MOV A,K_COUNT
MOV B,#100
DIV AB
MOV DISSTART+2,A ;百位存放在DISSTART+2
MOV A,#10
XCH A,B
DIV AB
MOV DISSTART+1,A ;十位存放在DISSTART+1
MOV DISSTART,B ;個位存放在DISSTART
RET
;---------------------------------------------------------
; 鍵掃描子程序
;---------------------------------------------------------
K_SCAN:
MOV P1,#0FFH
MOV K_NEW,#00H
MOV A,P1
CPL A
ANL A,#0F0H
SWAP A
MOV K_NEW,A
RET
;---------------------------------------------------------
;延時子程序
;---------------------------------------------------------
DELAY:
MOV R6,#200
DEL:
MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DEL
RET
;---------------------------------------------------------
PLAY:
MOV R0,#DISSTART ;獲得顯示單元首地址
MOV R1,#07FH ;從第一個數碼管開始
MOV R2,#03H ;共顯示3位數碼管
DISP1:
MOV A,@R0 ;獲得當前位地址
MOV DPTR,#TAB_NU ;獲得表頭
MOVC A,@A+DPTR ;查表獲得顯示數據
MOV LED_DATA,A ;顯示數據
MOV P2,R1 ;開始顯示當前位
MOV A,R1 ;准備顯示下一位
RR A
MOV R1,A ;下一位
INC R0 ;取下一個單元地址
LCALL DELAY2MS ;延時 2 MS
DJNZ R2,DISP1 ;重復顯示下一個
MOV P2,#0FFH ;關閉顯示
RET ;顯示完成,返回
;---------------------------------------------------------
;延時子程序
;---------------------------------------------------------
DELAY2MS:
MOV R6,#10
DEL1:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DEL1
RET
TAB_NU:
db 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h ;字形代碼表
;**********************************************************
END
兩個例子我想夠你明白的了。詳細的解釋,代表性的例子,可慢慢學習
❻ 求51單片機8x8點陣的,各種流動效果代碼,多謝
#include <REG51.H>
unsigned char code taba[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code tabb[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void delay1(void)
{
unsigned char i,j,k;
for(k=10;k>0;k--)
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
void main(void)
{
unsigned char i,j;
while(1)
{
for(j=0;j<3;j++)////from left to right 3 time
{
for(i=0;i<8;i++)
{
P2=taba[i];
P0=0xff;
delay1();
}
}
for(j=0;j<3;j++)////from right to left 3 time
{
for(i=0;i<8;i++)
{
P2=taba[7-i];
P0=0xff;
delay1();
}
}
for(j=0;j<3;j++)////from top to bottom 3 time
{
for(i=0;i<8;i++)
{
P2=0x00;
P0=tabb[7-i];
delay1();
}
}
for(j=0;j<3;j++)////from bottom to top 3 time
{
for(i=0;i<8;i++)
{
P2=0x00;
P0=tabb[i];
delay1();
}
}
}
}
第二種:
/*****************************************************************************************
* *
* LED點陣實驗(流動顯示1 2 3 4 5 6 7 8 9) *
* 說明 通過P0 和 P2 作為點陣介面 *
*要求學員掌握 LED點陣的工作原理和 各點陣腳的定義及接法,具體接線請參考接線說明 *
*我們採用的LED點陣式是低功耗,在做實驗時可以用單片機腳直接驅動 *
******************************************************************************************/
#include<reg51.h>
unsigned char code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code digittab[18][8]={
{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, //0
{0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00}, //1
{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00}, //2
{0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00}, //3
{0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00}, //4
{0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00}, //5
{0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00}, //6
{0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00}, //7
{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00}, //8
{0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00}, //9
{0x00,0x00,0x7F,0x48,0x48,0x30,0x00,0x00}, //P
{0x00,0x00,0x7F,0x48,0x4C,0x73,0x00,0x00}, //R
{0x00,0x00,0x7F,0x49,0x49,0x49,0x00,0x00}, //E
{0x00,0x00,0x3E,0x41,0x41,0x62,0x00,0x00}, //C
{0x00,0x00,0x7F,0x08,0x08,0x7F,0x00,0x00}, //H
{0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00}, //I
{0x00,0x7F,0x10,0x08,0x04,0x7F,0x00,0x00}, //N
{0x7C,0x48,0x48,0xFF,0x48,0x48,0x7C,0x00} //中
};
unsigned int timecount;
unsigned char cnta;
unsigned char cntb;
void main(void)
{
TMOD=0x01;
TH0=(65536-3000)/256;
TL0=(65536-3000)%256;
TR0=1; //開啟定時0
ET0=1;
EA=1; //開啟中斷
cntb=0;
while(1)
{ ;
}
}
/*************************************************
*
* 定時中斷
********************************************************/
void t0(void) interrupt 1 using 0
{
TH0=(65536-3000)/256; //定時器高位裝載數據
TL0=(65536-3000)%256; //定時器低位裝載數據
if(cntb<18) //紅色
{
P1=0xFF;
P2=tab[cnta];
P0=digittab[cntb][cnta];
}
else //綠色
{
P2=0xFF;
P1=tab[cnta];
P0=digittab[cntb-18][cnta];
}
if(++cnta>=8) cnta=0;
if(++timecount>=333)
{
timecount=0;
if(++cntb>=36)cntb=0;
}
}
別忘了採納和給分,互利共贏啊!
❼ 51單片機代碼(定時器/計數器實驗)求詳細注釋,非常謝謝
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0_INT
ORG 0100
MAIN:
MOV TMOD,#01H ;定時器0設為模式1
MOV TH0,#0D8H ;賦初值(65536-10000)
MOV TL0,#0F0H
MOV A,#00H ;A=0
MOV P1,A ;P1=A
MOV R0,#20 ;R2=20
SETB EA ;開中斷
SETB ET0 ;開定時器0中斷
SETB TR0 ;啟動定時器0
LOOP: NOP ;空操作
LJMP LOOP ;轉LOOP
T0_INT:
MOV TH0,#0D8H ;重賦初值
MOV TL0,#0F0H
DJNZ R0,OUT ;R0減1不為0轉OUT
MOV R0,#20H ;R0重賦初值
CPL A ;A取反
MOV P1,A ;P1=A
OUT: RETI
END
;該程序結果在P1上產生周期為400毫秒的脈沖輸出,控制LED燈的話,以400毫秒周期閃爍
❽ 求一個51單片機太陽能控制器的代碼~!!!
/*******************************************************
* 程序名稱:main.c
* 程序功能:主程序文件
* 程序作者:吳鑒鷹
* 創建時間:2014-3-10
* 修改時間:
* 程序版本:V0.1
******************************************************/
/*
* 包含的頭文件
*/
#include "reg51.h"
#include "inc/hc595.h"
#include "inc/delay.h"
#include "intrins.h"
/* 存儲待發送的數據 */
code unsigned char ucDataOneTab[16] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
code unsigned char ucDataTwoTab[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x02, 0x04, 0x08, 0x10, 0x20,0x40,0x80};
//code unsigned char ucDataOneTab[16] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
//code unsigned char ucDataTwoTab[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0x40, 0x20, 0x10, 0x08, 0x04,0x02,0x01};
/******************************************************
* 函數名稱:main
* 函數功能:主函數
* 入口參數:void
* 出口參數:
*******************************************************/
int main()
{
unsigned int i;
while (1)
{
for (i = 0; i < 16; i++ ) //改成16個依次亮i<8改成i<16
{
SendData(ucDataOneTab[i], ucDataTwoTab[i]);
Delay1ms(1000);
}
}
return 0;
}