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

電動機的c語言

發布時間: 2022-12-14 15:36:18

『壹』 用單片機控制直流電動機的正反轉、加減速的程序如何用c語言寫啊

參考一下這個例子吧。
#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit PW1=P2^0 ;
sbit PW2=P2^1 ; //控制電機的兩個輸入
sbit accelerate=P2^2 ; //調速按鍵
sbit stop=P2^3 ; //停止按鍵
sbit left=P2^4 ; //左轉按鍵
sbit right=P2^5 ; //右轉按鍵

#define right_turn PW1=0;PW2=1 //順時針轉動
#define left_turn PW1=1;PW2=0 //逆向轉動
#define end_turn PW1=1;PW2=1 //停轉

uint t0=25000,t1=25000; //初始時占空比為50%
uint a=25000; // 設置定時器裝載初值 25ms 設定頻率為20Hz
uchar flag=1; //此標志用於選擇不同的裝載初值
uchar dflag; //左右轉標志
uchar count; //用來標志速度檔位

void keyscan(); //鍵盤掃描
void delay(uchar z);
void time_init(); //定時器的初始化
void adjust_speed(); //通過 調整占空比來調整速度
//**********************************//
void main()
{
time_init(); //定時器的初始化
while(1)
{

keyscan(); //不斷掃描鍵盤程序,以便及時作出相應的響應

}
}
//*************************************//
void timer0() interrupt 1 using 0
{

if(flag)
{
flag=0;
end_turn;
a=t0; //t0的大小決定著低電平延續時間
TH0=(65536-a)/256;
TL0=(65536-a)%256; //重裝載初值
}
else
{
flag=1; //這個標志起到交替輸出高低電平的作用
if(dflag==0)
{
right_turn; //右轉
}
else
{
left_turn; //左轉
}
a=t1; //t1的大小決定著高電平延續時間
TH0=(65536-a)/256;
TL0=(65536-a)%256; //重裝載初值
}

}

void time_init()
{
TMOD=0x01; //工作方式寄存器 軟體起動定時器 定時器功能 方式1 定時器0
TH0=(65536-a)/256;
TL0=(65536-a)%256; //裝載初值
ET0=1; //開啟定時器中斷使能
EA=1; // 開啟總中斷
TR0=0;
}

//****************************************//
void delay(uchar z) //在12M下延時z毫秒
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

//******************************//
void keyscan()
{

if(stop==0)
{
TR0=0; //關閉定時器0 即可停止轉動
end_turn;

}
if(left==0)
{
TR0=1;
dflag=1; //轉向標志置位則左轉
}
if(right==0)
{
TR0=1;
dflag=0; //轉向標志復位則右轉
}
if(accelerate==0)
{
delay(5) ; //延時消抖
if(accelerate==0)
{
while(accelerate==0) ; //等待鬆手
count++;
if(count==1)
{
t0=20000;
t1=30000; //占空比為百分之60
}
if(count==2)
{
t0=15000;
t1=35000; //占空比為百分之70
}
if(count==3)
{
t0=10000;
t1=40000; //占空比為百分之80
}
if(count==4)
{
t0=5000;
t1=45000; //占空比為百分之90
}
if(count==5)
{
count=0;
}
}

}
}

『貳』 單片機C語言程序怎麼控制電動機

步進電機(5V)與在單片機之間要加個驅動晶元,如ULN2803等,單片機通過程序產生PWM輸出四拍或八拍控制波,( 四拍的驅動正轉順序為A-B-C-D-A,八拍的驅動正轉順序為A-AB-B-BC-C-CD-D-DA-A),步進電機就轉起來了。
單片機(Microcontrollers)是一種集成電路晶元,是採用超大規模集成電路技術把具有數據處理能力的中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、多種I/O口和中斷系統、定時器/計數器等功能(可能還包括顯示驅動電路、脈寬調制電路、模擬多路轉換器、A/D轉換器等電路)集成到一塊矽片上構成的一個小而完善的微型計算機系統,在工業控制領域廣泛應用。從上世紀80年代,由當時的4位、8位單片機,發展到現在的300M的高速單片機。

『叄』 步進電機驅動程序C語言

步進電機控製程序(c語言+51單片機)

#include<reg51.h>

#define uint unsigned int
#define uchar unsigned char
#define ms *77
// f = 12 M
#define LEDLen 4
#define Dj_star() {IE=0x81; pri_dj=0; }
#define Dj_stop() {IE=0x00; pri_dj=1; P1=0xff; shache="0"; delay(800ms); delay(800ms);delay(400ms); shache = 1; }
#define Chilun_Num 8
/* 齒輪數 8 個*/
#define set_display_num() { LEDBuf[0] = tmp / 1000; LEDBuf[1] = tmp / 100 % 10; \
LEDBuf[2] = tmp / 10 % 10; LEDBuf[3] = tmp % 10; }
uchar LEDBuf[LEDLen] = {0,0,0,0};
void read_num (); /* 讀播碼盤 到 set_round_num * 8 */
void display ();
void delay(uint delay_time) { uint i; for (i=0; i < delay_time ; i++) ; }
void run ();
void fx_run();

