當前位置:首頁 » 編程語言 » c語言怎麼控制電路技巧呢
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言怎麼控制電路技巧呢

發布時間: 2023-04-29 22:57:27

⑴ 用c語言做電路編程設計

本設計是在51單片機與PC機上實現基於RS232串列通訊功能的,制定和實現可靠的上下位機通訊協議,完成顯示數據的下傳和讀取,圖形和文字有靜止、移入移出等多種顯示方式是本設計的最大特點。

第二章 系統組成與工作原理2.1系統設計要求和技術指標
此次設計的系統將由五部分(主要分為上位機部分和下位機部分,其中下位機主要分成,顯示信息存儲器﹑LED顯示屏行驅動電路和LED點陣顯示屏)組成來實現,分別為:上位PC機﹑串列電平轉換器﹑顯示信息存儲器﹑LED顯示屏行驅動電路和LED點陣顯示屏。控制系統的結構框圖如圖2.1所示。
設計要求系統能控制中文LED漢字顯示,主控板採用以單片機為核心的單片機系統。MCS-51單片機具有擴展性強﹑功能強盛﹑價格較低等長處,因此,採用Atmel公司的AT89C52單片機。採用MAX232作為RS-232與TTL電平的轉換器件。PC機發送到下位機的數據先由SBUF(數據緩沖區)接收,再存入EEPROM器件AT24C256中。
漢字點陣顯示屏可分為屏體和控制器兩部分。屏體的主要部分是LED點陣屏,還有行列驅動電路。LED點陣顯示屏採用8*8LED顯示模塊拼接而成。控制電路負責有序地選通各行,選通每一行之前還要把該行該列的數據預備好,一旦該行選通,這一行上的LED發光器件就可以根據列數據進行顯示。
從理論上講,不論顯示圖形還是文字,只要控制這些組成圖形或文字的各個點所在位置相應的LED器件發光,就可以得到想要的顯示結果,這種同時控制各個發光點亮滅的方法稱為靜態驅動顯示方式。16*16點陣共有256個發光二極體,顯然單片機沒有這么多的埠,假如採用鎖存器來擴展埠,按8位的鎖存器來計算,16*16的點陣需要256/8=32個鎖存器。這個數字很大,因為這里僅僅是16*16的點陣,但是在實際應用中的顯示屏往往要大的多,這樣在鎖存器上花的成本也就將是一個很大的數字。因此,在實際應用中的顯示屏幾乎都不採用靜態驅動顯示方式之中設計,而是採用另一種稱為動態掃描的顯示方式。
所謂動態掃描,簡朴地說就是逐行輪流點亮,這樣掃描驅動電路就可以實現多行同名列共用一套列驅動器。以本次設計的16*16點陣為例,把所有的同一行發光管的陽極連在一起,把所有同一列發光管的陰極連在一起(共陽極接法),先發送出對應第一行發光管亮滅的數據並鎖存,然後選通第一行使其點亮一定的時間,然後熄滅;再發送出第二行的數據並鎖存,然後選通第二行使其點亮一定的時間,然後熄滅;……第十六行之後又重新點亮第一行,這樣反復輪回。當這樣輪回的速度足夠快時(每秒24次以上),由於人眼的視覺暫留現象,就能看到顯示屏上穩定的圖形。
採用串列傳輸方案,控制電路可以只用一根信號線,將列數據一位一位傳往列驅動器,在硬體方面,這無疑是十分經濟的。但是,串列傳輸過程較長,數據按順序一位一位地輸出給列驅動器,只有一行的各列數據都已傳輸到位之後,這一行的各列才能並行地進行顯示。這樣,對於一行的顯示過程就可以分解成列數據准備(傳輸)和列數據顯示兩部分。對於串列傳輸方式來說,列數據准備時間可能相稱長,在行掃描周期確定的情況下,留給行顯示的時間就太少了,以至影響LED的亮度。
為解決串列傳輸中列數據准備與列數據顯示的時間矛盾問題,可以採用重疊處理的方法,即在顯示本行各列數據的同時,傳送下一行的列數據。為達到重疊處理的目的,列數據的顯示就需要具有鎖存功能。經過上述的分析,可以歸納出列驅動器電路應具備的主要功能。對於列數據准備來說,它應能實現串入並出的移位功能;對於列數據顯示來說,應具有並行鎖存的功能。這樣,本行已准備好的數據送入並行鎖存器進行顯示時,串並移位寄存器就可以准備下一行的列數據,而會不影響本行的顯示。

⑵ 51單片機如何用C語言控制繼電器

①繼電器屬於電扮返汪平控制類型的輸出設備,單片機可以通過 IO 電平輸出去控制繼電器。但繼電器的工作電流(線圈端)相對單片機來講,比較大,多數都超出單片機限制電流總和,所以一般都需要通過驅動電路去控制繼電器(如使用:NPN三極體、達廳仔林頓管(ULN2003)等)。
②世陵多數繼電器的電壓都高於單片機的電壓,單片機的輸出無法與 繼電器的 電平邏輯匹配,這也需要驅動電路進行轉換(如上述例子)
③繼電器還有不同種類,如交流/直流繼電器、固態繼電器等,上面的描述,都是針對常用 的 直流繼電器說明的。

