自己寫的一個(gè)單片機(jī)程序,簡(jiǎn)單的通過L298控制直流電機(jī)正反轉(zhuǎn)
利用定時(shí)器,產(chǎn)生pwm
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
可調(diào)占空比,電機(jī)正反轉(zhuǎn)
單片機(jī)源程序如下:
- #include"reg52.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit IN1=P2^4;
- sbit IN2=P2^5;
- sbit ENA=P3^7;
- sbit Add=P1^0;
- sbit Sub=P1^1;
- sbit zhen=P1^2;
- sbit fan=P1^3;
- sbit Stop=P1^4;
- sbit WE4=P2^0;
- sbit WE3=P2^1;
- sbit WE2=P2^2;
- sbit WE1=P2^3;
- sbit PWM=P3^7;
- uint cnt=0;//脈沖計(jì)數(shù)
- int PWMTime=60;//初始脈沖寬度
- uint speed = 0;//速度
- int dw = 5; //檔位
- uint time;//時(shí)間計(jì)數(shù)
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陽極數(shù)碼管段選
- void SystemInt();
- void delay(uint x);
- void PWMOUT();
- void SetSpeed();
- void display();//函數(shù)定義
- void delay(uint x) //延時(shí)函數(shù)
- {
- uint i,j;
- for(i=x;i>0;i--)
- for(j=0;j<110;j++);
- }
- void SystemInt() //系統(tǒng)初始化
- {
- TMOD = 0x51; //T0定時(shí)器 T1計(jì)數(shù)器 均采用方式1
- TH0 = (65536-250)/256;
- TL0 = (65536-250)%256; //250us
- ET0 = 1; TR0 = 1; //打開T0
- ET1 = 1;TR1 = 1; //打開T1
- TH1 = 0;
- TL1 = 0; //計(jì)數(shù)器初值為0
- EA = 1; //開啟總中斷
- IN1 = 1;
- IN2 = 0; //初始正轉(zhuǎn)
- }
- void PWMOUT() //PWM輸出控制
- {
- if(cnt<PWMTime) //小于計(jì)數(shù)變量,輸出高電平
- {
- PWM=1;
- }
- else
- {
- PWM=0; //大于計(jì)數(shù)變量,低電平
- }
- if(cnt>100)
- cnt=0;
- }
- void SetSpeed() //速度設(shè)定
- {
- if(Add==0) //速度加
- {
- delay(100); //按鍵消抖
- if(Add==0)
- {
- PWMTime+=10; //PWM波占空比增加10%
- dw += 1; //檔位加1
- if(dw>9)
- {
- dw = 9;
- }
- while(Add==0); //松手檢測(cè)
- }
- }
- if(Sub==0) //如果速度減
- {
- delay(100); // 按鍵消抖
- if(Sub==0)
- {
- PWMTime-=10; //PWM波占空比減少10%
- dw -= 1; //檔位減1
- if(dw<0)
- {
- dw = 0;
- }
- while(Sub==0);
- }
- }
- if(zhen==0) //正轉(zhuǎn)
- {
- delay(100);
- if(zhen==0)
- {
- IN1 = 1;
- IN2 = 0;
- while(zhen==0);
- }
- }
- if(fan==0) //反轉(zhuǎn)
- {
- delay(100);
- if(fan==0)
- {
- IN1 = 0;
- IN2 = 1;
- while(fan==0);
- }
- }
- if(Stop==0) //停止
- {
- delay(100);
- if(Stop==0)
- {
- IN1 = 1;
- IN2 = 1;
- while(Stop==0);
- }
- }
- }
- void xianshi() //數(shù)碼管顯示速度和檔位
- {
- uint shi,ge;
- shi=speed/10;
- ge=speed%10;
- WE1 = 0;
- P0 = table[ge]; //速度個(gè)位顯示
- delay(1);
- WE1 = 1;
-
- WE2 = 0;
- P0 = table[shi]; //速度十位顯示
- delay(1);
- WE2 = 1;
-
- WE3 = 1;
-
- WE4 = 0;
- P0 = table[dw]; //檔位顯示
- delay(1);
- WE4 = 1;
- }
- void timer0() interrupt 1 //定時(shí)器
- {
- TH0 = (65536-250)/256;
- TL0 = (65536-250)%256; //250us
- cnt++;
- time++;
- if(time==4000) //1s時(shí)間內(nèi)T1的脈沖次數(shù)
- {
- time = 0; //計(jì)數(shù)置0
- TR0 = 0;TR1 = 0; //先關(guān)閉定時(shí)器
- speed = TH1;
- speed = speed << 8; //左移8位
- speed += TL1; //賦值
- speed = speed*2.2; //電機(jī)轉(zhuǎn)一圈產(chǎn)生24個(gè)脈沖,轉(zhuǎn)速為speed/24*60 r/min
- TH1 = 0;TL1 = 0; //清0重新計(jì)數(shù)
- TR0 = 1;TR1 = 1; //重新啟動(dòng)定時(shí)器
- }
- }
- void timer1() interrupt 3 //計(jì)數(shù)器
- {
- TH1 = 0;
- TL1 = 0; //計(jì)數(shù)T1外部脈沖
- }
- void main()
- {
- SystemInt();
- while(1)
- {
- PWMOUT();
- SetSpeed();
- xianshi();
- }
- }
復(fù)制代碼
Proteus仿真8.10版本的仿真文件下載(如果沒有安裝8.10的朋友就不要下載了,其他版本打不開的)
直流電機(jī).7z
(107.52 KB, 下載次數(shù): 131)
2022-7-4 19:35 上傳
點(diǎn)擊文件名下載附件
|