uint round_num = 0; /* 記錄已轉的 齒輪數 , 中斷1次 加 1*/
uint set_round_num = 0; /* 播碼盤設置 圈數 */
uint set_pwm_width = 0; /* 播碼盤設置 步進電機 正向速度 */
bit one_round_flg = 0;
sbit led_1000 = P0^7; //use for display
sbit led_100 = P0^6; //use for display
sbit led_10 = P0^5; //use for display
sbit led_1 = P0^4; //use for display

sbit key_start = P3^0;
sbit key_puse = P3^0;
sbit key_clear = P3^1;
/* P3^2 接齒輪感測器 中斷 */
sbit bujin_zx_stop = P3^3; /* 接步進電機 ,正向到位感測器 ,為 0 停機 */
sbit bujin_fx_stop = P3^4; /* 接步進電機 ,反向到位感測器 ,為 0 停機 */

sbit shache = P3^5; /* 接剎車控制繼電器 0 電位有效 */
sbit pri_dj = P3^6; /* 接主電機控制繼電器 0 電位有效 */

void main(){
TCON = 0x01;
display();
while(1) {
IE="0x00";
round_num = 0;
display();
if ( bujin_fx_stop ) fx_run();
while ( key_start );
delay ( 8ms );
if(!key_start){
read_num();
//set_round_num = 8;
while ( !key_start );
run ();
fx_run();
}
}
}

void run () {
#define Delay_time 180
/* 轉一圈 50 次循環,每循環 4 步 ,50 * 4 = 200 , 200 * 1。8 = 360 */
uchar i ;
P1 = 0xff;
set_pwm_width = 15 + set_pwm_width / 10;
while ( 1 ) {

while( !shache | !key_start );
Dj_star();
for ( i="0" ; bujin_zx_stop & !pri_dj;i++ ){
P1 = 0xf9;
delay ( Delay_time ); // bujin_zx_stop = P3^3;
P1 = 0xfc; // bujin_fx_stop = P3^4;
delay ( Delay_time); // key_puse = P3^0;
P1 = 0xf6; // key_clear = P3^1;
delay ( Delay_time ); // shache = P3^5;
P1 = 0xf3; // pri_dj = P3^6;
delay ( Delay_time );
if( i == set_pwm_width ) { P1 = 0xff; i = 0; one_round_flg = 0; while ( !one_round_flg & key_puse );}
if(!key_puse) { delay(4ms); if(!key_puse) break; }
}

P1 = 0xff;
if ( pri_dj ) break;

if ( !key_puse ) {
delay ( 8ms );
if ( !key_puse ) {
Dj_stop();
while ( !key_puse );
// next pree key
while( !shache );

while(1){
while ( key_puse & key_clear );
delay ( 8ms );
if ( !key_clear ) { round_num = 0; display(); }
if ( !key_puse ) break;
}
while( !key_puse );
delay(8ms);
while( !key_puse );
}
}
}
}
void ext_int0(void) interrupt 0 { /* 主電機 齒輪 中斷 */
uint tmp;
EA = 0;
if( !pri_dj ){
round_num ++;
if (round_num % Chilun_Num == 0 ){
one_round_flg = 1;
tmp = round_num / Chilun_Num ;
set_display_num();
P0 = 0xf0;
P0 = P0 | LEDBuf[0] ;
led_1000 = 0;
P0 |= 0xf0;

P0 = 0xf0;
P0 = P0 | LEDBuf[1] ;
led_100 = 0;
P0 |= 0xf0;

P0 = 0xf0;
P0 = P0 | LEDBuf[2] ;
led_10 = 0;
P0 |= 0xf0;

P0 = 0xf0;
P0 = P0 | LEDBuf[3] ;
led_1 = 0;
P0 |= 0xf0;

P0 = 0xf0;
}
if ( round_num >= set_round_num ) Dj_stop();
}
EA = 0x81;
}

void display(){
uchar i;
uint tmp = 0;
tmp = round_num / Chilun_Num ;
set_display_num();
for(i = 0; i < LEDLen ; i ++){
P0 = 0xf0;
P0 = P0 | LEDBuf[i] ;
if(i==0) led_1000 = 0; //P0^4
if(i==1) led_100 = 0; //P0^5
if(i==2) led_10 = 0; //P0^6
if(i==3) led_1 = 0; //P0^7
P0 |= 0xf0;
}
P0 = 0xf0;
}

