導航:首頁 > 操作系統 > 用單片機控制

用單片機控制

發布時間:2022-04-03 15:36:59

⑴ 如何用單片機控制直流電機

通過與單片機相連的按鍵控制直流電機停啟的電路如下圖所示,通過P3.6口按鍵觸發啟動直流電機,P3.7口的按鍵觸發停止直流電機的運行。由圖可知,當P1.0輸出高電平「1」時,NPN型三極體導通,直流電機得電轉動;當P1.0輸出低電平「0」時,NPN型三極體截止,直流電機停止轉動。

(1)用單片機控制擴展閱讀:

通過單片機產生PWM波控制直流電機程序

#include "reg52.h"


#define uchar unsigned char


#define uint unsigned int


uchar code table[10]={0x3f,0x06,0x5b,


0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰數碼管顯示碼(0-9)


sbit xiaoshudian=P0^7;


sbit wei1=P2^4; //數碼管位選定義


sbit wei2=P2^5;


sbit wei3=P2^6;


sbit wei4=P2^7;


sbit beep=P2^3; //蜂鳴器控制端


sbit motor = P1^0; //電機控制


sbit s1_jiasu = P1^4; //加速按鍵


sbit s2_jiansu= P1^5; //減速按鍵


sbit s3_jiting=P1^6; //停止/開始按鍵


uint pulse_count; //INT0接收到的脈沖數


uint num=0; //num相當於占空比調節的精度


uchar speed[3]; //四位速度值存儲


float bianhuasu; //當前速度(理論計算值)


float reallyspeed; //實際測得的速度


float vv_min=0.0;vv_max=250.0;


float vi_Ref=60.0; //給定值


float vi_PreError,vi_PreDerror;


uint pwm=100; //相當於占空比標志變數


int sample_time=0; //采樣標志


float v_kp=1.2,v_ki=0.6,v_kd=0.2; //比例,積分,微分常數


void delay (uint z)


{


uint x,y;


for(x=z;x>0;x--)


for (y=20;y>0;y--);


}


void time_init()


{


ET1=1; //允許定時器T1中斷


ET0=1; //允許定時器T0中斷


TMOD = 0x15; //定時器0計數,模式1;定時器1定時,模式1


TH1 = (65536-100)/256; //定時器1值,負責PID中斷 ,0.1ms定時


TL1 = (65536-100)%6;


TR0 = 1; //開定時器


TR1 = 1;


IP=0X08; //定時器1為高優級


EA=1; //開總中斷


}


void keyscan()


{


float j;


if(s1_jiasu==0) //加速


{


delay(20);


if(s1_jiasu==0)


vi_Ref+=10;


j=vi_Ref;


}


while(s1_jiasu==0);


if(s2_jiansu==0) //減速


{


delay(20);


if(s2_jiansu==0)


vi_Ref-=10;


j=vi_Ref;


}


while(s2_jiansu==0);


if(s3_jiting==0)


{


delay(20);


motor=0;


P1=0X00;


P3=0X00;


P0=0x00;


}


while(s3_jiting==0);


}


float v_PIDCalc(float vi_Ref,float vi_SpeedBack)


{


register float error1,d_error,dd_error;


error1=vi_Ref-vi_SpeedBack; //偏差的計算


d_error=error1-vi_PreError; //誤差的偏差


dd_error=d_error-vi_PreDerror; //誤差變化率


vi_PreError=error1; //存儲當前偏差


vi_PreDerror=d_error;


bianhuasu=(v_kp*d_error+v_ki*vi_PreError+v_kd*dd_error);


return (bianhuasu);


}


void v_Display()


{


uint su;


su=(int)(reallyspeed*10); //乘以10之後強制轉化成整型


speed[3]=su/1000; //百位


speed[2]=(su00)/100; //十位


speed[1]=(su0)/10; //個位


speed[0]=su; //小數點後一位


wei1=0; //第一位打開


P0=table[speed[3]];


delay(5);


wei1=1; //第一位關閉


wei2=0;


P0=table[speed[2]];


delay(5);


wei2=1;


wei3=0;


P0=table[speed[1]];


xiaoshudian=1;


delay(5);


wei3=1;


wei4=0;


P0=table[speed[0]];


delay(5);


wei4=1;


}


void BEEP()


{


if((reallyspeed)>=vi_Ref+5||(reallyspeed


{


beep=~beep;


delay(4);


}


}


void main()


{


time_init();


motor=0;


while(1)


{


v_Display();


BEEP();


}


if(s3_jiting==0) //對按鍵3進行掃描,增強急停效果


{


delay(20);


motor=0;


P1=0X00;


P3=0X00;


P0=0x00;


}


while(s3_jiting==0);


}


void timer0() interrupt 1


{


}


void timer1() interrupt 3


{


TH1 = (65536-100)/256; //1ms定時


TL1 = (65536-100)%6;


sample_time++;


if(sample_time==5000) //采樣時間0.1ms*5000=0.5s


{


TR0=0; //關閉定時器0


sample_time=0;


pulse_count=TH0*255+TL0; //保存當前脈沖數


keyscan(); //掃描按鍵


reallyspeed=pulse_count/(4*0.6); //計算速度


pwm=pwm+v_PIDCalc(vi_Ref,reallyspeed);


if(pwm


if(pwm>100)pwm=100;


TH0=TL0=0;


TR0=1; //開啟定時器0


}


num++;


if(num==pwm) //此處的num值,就是占空比


{


motor=0;


}


if(num==100) //100相當於占空比調節的精度


{


num=0;


motor=1;


}


}



⑵ 如何用單片機控制開關

直接用單片機給個信號給按鍵開關,用開關給cpu發信號

⑶ 單片機 控制

這個東西我以前在一種微波報警器中用過,很不錯。

一樓說的不行,理由是:「要帶埠方向寄存器的那種,設為輸入且禁用內部上拉下拉電阻」這是什麼單片機呀?為了簡單的控制而放棄51?恐怕沒人這樣做。

二樓說用「可以用IO口驅動三極體,或者IO口驅動光耦的方法實現」,這倒是可行的。

我的方法很簡單,51單片機任意三條口線加一個74HC125就解決問題,電路即簡單又便宜,效果極好。

P1.0=0,其他口=1,1Y輸出+5V(F1接+);

P1.1=0,其他口=1,2Y接GND,(F1接負);

P1.2=0,其他口=1,3Y輸出+5V(F2接+)。

電阻R1和R2是防止P1.0和P1.1切換時電源短路。

⑷ 比如我想用單片機普通I/O控制74LS164

#include <reg52.h> //51晶元管腳定義頭文件
#include <intrins.h> //內部包含延時函數 _nop_();
#define uchar unsigned char
#define uint unsigned int
sbit data_164 = P1^0;
sbit clk_164 = P1^1;
sbit mr_164 = P1^2;
uchar code display[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
/**********************************************************
延時t毫秒
11.0592MHz時鍾,延時約1ms
**********************************************************/
void delayms(uint t)
{
uchar k;
while(t--)
{
for(k=0; k<125; k++)
{;}
}
}
/**********************************************************
寫數據子函數
**********************************************************/
void wr_bits(uchar num)
{
uchar i;
for(i=0;i<8;i++)
{
if(num&0x80) //從數據的高位開始送
data_164 =1;
else
data_164 =0;
num<<=1; //向左移動一位
clk_164 =0; //下降沿將數據寫入164
_nop_();
clk_164 =1;
}
}

/**********************************************************
主函數
**********************************************************/
void main()
{
uchar n;
P1 = 0xff;
clk_164 =0;
mr_164 =0; //清164輸出
delayms(1);
mr_164 =1;

delayms(40);
while(1)
{
for(n=0;n<10;n++)
{
wr_bits(display[n]); //取數顯示
delayms(800);
}
}
}

wr_bits(display[n]) 這個語句里的display[n] 就是你要發的數據。你可以根據需要改程序

⑸ 現實生活中,哪些東西可以用單片機控制

大部分都是些具有單一用途的簡單的電子設備,普通的有電表,霓虹燈,電子顯示器等等,具有特殊用途的有感測器,某些家用電器的部分部件就是單片機,電視,冰箱,空調……

⑹ 什麼樣的電路要用單片機控制

復雜的電路嘛,如果很簡單的就用不著了,簡單的也可以用,但是沒有那麼必要咯,比如你在樓梯見安裝一個觸摸是燈開關,就用電阻,電容,三極體,或者場效應管就做得出來了,但如果你要用遙控器來控制的話,用普通電路做就難了,但用單片機做也比較容易了。

⑺ 如何用單片機控制開關

上電初始化程序段裡面加程序 用以控制全部是低電平,當D1為低電平時 輸出D2也為低電平,D3為低電平時 D2輸出為高電平 你還要注意程序裡面還要處理好 不然會出現矛盾的地方 程序還是要調整好!

⑻ 用單片機控制一個電路的開關

如果用220電源的話,使用繼電器,1、不用再考慮強弱信號隔離問題,2、開關電流容量大。
如果用低壓電源給燈供電,可以用繼電器,也可以用晶體管開關

⑼ 怎樣用單片機來控制電機的方向

步進電機只需改變繞組的供電順序,可以首先電機的方向控制。

閱讀全文

與用單片機控制相關的資料

熱點內容
程序員職業穿搭 瀏覽:254
程序員軟考大綱 瀏覽:16
命令窗口輸入後不滾動 瀏覽:638
C面向切面編程aop例子 瀏覽:368
windowsrar命令 瀏覽:379
單片機編程語言有哪些 瀏覽:441
蘋果安卓系統筆記本怎麼設置密碼 瀏覽:982
只能加密不能解密有什麼用 瀏覽:239
怎麼製造app 瀏覽:121
電腦解壓死機了怎麼辦 瀏覽:607
歐洲伺服器雲進銷存 瀏覽:192
程序員python和java 瀏覽:949
文件夾怎麼插入幻燈 瀏覽:282
帶孩子到崩潰怎麼解壓 瀏覽:63
戰地一被踢出伺服器會顯示什麼 瀏覽:837
怎麼看手機上所有的app 瀏覽:365
網路拚命令怎麼拼 瀏覽:836
產品經理和程序員優先選哪個 瀏覽:393
樸素的app應用怎麼推廣 瀏覽:586
怎麼查校園卡app專屬流量 瀏覽:437