『壹』 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單片機執行程序的過程
單片機執行程序的過程,實際上就是執行我們所編製程序的過程。即逐條指令的過程。計算機每執行一條指令都可分為三個階段進行。即取指令-----分析指令-----執行指令。
取指令的任務是:根據程序計數器PC中的值從程序存儲器讀出現行指令,送到指令寄存器。
分析指令階段的任務是:將指令寄存器中的指令操作碼取出後進行解碼,分析其指令性質。如指令要求操作數,則尋找操作數地址。
計算機執行程序的過程實際上就是逐條指令地重復上述操作過程,直至遇到停機指令可循環等待指令。
一般計算機進行工作時,首先要通過外部設備把程序和數據通過輸入介面電路和數據匯流排送入到存儲器,然後逐條取出執行。但單片機中的程序一般事先我們都已通過寫入器固化在片內或片外程序存儲器中。因而一開機即可執行指令。
下面我們將舉個實例來說明指令的執行過程:
開機時,程序計算器PC變為0000H。然後單片機在時序電路作用下自動進入執行程序過程。執行過程實際上就是取出指令(取
出存儲器中事先存放的指令階段)和執行指令(分析和執行指令)的循環過程。
例如執行指令:MOV A,#0E0H,其機器碼為「74H E0H」,該指令的功能是把操作數E0H送入累加器,
0000H單元中已存放74H,0001H單元中已存放E0H。當單片機開始運行時,首先是進入取指階段,其次序是:
1 程序計數器的內容(這時是0000H)送到地址寄存器;
2 程序計數器的內容自動加1(變為0001H);
3 地址寄存器的內容(0000H)通過內部地址匯流排送到存儲器,以存儲器中地址解碼電跟,使地址為0000H的單元被選中;
4 CPU使讀控制線有效;
5 在讀命令控制下被選中存儲器單元的內容(此時應為74H)送到內部數據匯流排上,因為是取指階段,所以該內容通過數據匯流排被送到指令寄存器。
至此,取指階段完成,進入解碼分析和執行指令階段。
由於本次進入指令寄存器中的內容是74H(操作碼),以解碼器解碼後單片機就會知道該指令是要將一個數送到A累加器,而該數是在這個代碼的下一個存儲單元。所以,執行該指令還必須把數據(E0H)從存儲器中取出送到CPU,即還要在存儲器中取第二個位元組。其過程與取指階段很相似,只是此時PC已為0001H。指令解碼器結合時序部件,產生74H操作碼的微操作系列,使數字E0H從0001H單元取出。因為指令是要求把取得的數送到A累加器,所以取出的數字經內部數據匯流排進入A累加器,而不是進入指令寄存器。至此,一條指令的執行完畢。單片機中PC=0002H,PC在CPU每次向存儲器取指或取數時自動加1,單片機又進入下一取指階段。這一過程一直重復下去,直至收到暫停指令或循環等待指令暫停。CPU就是這樣一條一條地執行指令,完成所有規定的功能。
『叄』 跪求一個51單片機控制ws2812燈帶的程序,
WS2812是一種自帶驅動IC的LED燈珠,可以通過程序控制每個LED的顏色和亮度。以下是一個簡單的程序,用於控制144個WS2812 LED燈珠。這個程序是用C語言編寫的,用於STC89C52RC單片機。
首先,我們需要知道WS2812數據傳輸協議的一些基本概念。WS2812 LED燈珠需要接收24位數據,每8位代表一個顏色(紅色,綠色,藍色)。數據以GRB順序發送,即先發送綠色,然後是紅色,最後是藍色。每一位數據由一個高電平脈沖和一個低電平脈沖組成。如果高電平脈沖長於低電平脈沖,那麼這一位被認為是1;如果低電平脈沖長於高電平脈沖,那麼這一位被認為是0。
以下是一個示常式序:
```c
#include <reg51.h>
#define F_CPU 11059200UL // 11.0592 MHz
#define DELAY_COEFFICIENT 12 // 延遲系數
// 定義埠
sbit LED = P1^0;
// 延遲函數
void delay(unsigned int us)
{
while (us--);
}
// 發送一個比特
void send_bit(unsigned char bit_val)
{
if(bit_val)
{
// 發送邏輯1
LED = 1;
delay(DELAY_COEFFICIENT);
LED = 0;
delay(DELAY_COEFFICIENT / 3);
}
else
{
// 發送邏輯0
LED = 0;
delay(DELAY_COEFFICIENT / 3);
LED = 1;
delay(DELAY_COEFFICIENT);
}
}
// 發送一個位元組
void send_byte(unsigned char byte_val)
{
unsigned char i;
for(i=0; i<8; i++)
{
send_bit((byte_val & (0x80 >> i)) != 0);
}
}
// 發送顏色值
void send_color(unsigned char r, unsigned char g, unsigned char b)
{
send_byte(g);
send_byte(r);
send_byte(b);
}
// 更新LED燈帶
void update_led_strip()
{
LED = 0;
delay(DELAY_COEFFICIENT * 30);
}
// 主函數
void main()
{
unsigned char i;
while(1)
{
// 遍歷每個LED燈珠
for(i=0; i<144; i++)
{
// 指定顏色值
send_color(0xFF, 0x00, 0x00); // 紅色
}
// 更新LED燈帶
update_led_strip();
// 延時
delay(F_CPU); // 延時1秒
}
}
```
此程序將所有LED設置為紅色,然後通過循環不斷更新LED燈帶。請注意,您需要根據實際硬體連接來調整`LED`宏定義。您也可以修改`send_color`函數調用來改變燈珠的顏色。
請注意,`delay`函數的實現取決於您的具體硬體和編譯器。在某些情況下,您可能需要提供更精確的延遲函數以滿足WS2812的時間要求。我在這里使用了一個簡單的循環延遲,這可能不是最佳的實現方式,但應該足夠用於大多數場合。如果您遇到問題,可能需要使用其他方法(例如定時器)來實現更精確的延遲。
此外,這個程序沒有考慮到電源的限制。WS2812 LED燈珠在全亮狀態下會消耗大約60毫安的電流。如果所有144個燈珠都全亮,那麼總電流將達到8.64安培,這可能超過了您的電源的能力。在實際使用中,您可能需要考慮如何合理地控制每個LED的亮度,以確保總電流在電源的承受范圍內。
此外,這個程序沒有考慮到電源的限制。WS2812 LED燈珠在全亮狀態下會消耗大約60毫安的電流。如果所有144個燈珠都全亮,那麼總電流將達到8.64安培,這可能超過了您的電源的能力。在實際使用中,您可能需要考慮如何合理地控制每個LED的亮度,以確保總電流在電源的承受范圍內。
最後,需要注意的是,這個程序是一個基本的示例,它僅僅是將所有的LED燈珠設置為紅色。如果您想實現更復雜的效果,比如讓LED燈珠顯示不同的顏色,或者實現動畫效果,那麼您可能需要修改這個程序,或者使用更高級的庫或框架。
『肆』 怎麼用c語言編程51單片機讀寫程序
編程代碼如下:
ORG 0000H
MOV DPTR,#1000H ;給源數據塊地址指針DPTR賦初值
MOV P2, #20H ;給目的數據塊地址指針P2和R0賦初值
MOV RO,#00H
LOOP: MOVX A, @DPTR .
MOVX @RO, A .
INC DPTR
INC RO
CJNE RO,#64H, LOOP
SJMP $
(4)51單片機完整程序擴展閱讀
MCS-51單片機主要由下列部件組成:1個8位CPU;1個片內振盪器及時鍾電路;4KB ROM程序存儲器,256BRAM;21個特殊功能寄存器。
2個1 6位定時/計數器;4個8位並行I/O口及1個可編程全雙工串列介面;可定址64KB的外部程序存儲器空間;可定址64KB的外部數據存儲器空間;5個中斷源、兩個優先順序中斷嵌套中斷結構。
MCS-51單片機內部有兩個16位可編程的定時/計數器,簡稱定時器0 (T0) 和定時器1 (T1) 。它們分別由方式寄存器TMOD、控制寄存器TCON和數據寄存器TH0、TLO, TH1、TL1組成。
低優先順序中斷源可被高優先順序中斷源所中斷,而高優先順序中斷源不能被任何中斷源所中斷;一種中斷源(不管是高優先順序還是低優先順序) 一旦得到響應,與它同級的中斷源不能再中斷它。當同時收到幾個同一優先順序的中斷時,響應哪一個中斷源取決於內部查詢順序。