void read_num(){
/* 讀播碼盤 到 set_round_num ,set_pwm_width */
uchar tmp;
P2 = 0xFF;
P2 = 0xEF; // 1110 1111
delay ( 1ms );
tmp = ~(P2 | 0xF0);

P2 = 0xDF; // 1101 1111
delay ( 1ms );
tmp = (~(P2 | 0xF0 )) * 10 + tmp;
set_round_num = tmp;

P2 = 0xBF; // 1011 1111
delay ( 1ms );
tmp = (~(P2 | 0xF0));

P2 = 0x7F; // 0111 1111
delay ( 1ms );
tmp = (~(P2 | 0xF0)) * 10 + tmp;

set_round_num = set_round_num + tmp * 100;
set_round_num = set_round_num * Chilun_Num;

P2 = 0xFF;
P1 = 0xbF; // 0111 1111
delay ( 1ms );
tmp = ~(P2 | 0xF0) ;

P1 = 0xFF;
P2 = 0xFF;
P1 &= 0x7F; // 1011 1111
delay ( 1ms );
tmp = (~(P2 | 0xF0)) * 10 + tmp ;
set_pwm_width = tmp ;

P1 = 0xFF;
P2 = 0xFF;
}

void fx_run(){
#define f_Delay_time 180
while ( bujin_fx_stop ) { /* 反向 回車 直到 感測器 動作*/
P1 = 0xf3; //0011
delay ( f_Delay_time );
P1 = 0xf6; //0110
delay ( f_Delay_time );
P1 = 0xfc; //1100
delay ( f_Delay_time );
P1 = 0xf9; //1001
delay ( f_Delay_time );
}
P1 = 0xff;
}

『肆』 STC單片機控制兩台交流電動機的C語言程序

這很簡單,我會教你怎麼玩,下面的思路和方法
想法:有三個輸入,即一個按鍵,兩個霍爾感測器(接近開關),我用P0.0 P0。代替;兩個或兩個以上的(看到你,然後電腦顯示,不具備數字輸出,直接串列)反轉繼電器引腳P1.0,P1.1控制;

PS:輸出顯示一塊,我不知道如何處理,但需要連接一個全局變數旋轉頻率K,其他兩個NPN感測器接近開關,光電隔離輸入選擇,總之,一個有效的信號引腳電壓被拉到上,要注意些什麼具體的硬體,要問我

現在讓我們來寫一個程序:

# / /可選晶體11.0592MHZ

說倒車頻率

SBIT X0 = P3 ^ 2,無符號字元型K表= 0; / / K / /調整按鈕

SBIT X1 = P1 ^ 1 / /上限接近開關信號

SBIT X2 = P1 ^ 2; / /下限接近切換信號

SBIT Y1 = P0 ^ 0 / /電機上升(註:我使用的引腳為0,賽車運動,這樣可避免啟動時間,單片機自動復位電動機慢跑)<BR / SBIT Y2 = P0 ^ 1 / /無效delay50ms電機下降

(unsigned int類型)

{

unsigned int類型;

(I,I> 0;我 - )

(J = 46078; J> 0,J - );

}

主要() {

IT0 = 1; / /下降沿觸發

的EX0 = 1; / /打開P3.2外部中斷

EA = 1;而(1)

同時斷開

/ /總(K)

{

Y1 = 0; / /正向

而(X1 == 1)/ /等待正向接近開關反應

Y1 = 1; / /正向停車

delay50ms的( 1)/ /停止時間為50ms的

Y2 = 0; / /反向

(X2 == 1)/ /等待反轉接近開關反應

Y2 = 1; / /扭轉停止

K表 - / /圈數少了

}

}

計數器,無效(無效)中斷0

{

K + + / /外部中斷控制環加一個

/ /這個位置可以添加到你的程序

}
程序已通過測試,豎起就能使用了很多的樂趣喲,呵呵

『伍』 用c語言編寫控制電機運動的程序

1、有三個輸入,分別是一個按鈕、兩個霍爾感測器(也就是接近開關),我用P0.0到P0.2來代替;輸出2個或以上(這看接什麼顯示器,如果是PC的話,就不用數字量輸出,直接串口就可以了)控制正反轉的繼電器管腳用P1.0、P1.1;需要與一個全局變數轉動次數k連接起來,另外兩個輸入接近開關選用NPN感測器或用光電隔離,總之有效信號能把管腳電壓拉低就可以。
2、常式:

