㈠ 急求 路燈 的單片機控制系統設計!!!
路燈的單片機控制系統設計是一種智能化的控制系統,通過單片機的程序控制,實現對路燈的開關、亮度調節、故障檢測等功能。下面是一個簡單的路燈單片機控制系統設計的概述。
首先,我們需要選擇合適的單片機作為控制器。常用的單片機有51系列、AVR系列、STM32系列等,選擇合適的單片機要根據實際需求和預算來確定。
接下來,我們需要設計電路部分。電路部分包括電源電路、信號輸入輸出電路、驅動電路等。電源電路主要是為單片機和其他電路提供穩定的電源,可以選擇使用穩壓電源模塊。信號輸入輸出電路主要是將外部信號與單片機進行連接,如光敏電阻、按鈕等。驅動電路主要是將單片機的輸出信號轉換為合適的電壓和電流,驅動路燈的開關和亮度調節。
然後,我們需要編寫單片機的程序。程序部分主要包括初始化設置、功能實現和故障檢測等。初始化設置包括設置IO口的輸入輸出方向、中斷設置等。功能實現包括根據外部信號控制路燈的開關和亮度調節,可以使用PWM技術實現亮度調節。故障檢測可以通過檢測電源電壓、光敏電阻等來判斷是否存在故障,並通過程序進行相應的處理。
最後,我們需要進行測試和調試。測試和調試主要是驗證設計的正確性和穩定性,可以通過連接示波器、調試工具等進行測試和調試。
總結起來,路燈的單片機控制系統設計包括選擇合適的單片機、設計電路部分、編寫程序、測試和調試等步驟。通過合理的設計和實施,可以實現對路燈的智能化控制,提高路燈的使用效率和節能效果。
㈡ 單片機程序 急求流程圖 ;1、0809的片選信號CS0809接CS0。 ;2、電位器的輸出信號AN0接0809的ADIN0。 ;3、EO
#include "reg51.h"
#define data_point P0
sbit EOC=P2^0;
sbit ADDA=P2^1;
sbit ADDB=P2^2;
sbit ADDC=P2^3;
sbit OE=P2^5;
sbit START=P2^6;
sbit CLK=P2^7;
sbit ALE=P2^6;
unsigned char disp[3]={0,0,0};
char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char t0count=0;
unsigned int temp;
double sum;
unsigned char val_Integer; //整數
unsigned int val_Decimal; //小數
sbit k1 = P1^0;
sbit k2 = P1^1;
sbit k3 = P1^2;
sbit k4 = P1^3;
void delay(unsigned char ms)
{
unsigned char i;
while(ms--)
for(i=0;i<125;i++);
}
void display()
{
disp[0]=disp[0]&0x7f;
P3= disp[0];
k1 = 1;
delay(2);
k1 = 0;
P3= disp[1];
k2 = 1;
delay(2);
k2 = 0;
P3= disp[2];
k3 = 1;
delay(2);
k3 = 0;
P3= disp[3];
k4 = 1;
delay(2);
k4 = 0;
}
unsigned char ADC0808()
{
unsigned char d;
ADDC=0;
ADDB=0;
ADDA=0;
TR1=1;
ALE=1;ALE=0;
START=1;START=0;
while(EOC==0);
OE=1;
d=data_point;
OE=0;
TR1=1;
return d;
}
void covert(unsigned char x)
{
sum=x*0.0201378;
val_Integer=(unsigned char)sum;
val_Decimal=(unsigned int)((sum-val_Integer)*1000);
disp[3]=dispcode[val_Decimal%10];
disp[2]=dispcode[val_Decimal/10%10];
disp[1]=dispcode[val_Decimal/100];
disp[0]=dispcode[val_Integer];
}
void main()
{
TMOD=0x21;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=256-2;
ET0=1;
ET1=1;
EA=1;
TR0=1;
OE=0;
START=0;
EOC=1;
while(1)
{
display();
}
}
void time0() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
t0count++;
if(t0count==100)
{
t0count=0;
covert(ADC0808());
}
}
void time1() interrupt 3
{
CLK=~CLK;
}
㈢ 藍橋杯單片機組流程是什麼,請說具體點
流程如下:
1、進考場後,會發一塊單片機開發板。
2、電腦桌面上有一個加密的壓縮包,開考後密碼才會告知,解壓後裡面有下載軟體,datasheet,參考程序。
3、同時會發給一個紙質試卷,上面有編寫程序的要求,需要編寫程序把要求在板子上實現出來。還有就是要用protel畫一個電路圖,用vision話程序流程圖。
4、考試結束後,把最終的程序下載到開發板中(評分時主要看板子上把要求的功能實現了多少),同時要提交電子檔的程序,電路圖,流程圖。
(3)單片機輸入處理輸出型流程圖擴展閱讀:
大賽項目 ——
1、JAVA軟體開發。對象:具有正式全日制學籍並且符合相關科目報名要求的研究生、本科及高職高專學生(以報名時狀態為准),以個人為單位進行比賽。該專業方向設大學A組、大學B組、大學C組。
說明:985、211本科生只能報大學A組,所有院校研究生只能報大學A組,其它院校本科生可自行選擇報大學A組或大學B組,高職高專院校可報大學C組或自行選擇報任意組別。
2、C/C++程序設計。對象:具有正式全日制學籍並且符合相關科目報名要求的研究生、本科生及高職高專學生(以報名時狀態為准) ,以個人為單位進行比賽。該專業方向設大學A組、大學B組、大學C組。
說明:985、211本科生只能報大學A組,所有院校研究生只能報大學A組,其它院校本科生可自行選擇報大學A組或大學B組,高職高專院校可報大學C組或自行選擇報任意組別。
3、嵌入式設計與開發。對象:具有正式學籍的在校全日制研究生、本科及高職高專學生(以報名時狀態為准),以個人為單位進行比賽。該專業方向設大學組。
4、單片機設計與開發。對象:具有正式學籍的在校全日制本科及高職高專學生(以報名時狀態為准),以個人為單位進行比賽。該專業方向設大學組。
5、青少年創意編程組。對象:6-17歲的中小學生。
㈣ 51單片機P0口的特殊用途
51單片機P0口工作原理詳細講解
一、P0埠的結構及工作原理
P0埠8位中的一位結構圖見下圖:
下面,我們先就組成P0口的每個單元部份跟大家介紹一下:
先看輸入緩沖器:在P0口中,有兩個三態的緩沖器,在學數字電路時,我們已知道,三態門有三個狀態,即在其的輸出端可以是高電平、低電平,同時還有一種就是高阻狀態(或稱為禁止狀態),大家看上圖,上面一個是讀鎖存器的緩沖器,也就是說,要讀取D鎖存器輸出端Q的數據,那就得使讀鎖存器的這個緩沖器的三態控制端(上圖中標號為『讀鎖存器』端)有效。下面一個是讀引腳的緩沖器,要讀取P0.X引腳上的數據,也要使標號為『讀引腳』的這個三態緩沖器的控制端有效,引腳上的數據才會傳輸到我們單片機的內部數據匯流排上。
D鎖存器:構成一個鎖存器,通常要用一個時序電路,時序的單元電路在學數字電路時我們已知道,一個觸發器可以保存一位的二進制數(即具有保持功能),在51單片機的32根I/O口線中都是用一個D觸發器來構成鎖存器的。大家看上圖中的D鎖存器,D端是數據輸入端,CP是控制端(也就是時序控制信號輸入端),Q是輸出端,Q非是反向輸出端。
對於D觸發器來講,當D輸入端有一個輸入信號,如果這時控制端CP沒有信號(也就是時序脈沖沒有到來),這時輸入端D的數據是無法傳輸到輸出端Q及反向輸出端Q非的。如果時序控制端CP的時序脈沖一旦到了,這時D端輸入的數據就會傳輸到Q及Q非端。數據傳送過來後,當CP時序控制端的時序信號消失了,這時,輸出端還會保持著上次輸入端D的數據(即把上次的數據鎖存起來了)。如果下一個時序控制脈沖信號來了,這時D端的數據才再次傳送到Q端,從而改變Q端的狀態。
多路開關:在51單片機中,當內部的存儲器夠用(也就是不需要外擴展存儲器時,這里講的存儲器包括數據存儲器及程序存儲器)時,P0口可以作為通用的輸入輸出埠(即I/O)使用,對於8031(內部沒有ROM)的單片機或者編寫的程序超過了單片機內部的存儲器容量,需要外擴存儲器時,P0口就作為『地址/數據』匯流排使用。那麼這個多路選擇開關就是用於選擇是做為普通I/O口使用還是作為『數據/地址』匯流排使用的選擇開關了。大家看上圖,當多路開關與下面接通時,P0口是作為普通的I/O口使用的,當多路開關是與上面接通時,P0口是作為『地址/數據』匯流排使用的。
輸出驅動部份:從上圖中我們已看出,P0口的輸出是由兩個MOS管組成的推拉式結構,也就是說,這兩個MOS管一次只能導通一個,當V1導通時,V2就截止,當V2導通時,V1截止。
與門、與非門:這兩個單元電路的邏輯原理不做介紹。
前面我們已將P0口的各單元部件進行了一個詳細的講解,下面我們就來研究一下P0口做為I/O口及地址/數據匯流排使用時的具體工作過程。
1、作為I/O埠使用時的工作原理
P0口作為I/O埠使用時,多路開關的控制信號為0(低電平),看上圖中的線線部份,多路開關的控制信號同時與與門的一個輸入端是相接的,我們知道與門的邏輯特點是「全1出1,有0出0」那麼控制信號是0的話,這時與門輸出的也是一個0(低電平),與讓的輸出是0,V1管就截止,在多路控制開關的控制信號是0(低電平)時,多路開關是與鎖存器的Q非端相接的(即P0口作為I/O口線使用)。
P0口用作I/O口線,其由數據匯流排向引腳輸出(即輸出狀態Output)的工作過程:當寫鎖存器信號CP 有效,數據匯流排的信號→鎖存器的輸入端D→鎖存器的反向輸出Q非端→多路開關→V2管的柵極→V2的漏極到輸出端P0.X。前面我們已講了,當多路開關的控制信號為低電平0時,與門輸出為低電平,V1管是截止的,所以作為輸出口時,P0是漏極開路輸出,類似於OC門,當驅動上接電流負載時,需要外接上拉電阻。
下圖就是由內部數據匯流排向P0口輸出數據的流程圖(紅色箭頭)。
P0口用作I/O口線,其由引腳向內部數據匯流排輸入(即輸入狀態Input)的工作過程:
數據輸入時(讀P0口)有兩種情況:
1、讀引腳讀晶元引腳上的數據,讀引腳數時,讀引腳緩沖器打開(即三態緩沖器的控制端要有效),通過內部數據匯流排輸入,請看下圖(紅色簡頭)。
2、讀鎖存器通過打開讀鎖存器三態緩沖器讀取鎖存器輸出端Q的狀態,請看下圖(紅色箭頭):
在輸入狀態下,從鎖存器和從引腳上讀來的信號一般是一致的,但也有例外。例如,當從內部匯流排輸出低電平後,鎖存器Q=0,Q非=1,場效應管T2開通,埠線呈低電平狀態。此時無論埠線上外接的信號是低電乎還是高電平,從引腳讀入單片機的信號都是低電平,因而不能正確地讀入埠引腳上的信號。又如,當從內部匯流排輸出高電平後,鎖存器Q=1,Q非=0,場效應管T2截止。如外接引腳信號為低電平,從引腳上讀入的信號就與從鎖存器讀入的信號不同。為此,8031單片機在對埠P0一P3的輸入操作上,有如下約定:為此,8051單片機在對埠P0一P3的輸入操作上,有如下約定:凡屬於讀-修改-寫方式的指令,從鎖存器讀入信號,其它指令則從埠引腳線上讀入信號。
讀-修改-寫指令的特點是,從埠輸入(讀)信號,在單片機內加以運算(修改)後,再輸出(寫)到該埠上。下面是幾條讀--修改-寫指令的例子。
ANL P0,#立即數 ;P0→立即數P0
ORL P0,A ;P0→AP0
INC P1 ;P1+1→P1
DEC P3 ;P3-1→P3
CPL P2 ;P2→P2
這樣安排的原因在於讀-修改-寫指令需要得到埠原輸出的狀態,修改後再輸出,讀鎖存器而不是讀引腳,可以避免因外部電路的原因而使原埠的狀態被讀錯。
P0埠是8031單片機的匯流排口,分時出現數據D7一D0、低8位地址A7一AO,以及三態,用來介面存儲器、外部電路與外部設備。P0埠是使用最廣泛的I/O埠。
2、作為地址/數據復用口使用時的工作原理
在訪問外部存儲器時P0口作為地址/數據復用口使用。
這時多路開關『控制』信號為『1』,『與門』解鎖,『與門』輸出信號電平由「地址/數據」線信號決定;多路開關與反相器的輸出端相連,地址信號經「地址/數據」線→反相器→V2場效應管柵極→V2漏極輸出。例如:控制信號為1,地址信號為「0」時,與門輸出低電平,V1管截止;反相器輸出高電平,V2管導通,輸出引腳的地址信號為低電平。請看下圖(蘭色字體為電平):
反之,控制信號為「1」、地址信號為「1」,「與門」輸出為高電平,V1管導通;反相器輸出低電平,V2管截止,輸出引腳的地址信號為高電平。請看下圖(蘭色字體為電平):
可見,在輸出「地址/數據」信息時,V1、V2管是交替導通的,負載能力很強,可以直接與外設存儲器相連,無須增加匯流排驅動器。
P0口又作為數據匯流排使用。在訪問外部程序存儲器時,P0口輸出低8位地址信息後,將變為數據匯流排,以便讀指令碼(輸入)。
在取指令期間,「控制」信號為「0」,V1管截止,多路開關也跟著轉向鎖存器反相輸出端Q非;CPU自動將0FFH(11111111,即向D鎖存器寫入一個高電平『1』)寫入P0口鎖存器,使V2管截止,在讀引腳信號控制下,通過讀引腳三態門電路將指令碼讀到內部匯流排。請看下圖如果該指令是輸出數據,如MOVX @DPTR,A(將累加器的內容通過P0口數據匯流排傳送到外部RAM中),則多路開關「控制」信號為『1』,「與門」解鎖,與輸出地址信號的工作流程類似,數據據由「地址/數據」線→反相器→V2場效應管柵極→V2漏極輸出。
如果該指令是輸入數據(讀外部數據存儲器或程序存儲器),如MOVX A,@DPTR(將外部RAM某一存儲單元內容通過P0口數據匯流排輸入到累加器A中),則輸入的數據仍通過讀引腳三態緩沖器到內部匯流排,其過程類似於上圖中的讀取指令碼流程圖。
通過以上的分析可以看出,當P0作為地址/數據匯流排使用時,在讀指令碼或輸入數據前,CPU自動向P0口鎖存器寫入0FFH,破壞了P0口原來的狀態。因此,不能再作為通用的I/O埠。大家以後在系統設計時務必注意,即程序中不能再含有以P0口作為操作數(包含源操作數和目的操作數)的指令。
㈤ 懇求各位高手:幫忙看一下這個單片機課設題目唄。題目為 ADC0808轉換 謝謝!謝謝!
27. ADC0809A/D轉換器基本應用技術
1. 基本知識
ADC0809是帶有8位A/D轉換器、8路多路開關以及微處理機兼容的控制邏輯的CMOS組件。它是逐次逼近式A/D轉換器,可以和單片機直接介面。
(1). ADC0809的內部邏輯結構
由上圖可知,ADC0809由一個8路模擬開關、一個地址鎖存與解碼器、一個A/D轉換器和一個三態輸出鎖存器組成。多路開關可選通8個模擬通道,允許8路模擬量分時輸入,共用A/D轉換器進行轉換。三態輸出鎖器用於鎖存A/D轉換完的數字量,當OE端為高電平時,才可以從三態輸出鎖存器取走轉換完的數據。
(2). 引腳結構
IN0-IN7:8條模擬量輸入通道
ADC0809對輸入模擬量要求:信號單極性,電壓范圍是0-5V,若信號太小,必須進行放大;輸入的模擬量在轉換過程中應該保持不變,如若模擬量變化太快,則需在輸入前增加采樣保持電路。
地址輸入和控制線:4條
ALE為地址鎖存允許輸入線,高電平有效。當ALE線為高電平時,地址鎖存與解碼器將A,B,C三條地址線的地址信號進行鎖存,經解碼後被選中的通道的模擬量進轉換器進行轉換。A,B和C為地址輸入線,用於選通IN0-IN7上的一路模擬量輸入。通道選擇表如下表所示。
C B A 選擇的通道
0 0 0 IN0
0 0 1 IN1
0 1 0 IN2
0 1 1 IN3
1 0 0 IN4
1 0 1 IN5
1 1 0 IN6
1 1 1 IN7
數字量輸出及控制線:11條
ST為轉換啟動信號。當ST上跳沿時,所有內部寄存器清零;下跳沿時,開始進行A/D轉換;在轉換期間,ST應保持低電平。EOC為轉換結束信號。當EOC為高電平時,表明轉換結束;否則,表明正在進行A/D轉換。OE為輸出允許信號,用於控制三條輸出鎖存器向單片機輸出轉換得到的數據。OE=1,輸出轉換得到的數據;OE=0,輸出數據線呈高阻狀態。D7-D0為數字量輸出線。
CLK為時鍾輸入信號線。因ADC0809的內部沒有時鍾電路,所需時鍾信號必須由外界提供,通常使用頻率為500KHZ,
VREF(+),VREF(-)為參考電壓輸入。
2. ADC0809應用說明
(1). ADC0809內部帶有輸出鎖存器,可以與AT89S51單片機直接相連。
(2). 初始化時,使ST和OE信號全為低電平。
(3). 送要轉換的哪一通道的地址到A,B,C埠上。
(4). 在ST端給出一個至少有100ns寬的正脈沖信號。
(5). 是否轉換完畢,我們根據EOC信號來判斷。
(6). 當EOC變為高電平時,這時給OE為高電平,轉換的數據就輸出給單片機了。
3. 實驗任務
如下圖所示,從ADC0809的通道IN3輸入0-5V之間的模擬量,通過ADC0809轉換成數字量在數碼管上以十進制形成顯示出來。ADC0809的VREF接+5V電壓。
4. 電路原理圖
圖1.27.1
5. 系統板上硬體連線
(1). 把「單片機系統板」區域中的P1埠的P1.0-P1.7用8芯排線連接到「動態數碼顯示」區域中的A B C D E F G H埠上,作為數碼管的筆段驅動。
(2). 把「單片機系統板」區域中的P2埠的P2.0-P2.7用8芯排線連接到「動態數碼顯示」區域中的S1 S2 S3 S4 S5 S6 S7 S8埠上,作為數碼管的位段選擇。
(3). 把「單片機系統板」區域中的P0埠的P0.0-P0.7用8芯排線連接到「模數轉換模塊」區域中的D0D1D2D3D4D5D6D7埠上,A/D轉換完畢的數據輸入到單片機的P0埠
(4). 把「模數轉換模塊」區域中的VREF端子用導線連接到「電源模塊」區域中的VCC端子上;
(5). 把「模數轉換模塊」區域中的A2A1A0端子用導線連接到「單片機系統」區域中的P3.4P3.5P3.6端子上;
(6). 把「模數轉換模塊」區域中的ST端子用導線連接到「單片機系統」區域中的P3.0端子上;
(7). 把「模數轉換模塊」區域中的OE端子用導線連接到「單片機系統」區域中的P3.1端子上;
(8). 把「模數轉換模塊」區域中的EOC端子用導線連接到「單片機系統」區域中的P3.2端子上;
(9). 把「模數轉換模塊」區域中的CLK端子用導線連接到「分頻模塊」區域中的/4端子上;
(10). 把「分頻模塊」區域中的CK IN端子用導線連接到「單片機系統」區域中的ALE端子上;
(11). 把「模數轉換模塊」區域中的IN3端子用導線連接到「三路可調壓模塊」區域中的VR1端子上;
6. 程序設計內容
(1). 進行A/D轉換時,採用查詢EOC的標志信號來檢測A/D轉換是否完畢,若完畢則把數據通過P0埠讀入,經過數據處理之後在數碼管上顯示。
(2). 進行A/D轉換之前,要啟動轉換的方法:
ABC=110選擇第三通道
ST=0,ST=1,ST=0產生啟動轉換的正脈沖信號
7. 匯編源程序
CH EQU 30H
DPCNT EQU 31H
DPBUF EQU 33H
GDATA EQU 32H
ST BIT P3.0
OE BIT P3.1
EOC BIT P3.2
ORG 00H
LJMP START
ORG 0BH
LJMP T0X
ORG 30H
START: MOV CH,#0BCH
MOV DPCNT,#00H
MOV R1,#DPCNT
MOV R7,#5
MOV A,#10
MOV R0,#DPBUF
LOP: MOV @R0,A
INC R0
DJNZ R7,LOP
MOV @R0,#00H
INC R0
MOV @R0,#00H
INC R0
MOV @R0,#00H
MOV TMOD,#01H
MOV TH0,#(65536-4000)/256
MOV TL0,#(65536-4000) MOD 256
SETB TR0
SETB ET0
SETB EA
WT: CLR ST
SETB ST
CLR ST
WAIT: JNB EOC,WAIT
SETB OE
MOV GDATA,P0
CLR OE
MOV A,GDATA
MOV B,#100
DIV AB
MOV 33H,A
MOV A,B
MOV B,#10
DIV AB
MOV 34H,A
MOV 35H,B
SJMP WT
T0X: NOP
MOV TH0,#(65536-4000)/256
MOV TL0,#(65536-4000) MOD 256
MOV DPTR,#DPCD
MOV A,DPCNT
ADD A,#DPBUF
MOV R0,A
MOV A,@R0
MOVC A,@A+DPTR
MOV P1,A
MOV DPTR,#DPBT
MOV A,DPCNT
MOVC A,@A+DPTR
MOV P2,A
INC DPCNT
MOV A,DPCNT
CJNE A,#8,NEXT
MOV DPCNT,#00H
NEXT: RETI
DPCD: DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH,00H
DPBT: DB 0FEH,0FDH,0FBH,0F7H
DB 0EFH,0DFH,0BFH,07FH
END
8. C語言源程序
#include <AT89X52.H>
unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsigned char dispbuf[8]={10,10,10,10,10,0,0,0};
unsigned char dispcount;
sbit ST=P3^0;
sbit OE=P3^1;
sbit EOC=P3^2;
unsigned char channel=0xbc;//IN3
unsigned char getdata;
void main(void)
{
TMOD=0x01;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
TR0=1;
ET0=1;
EA=1;
P3=channel;
while(1)
{
ST=0;
ST=1;
ST=0;
while(EOC==0);
OE=1;
getdata=P0;
OE=0;
dispbuf[2]=getdata/100;
getdata=getdata%10;
dispbuf[1]=getdata/10;
dispbuf[0]=getdata%10;
}
}
void t0(void) interrupt 1 using 0
{
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
P1=dispcode[dispbuf[dispcount]];
P2=dispbitcode[dispcount];
dispcount++;
if(dispcount==8)
{
dispcount=0;
}
}