① 我是一個單片機初學者,我想問一下我需要學哪些知識
我覺得首先要看懂111條指令,懂意思就行,根本就不需要每一條都記住,因為常用的都只有四五十條罷了。那麼多的指令意在可以用多種語句實現同一種功能。
還有就是一定要實際的編程,這一點是非常重要的,只有在實際編程中才能熟悉指令的應用,當然你或許會問自己什麼都不懂怎麼編程啊,這時候你不要著急,你可以你買一本書,有實際的例子的書,我也見過有這種書但是名字我忘記了,它每個例子是講得十分詳細,有匯編的代碼,也有C語言的代碼,而且每一行都有注釋(名字我忘記了只記得那封皮是黑色的)你可以仿照它的代碼寫寫看,再模擬一下,或者在實際的板子上試試看能不能實現功能,別人的程序修改了能用在自己的板子上那麼就是自己的程序了。
至於模擬軟體我建議用protues,專用的單片機模擬軟體。
如果是自學,那麼不懂的地方可以上網收索或者上論壇詢問,這里有個單片機的QQ群,是官方建的你可以加上一起學習討論群號是:7344883
還有在了解指令的同時你要了解你的板子的結構亦即電路連接才能寫好你的程序。
當你學到一定程度的時候你可以學習一下單片機的外圍電路設計比如液晶顯示啊,A/D轉換啊什麼的....
總之,實際編程練習是學好單片機的唯一途徑,至於它和匯編的關系,樓上的哥們兒已解釋得十分清楚了的,就不多說了,免得啰嗦。
最後,祝你成功!!!
② 單片機流水燈程序
我是一名多年的單片機工程師,下面的程序你參考一下
效果圖
程序如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint i;
uchar j;
void delay_ms(uint k) //延時子程序
{
for(i=0;i<k;i++)
{
for(j=0;j<230;j++)
{
;
}
}
}
main()
{
uchar a,b;
P1=0xfe;
delay_ms(500);
b=P1;
while(1)
{
for(a=0;a<3;a++)
{
b=_crol_(b,1);
P1=b;
delay_ms(500);
}
P1=0xf0;
delay_ms(500);
P1=0xfe;
delay_ms(500);
b=P1;
}
}
如果你想學習更多單片機和程序的知識,可以看看我整理好的「17個實驗學會單片機」,網路一下「17個實驗學會單片機」就可以看到在首頁了。
③ 如何用單片機做流水燈
因為電路用單片機控制,所以電路非常簡潔。其電路原理圖見下圖,印製板圖如下圖所示。
電路的核心部分是AT89C2051單片機,前面提到它有Pl和P3兩組I/O口,我們這里只用到Pl口,共8個引腳。圖中Cl、R9組成典型的上電復位(即在加電時單片機復位)電路,XTAL、C2、C3與AT89C2051片內振盪電路組成時鍾振盪器。值得注意的是,C2、C3的容量不能與圖中數值偏差太大,否則可能引起不起振或振盪不穩定。XTAL的頻率可以在4-20MHz之間,不過,頻率的變化會導致程序運行速度的變化,這樣就需要調整延時子函數的參數。事實上,不調整參數亦可,只是此時延遲時間不再是1秒,其延遲時間會隨著XTAL頻率的降低而增加。
二、軟體部分
本程序包含兩個函數,一個是主函數,另一個是延時子函數。源程序如下(為了便於講解,我們為每行程序加上了編號):
程序各行作用如下:
00行:把AT89C2051的頭文件「AT89x051.H」包含進來。
01行:聲明Delay()延時子函數,該函數有一個無符號整型參數k,同時函數前面的void表明函數不返回函數值。
02行:延時子函數的開始,同時聲明兩個無符號整型變數i和j。
不過請注意,這里沒有象上期的程序一樣,把表示函數開始的「{」單獨成行,而是把下一行寫在一起了。事實上,寫C程序的時候,可以把多行寫作一行,C編譯器只要遇到分號就認為是一行語句的結束。
當然,我們不能因為C程序有這個特點,就隨意把多行合作一行書寫,實際書寫C程序的時候,還是要養成良好的程序書寫習慣,按照約定俗成的原則來書寫。
03行:聲明for()循環。這個循環的初始條件是i=0,終止條件是i<k,循環計數是每循環一次,用手計數的變數i加1。因此,這個循環的循環次數就是k次。這樣,只要改變k的值(即改變Delay()延時子函數的參數k的值),就可以很容易地控制循環次數,從而獲得不同的延時時間。
04行:聲明嵌套在03循環中的一個新的for()循環,這個循環與上一個循環相似,其循環次數是120次。本循環與上一個循環嵌套後,使得總的循環次數達120×k次。
05行:第一個分號,表示L條空語句,佔用一個機器時間,以實現延時的目的。後面的兩個「}」中,第一個「}」是04行for()循環的結束標志,程序遇到它時,將自動返回04行,使用於循環計數的變數j加1,同時判斷j是否小於120,如果否,則轉入05行;第二個是03行for()循環的結束標志,程序遇到它則會返回03行
④ 51單片機實現流水燈
用個移位處理就行了 set(void) { 流水燈.c * 描述 : 該程序實現LED的流水燈顯示。 該程序用於學習 LED流水本例中是調用的 intrins.h 中的
⑤ 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);
}
流水燈幾點說明:
void:因為該延時函數不需要返回值,所以寫為void
delay1s:該函數的函數名,命名需要符合C語言的標識符命名規則。
(): 不需要傳入參數,所以括弧中為空
至此我們可以把流水燈程序寫為以下形式:
⑥ 很簡的51單片機C語言流水燈程序
1、51單片機C語言實現循環8個流水燈左移三次,後右移三次。
常式:
#include<reg51.h> //51單片機頭文件
#include <intrins.h> //包含有左右循環移位子函數的庫
#define uint unsigned int //宏定義
#define uchar unsigned char //宏定義
sbit beep=P2^3;
void delay(uint z) //延時函數,z的取值為這個函數的延時ms數,如delay(200);大約延時200ms.
{ //delay(500);大約延時500ms.
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main() //主函數
{
uchar a,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單片機是基礎入門的一個單片機,還是應用最廣泛的一種。
⑦ 單片機流水燈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++);
}
(7)單色流水燈單片機擴展閱讀
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);
}
}
}
⑧ 如何用單片機簡單製作一個流水燈
工具:STC系列51單片機、串口轉換器(USB轉TTL 或232轉TTL)
材料:實驗板一塊(可以買現成的,也可以買麵包板自己搭建),電阻、LED燈 若干,5V電源等。
以下程序可以直接用Keil C 直接編譯執行。
//可以通過左移函數_crol_()和右移函數_cror_()來實現LED等的來迴流動。
//具體實現方法可以參考如下程序:
#include<reg51.h>
#include<intrins.h>
#defineuintunsignedint
#defineucharunsignedchar
voiddelay(uinta);
voidmain()
{
P1=0xfe;
while(1)
{
//向左循環點亮LED
for(i=0;i<7;i++)
{
P1=_crol_(P1,1);//左移一位,點亮下一位LED
delay(55);
}
//向右循環點亮LED
for(i=0;i<7;i++)
{
P1=_cror_(P1,1);//右移一位,,點亮上一位LED
delay(55);
}
}
}
//延時函數,延時a毫秒
voiddelay(uinta)
{
uintx,y;
for(x=a;x>0;x--)
for(y=110;y>0;y--);
}
⑨ 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 ;匯編程序結束
(9)單色流水燈單片機擴展閱讀:
實現流水燈的三個方法:
第一種,匯流排方法實現流水燈。這是一種比較笨但又最易理解的方法,採用順序程序結構,用位指令控制P1口的每一個位輸出高低電平,加上延時函數,即可控制每個LED燈的亮滅。
第二種,移位方法實現流水燈採用循環程序結構編程。首先在程序開始給P1.0口送一個低電平,其它位為高。然後延時一段時間再讓低電平往高位移動,這樣就實現「流水」的效果了。
第三種,庫函數實現流水燈。利用左移函數進行。
⑩ 單片機,流水燈
下圖為主控晶元和流水燈模塊的原理圖。流水燈模塊接在單片機的P1口,由原理圖可以知道,在P1口給一個低電平即可點亮LED燈。相反,如果要LED燈熄滅,就要把P1口的電平變為高電平即可。要實現流水燈功能,我們只要將LED1~LED8依次點亮、熄滅,依始類推,8隻LED變會一亮一暗的做流水燈了。
基於單片機的流水燈介紹_51單片機流水燈的五種實現方法
基於單片機的流水燈介紹_51單片機流水燈的五種實現方法
實現8個LED流水燈程序用中文表示為:P1.0低、延時、P1.0高、P1.1低、延時、P1.1高、P1.2低、延時、P1.2高、P1.3低、延時、P1.3高、P1.4低、延時、P1.4高、P1.5低、延時、P1.5高、P1.6低、延時、P1.6高、P1.7低、延時、P1.7高、返回到開始、程序結束。
1、通過改變賦值實現流水燈
void main()
{ while(1) {
P2=0xfe;
delay1ms(500); P2=0xfd; delay1ms(500); P2=0xfb;
delay1ms(500); P2=0xf7; delay1ms(500); P2=0xef; delay1ms(500); P2=0xdf;
delay1ms(500); P2=0xbf; delay1ms(500); P2=0x7f;
delay1ms(500); } }
2、通過公式運算實現流水燈
void main() {
while(1) {
uinta,b=1; P2=0xfe; delayms(500); for(a=0;a<7;a++)
P2-=b; // P2=P2-b delayms(500); b=b*2; //都化為同一類型進制運算 } } }
3、通過操作符<<與「|」實現流水燈 (通過移位實現流水燈)
void main() {
uchara,i;
while(1) {
a=0xfe; //點亮第一位LED燈 for(i=0;i<8;i++)
{ P2=a;
a=a<<1; //左移一位
a=a|0x01; //左移一位後與0x01相或,保證左移後最低位為1 delay_ms(500); } } }
4、通過庫函數_crol_(字元左移)實現流水燈
void main()
{
uint a; a=0xfe; while(1) {
P2=a;a=_crol_(a,1); delay_ms(500); } }
5、採用數組實現流水燈
uchar code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void main(void) {
uchari;
while (1) {
for(i=0;i<8;i++) //循環點亮8隻LED燈 {
P2=table[i];
delay_ms(500); //延時500毫秒 } } }