#include<reg51.h>//選用晶振11.0592MHz
unsignedchark=0;//k表示正反轉次數
sbitX0=P3^2;//調節按鈕
sbitX1=P1^1;//上限位接近開關信號
sbitX2=P1^2;//下限位接近開關信號
sbitY1=P0^0;//電機上升(注意:我使用的是管腳輸出為0時候,電機運動,這樣可以避免啟動時候,單片機自復位對電機點動的影響)
sbitY2=P0^1;//電機下降
voiddelay50ms(unsignedinti)
{
unsignedintj;
for(i;i>0;i--)
for(j=46078;j>0;j--);
}
main()
{
IT0=1;//下降沿觸發
EX0=1;//開P3.2外部中斷
EA=1;//總中斷開
while(1)
while(k)
{
Y1=0;//正轉
while(X1==1);//等待正轉接近開關反應
Y1=1;//正轉停
delay50ms(1);//停止時間50ms
Y2=0;//反轉
while(X2==1);//等待反轉接近開關反應
Y2=1;//反轉停
k--;//圈數減一
}
}
voidcounter0(void)interrupt0
{
k++;//外部中斷控制圈數加一
//這個位置可以加你顯示程序
}

『陸』 單片機控制電機正反轉動的c語言程序

首先要看你的電機是直流電機還是步進電機。直流電機就簡單了,只有兩根線,電機兩端電壓正負極改變就可以實現正轉反轉。不過要加電機驅動晶元,或者H橋電路,電機驅動晶元可以選擇L298N,加上適當的外圍電路就可以直接用單片機控制電機了。比如讓單片機P1.0 = 0,P1.1 = 1;(單片機I/0口要與電機驅動晶元的輸入腳相連)這樣的話,電機驅動晶元就會輸出一個電壓差,可以使直流電機向一個方向轉,如果使P1.0 = 1,P1.1 = 0,則電機驅動晶元會輸出一個和剛才相反的電壓,使電機向相反的方向轉動。H橋電路和電機驅動晶元的原理差不多,網上多的是。我這說的只是簡單的原理,實際中,L298N的輸入端和單片機相連的時候要加光耦隔離,否則單片機會工作不正常。步進電機就稍微復雜點,也得需要電機驅動晶元才行,只不過控制信號是按一定的規律給的,規律變了,電機轉動的方向也就變了。樓上給出的貌似是步進電機的驅動程序。

『柒』 用c語言程序實現步進電機的正反轉加減速的編程

內容:1、本程序用於測試4相步進電機常規驅動
2、需要用跳帽或者杜邦線把信號輸出端和對應的步進電機信號輸入端連接起來
3、速度不可以調節的過快,不然就沒有力矩轉動了
4、按s4(設置成獨立按鍵模式)可以控制正反轉
------------------------------------------------*/

#include <reg52.h>

bit Flag;//定義正反轉標志位

unsigned char code F_Rotation[4]={0xf1,0xf2,0xf4,0xf8}; //正轉表格
unsigned char code B_Rotation[4]={0xf8,0xf4,0xf2,0xf1}; //反轉表格
/******************************************************************/
/* 延時函數 */
/******************************************************************/
void Delay(unsigned int i)//延時
{
while(--i);
}
/******************************************************************/
/* 主函數 */
/******************************************************************/
main()
{

unsigned char i;

EX1=1; //外部中斷0開
IT1=1; //邊沿觸發
EA=1; //全局中斷開

while(!Flag)
{
P0=0x71;//顯示 F 標示正轉
for(i=0;i<4;i++) //4相
{
P1=F_Rotation[i]; //輸出對應的相 可以自行換成反轉表格
Delay(500); //改變這個參數可以調整電機轉速 ,數字越小,轉速越大
}
}
while(Flag)
{
P0=0x7C;//顯示 b 標示反轉
for(i=0;i<4;i++) //4相
{
P1=B_Rotation[i]; //輸出對應的相
Delay(500); //改變這個參數可以調整電機轉速 ,數字越小,轉速越大
}
}
}
/******************************************************************/
/* 中斷入口函數 */
/******************************************************************/
void ISR_Key(void) interrupt 2 using 1
{
Delay(300);

Flag=!Flag; //s3按下觸發一次,標志位取反

}

『捌』 如何用C語言控制步進電機 正轉後自動反轉

中斷2,啟動-停止切換(通過切換flag_status),顯示狀態。do-while是延時。
中斷1,計數器count增1,如果達到預設的數值tab[sp],計數器歸零,標志flag置1。這個好像與速度有關。通過調整延時時間來調整速度。
中斷0,讀鍵盤。沒有scan_key()的源代碼,不知道裡面有些什麼操作。
while(1){...}循環是電機運轉,flag_status是狀態,1轉動,0停止。
沒有看到與正轉反轉有關的代碼。也許在motor_cw_ccw();函數裡面,這個就是電機動一下的函數。

原程序不完整,沒有相應函數、變數的定義及意義說明。難以確切理解。

『玖』 基於移動小車驅動電機運轉的C語言程序

一、當小車各模塊電路接通時,運行小車程序,判斷前方是否有障礙物;

若無障礙物,則向前行駛;

若有障礙物則判斷障礙物時左邊還是右邊;

若障礙物是右邊的,則控制小車向左轉,反之,若障礙物時左邊的,則小車向右轉。