⑶ C語言控制單片機的詳細原理是怎樣的

C語言源程序----->C編譯器----->匯編代碼----->匯編器----->機器代碼
所謂的單片機C語言的意思是拿C語言來編寫單片機程序,沒有什麼C語言控制單片機這回說法。具體過程是:C語言源程序通過特定的C編譯器編譯為針對某種單片機的匯編代碼,再由匯編器將匯編代碼匯編為單片機可執行的機器代碼,然後下載到單片機的存儲器運行。當前一般的集成開發環境(如Keil C)可以一次搞定生成機器代碼。
需要補充一點的是,單片機也是一種計算機,不要以為只有在PC機上才可以用C語言編程,C語言可以用作為任何計算機的編程語言,當然包括單片機,但有一個條件就是,你必需要有針對某種架構的計算機的C編譯器。目前來講,C語言的編譯器種類非常多,有用於各種單片機以及微處理器架構的編譯器版本,所以可以用C來做為單片機的編程語言。不同的是,你用TC或者VC編譯得到的是X86(如Intel,AMD)的目標代碼,只能在PC機上運行,而如果用單片機C編譯器(比如Keil C)編譯的代碼是單片機代碼,只能在特定的單片機上運行。目前C/C++是最流行的單片機/微處理器編程語言。

⑷ C51單片機程序設計題,要求用C語言做,模擬交通燈控制單片機電路,答案要詳細具體。

晚上隨手寫,也未調試,權當看看

程序有不嚴謹地方還得調試修改

#include<REGX51.H>

#defineSTATUS_1S 1

#defineSTATUS_2S 2

#defineSTATUS_3S 3

#defineSTATUS_4S 4

#defineSTATUS_5S 5

#defineSTATUS_15S 15

#defineSTATUS_28S 28

#defineSTATUS_29S 29

#defineSTATUS_30S 30

unsignedcharflag,status,status_temp=1,status_temp_;

sbitK1 = P0^0;

sbitK2 = P0^1;

sbitRLED = P0^2;

sbitYLED = P0^3;

sbitGLED = P0^4;

voidInit(void)

{

ET0=1;

TR0=1;

RLED=0; //亮

YLED=0;

GLED=0;

while(status_temp)

{

switch(status)

{

caseSTATUS_1S: //1S

{

RLED=1; //滅,閃一次

YLED=1;

GLED=1;

} break;

caseSTATUS_2S: //1S

{

RLED=0; //亮,閃一次

YLED=0;

GLED=0;

} break;

caseSTATUS_3S: //1S

{

RLED=1; //滅

YLED=1;

GLED=1;

status_temp=0;

} break;

}

}

status_temp=1;

ET0=0;

TR0=0;

}

voidInit_Timer0(void)

{

TMOD=0x01;

// ET0=1;

// TR0=1;

EA=1;

TH0=0X3C;

TL0=0XB0; //未計算,偷樓上的

}

voidM_Start(void)

{

TH0=0X3C;

TL0=0XB0;

ET0=1;

TR0=1;

RLED=0; //紅亮

while(status_temp)

{

switch(status)

{

caseSTATUS_1S:

{

if(status_temp_==1)

{

YLED=0;

}

} break;

caseSTATUS_2S:

{

if(status_temp_==1)

{

YLED=1;

}

} break;

caseSTATUS_3S:

{

if(status_temp_==1)

{

YLED=0;

status_temp_=0;

}

} break;

caseSTATUS_15S: //15S滅,綠亮

{

RLED=1;

GLED=0;

} break;

caseSTATUS_28S:

{

GLED=1;

} break;

caseSTATUS_29S:

{

GLED=0;

} break;

caseSTATUS_30S:

{

GLED=1;

status=0;

status_temp_=1;

} break;

}

}

ET0=0;

TR0=0;

status=0;

status_temp=1;

YLED=1;

}

voidM_End(void)

{

TH0=0X3C;

TL0=0XB0;

ET0=1;

TR0=1;

RLED=0; //亮1次

YLED=0;

GLED=0;

while(status_temp)

{

switch(status)

{

caseSTATUS_1S: //1S

{

RLED=1; //滅一次

YLED=1;

GLED=1;

} break;

caseSTATUS_2S: //1S

{

RLED=0; //亮二次

YLED=0;

GLED=0;

} break;

caseSTATUS_3S: //1S

{

RLED=1; ////滅二次

YLED=1;

GLED=1;

} break;

caseSTATUS_4S: //1S

{

RLED=0; ////亮三次

YLED=0;

GLED=0;

} break;

caseSTATUS_5S: //1S

{

RLED=1; ////滅三次

YLED=1;

GLED=1;

status_temp=0;

} break;

}

}

status_temp=1;

ET0=0;

TR0=0;

}

main()

{

Init();//單片機初始化

Init_Timer0();//定時器初始化

while(1)

{

if(K1==0)

M_Start();//模擬開始

if(K2==0)

M_End();//模擬結束

}

}

voidinterrupt_time0()interrupt1 //核對頭文件,一致就好

{

TH0=0X3C;

TL0=0XB0;

flag++;

if(flag==20)

{

status++;

flag=0;

}

}

⑸ 51單片機中如何用c語言控制直流電機正反轉

#include"reg52.h"
#include"intrins.h"
#define unint unsigned int
#define unchar unsigned char
#define PLAY_OUT P1
unchar sec=0;
unchar min=0;
unchar count=0;
bit gj=0; //光和遙控的切換
unchar r6,r7;
bit time0=1;
bit time1=1;
sbit PLAY_Q_Q=P3^0;
sbit PLAY_Z=P3^1;
sbit PLAY_Y=P3^4;
sbit PLAY_QH=P3^5;
sbit PLAY_Q_H=P3^6;
sbit PLAY_T=P3^7;
unchar r0,r1,r2=0x00,r3=0x00,r4=0x00,r5=0x00;
unchar code TAB_Q[4]={0xf9,0xf5,0xf6,0xfa};//前進
unchar code TAB_H[4]={0xfa,0xf6,0xf5,0xf9};//後退
unchar code TAB_Y[4]={0x9f,0x5f,0x6f,0xaf};//右轉
unchar code TAB_Z[4]={0xaf,0x6f,0x5f,0x9f};//左轉
/*************************/
void intiaton(void);
void int_time3(void);
void int_time0(void);
void fanzhuan_Y(void);
void fanzhuan_Z(void);
void zhenzhuan_Q(void);
void zhenzhuan_H(void);
void zhenzhuan_AQ(void);
void zhenzhuan_AH(void);
void cankey(void);
/*************************/
delay(unint t) //0.6ms
{unint i;
for(i=55;i>t;i--) ;

}
/**************************/
delayms(unint k) //k=1延遲0.884毫秒
{unint i;
for(i=80;i>k;i--)
;

}
/*************************/
void delay238(void) //2.38ms
{
unint i,j;
for(j=125;j>0;j--)
for(i=0;i<1;i++);
}
/************************/
void intiaton(void) //初始化
{
TMOD=0x11;
TH1=0XFA;
TL1=0X56;
ET1=1;
TR1=1;
EA=1;
}

/*********************/
void int_time3() interrupt 3 using 3
{
TH1=0XFA;
TL1=0X56;
sec++;
if(sec==2)
{
sec=0;
min++;
}
}
/*************************/ //光感與按鍵控制
void cankey()
{
if(gj)
{
if(!PLAY_Q_Q)
{
count=1;
}
if(!PLAY_T)
{
count=2;
}
if(!PLAY_Q_H)
{
count=3;
}
}
if((PLAY_Z==0)||(PLAY_Y==0))
{
delayms(1);
if(PLAY_Z==0)
{
fanzhuan_Z();count=1;
}
else
{
fanzhuan_Y();count=1;
}
}

if(PLAY_QH==0)
{
delayms(10);
if(PLAY_QH==0)
{
count++;
if(count==4)
{
count=0;
}
}
while(PLAY_QH==0);
}
switch(count)
{
case 0: PLAY_OUT=0xff;break;
case 1: zhenzhuan_AQ();break;
case 2: PLAY_OUT=0xff;break;
case 3: zhenzhuan_AH();break;
default :break;
}

}
/*******************************/ //按鍵前進
void zhenzhuan_AQ(void)
{
for(r6=0;r6<4;r6++)
{
PLAY_OUT=TAB_Q[r6];
while(sec==0);
sec=0;

}

}
/*******************/ //按鍵後退
void zhenzhuan_AH(void)
{

for(r6=0;r6<4;r6++)
{
PLAY_OUT=TAB_H[r6];
while(sec==0);
sec=0;
}

}
/**********************/ //左轉
void fanzhuan_Z(void)
{
unchar i;

for(i=0;i<22;i++)
{
for(r7=0;r7<4;r7++)
{
PLAY_OUT=TAB_Z[r7];
while(sec==0);
sec=0;
}
}
cankey();
}
/**********************/ //右轉
void fanzhuan_Y(void)
{
unchar i;
for(i=0;i<22;i++)
{
for(r7=0;r7<4;r7++)
{
PLAY_OUT=TAB_Y[r7];
while(sec==0);
sec=0;
}
}

cankey();
}
/***************************/
void main()
{
intiaton();
while(1)
{
cankey();
}
這是加了感光跟按鍵控制的智能小車,是讀大一時候寫的,現在看起來呵呵。。。垃圾代碼一大堆,不過好象還可以用。