好久沒玩單片機, 又花了些時間重新找回感覺
花了三天時間測試買了很久的L298N迷你板, 之前接了單片機的P0^0和P0^1結果沒有反應, 還以為是L298N壞了
L298N模塊1.jpg (62.07 KB, 下載次數: 194)
下載附件
2020-10-25 16:21 上傳
L298N模塊2.jpg (98.5 KB, 下載次數: 113)
下載附件
2020-10-25 16:21 上傳
老樣子, 單片機代碼我盡量備注詳細, 別問我要電路圖啊, 引腳接線我都已注明清楚
- /*******************************************************************/
- /* 程序名稱:STC89C52_PWM直流電機調速及正反轉
- /* 單片機型號:STC89C52系列 晶振:11.00592 MHz
- /* 單片機供電5V, L298N模塊可共用電源, 也可以單獨外接電源(具體看L298N模塊說明)
- /* 直流電機的PWM波控制,可以直接調速從0到100共21級(每級+5)
- /* 所謂的占空比其實就是利用計數改變0和1的比列
- /* 大家可以接LED測試, 當占空比越大, LED燈閃爍越慢, 當占空比越小, LED閃爍越快, 直到眼睛都看不出有閃爍
- /* 新增功能:
- /* 2020.10.24 新增長按停止, 短按保留正反轉
- /* 2020.10.25 將調速等級和正反轉狀態寫入EEPROM, 以便關機后再次開機能保留關機前狀態
- /*****************************************************************/
- #include "eeprom.h"
-
- #define TH0_TL0 (65536-1000)//設定中斷的間隔時長
- //引腳聲明
- sbit Key_add=P2^0; //電機加速(輕觸開關一腳接P2^0, 斜對腳接GND)
- sbit Key_minus=P2^1; //電機減速(輕觸開關一腳接P2^1, 斜對腳接GND)
- sbit Key_fr=P2^2; //電機反向(輕觸開關一腳接P2^2, 斜對腳接GND)
- //L298N模塊+引腳接VCC, -引腳接GND
- //MOTOR-A二個引腳接電機的二個引腳, 正反自己按需求調整
- sbit PWM1=P2^6; //PWM1 (接L298N模塊的L298N模塊的INT1)
- sbit PWM2=P2^7; //PWM2 (接L298N模塊的L298N模塊的INT2)
- //配合eeprom使用
- uchar code set1[21]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15}; //用來判斷調速等級
- uchar code set2[2]={0x01,0x02}; //用來判斷正反轉
- uint zsdj; //轉速等級
- uchar count0; //低電平的占空比
- uchar count1 = 0;//高電平的占空比
- bit Flag;//電機正反轉標志位 -- 1正轉,0反轉
- bit zt = 1; //記錄狀態(1啟動, 0停止)
- //用于判斷Key_fr的長按短按
- #define key_S 500 //宏定義短按(約20ms)
- #define key_L 16000 //宏定義長按(約2/3s)
- #define key_M 8000 //宏定義長按間隔(約1/3s)
- /************函數聲明**************/
- void Write_Eeprom(void); //寫eeprom
- void Motor_High_speed(void); //馬達高速
- void Motor_Low_speed(void); //馬達低速
- void Motor_Forward_and_Reverse(void); //馬達正反轉
- void Timer0_init(void); //定時器0初始化
- /*寫eeprom*/
- void Write_Eeprom(void){
- IapEraseSector(0x2000); //擦除0x2000--0x21FF
- IapProgramByte(0x2001,set1[zsdj]); //存儲count0
- IapProgramByte(0x2002,set2[Flag]); //存儲Flag
- }
- /*******按鍵+處理增加PWM,PWM越大,電機越快**********/
- void Motor_High_speed(void)
- {
- if(Key_add==0)
- {
- Delay(10);
- if(Key_add==0)
- {
- count0 += 5;
- zsdj += 1;
- if(count0 >= 100)
- {
- count0 = 100;
- }
- if(zsdj >= 20)
- {
- zsdj = 20;
- }
- Write_Eeprom(); //eeprom操作
- }
- while(!Key_add);//等待鍵松開
- }
- }
- /*******按鍵-處理減少PWM,PWM越小,電機越慢**********/
- void Motor_Low_speed(void)
- {
- if(Key_minus==0)
- {
- Delay(10);
- if(Key_minus==0)
- {
- count0 -= 5;
- zsdj -= 1;
-
- if(count0 <= 0)
- {
- count0 = 0;
- }
- if(zsdj <= 0)
- {
- zsdj = 0;
- }
- Write_Eeprom(); //eeprom操作
- }
- while(!Key_minus);
- }
- }
- /************電機正反向控制**************/
- void Motor_Forward_and_Reverse(void)
- {
- static uint jcs=0; //計數變量
- if(!Key_fr)
- {
- jcs++;
- if(jcs>=key_L) //長按
- {
- jcs=key_M; //設一個值
- zt=0; //停止
- }
- }
- else //按鍵抬起
- {
- if(jcs>key_S && jcs<key_M)//短按
- {
- if(zt==1){
- Flag=~Flag; //當狀態為1時,才會切換正反轉
- Write_Eeprom(); //eeprom操作
- }
- if(zt==0){
- PWM1=0; //當狀態為0時,啟動為正轉
- PWM2=1;
- }
- zt=1; //設狀態為1
- }
- jcs=0; //count清0
- }
- }
- /***********定時器0初始化***********/
- void Timer0_init(void)
- {
- TMOD=0x01; //定時器0工作于方式1
- TH0=TH0_TL0/256;
- TL0=TH0_TL0%256;
- TR0=1;
- ET0=1;
- EA=1;
- }
- /*********主函數********************/
- void main(void)
- {
- //開機初始化定時器0
- Timer0_init();
-
- //開機讀取記憶數據(轉速等級)
- switch(IapReadByte(0x2001))
- { //判斷
- case 0x01:count0=0;zsdj=0;break;
- case 0x02:count0=5;zsdj=1;break;
- case 0x03:count0=10;zsdj=2;break;
- case 0x04:count0=15;zsdj=3;break;
- case 0x05:count0=20;zsdj=4;break;
- case 0x06:count0=25;zsdj=5;break;
- case 0x07:count0=30;zsdj=6;break;
- case 0x08:count0=35;zsdj=7;break;
- case 0x09:count0=40;zsdj=8;break;
- case 0x0A:count0=45;zsdj=9;break;
- case 0x0B:count0=50;zsdj=10;break;
- case 0x0C:count0=55;zsdj=11;break;
- case 0x0D:count0=60;zsdj=12;break;
- case 0x0E:count0=65;zsdj=13;break;
- case 0x0F:count0=70;zsdj=14;break;
- case 0x10:count0=75;zsdj=15;break;
- case 0x11:count0=80;zsdj=16;break;
- case 0x12:count0=85;zsdj=17;break;
- case 0x13:count0=90;zsdj=18;break;
- case 0x14:count0=95;zsdj=19;break;
- case 0x15:count0=100;zsdj=20;break;
- default:count0=50;zsdj=10;
- }
-
- //開機讀取記憶數據(正向或反向)
- if(IapReadByte(0x2002)==0x01){
- Flag = 0;
- }
- else if(IapReadByte(0x2002)==0x02){
- Flag = 1;
- }
- while(1)
- {
- Motor_High_speed(); //加速
- Motor_Low_speed(); //減速
- Motor_Forward_and_Reverse(); //正反轉
- }
- }
復制代碼
全部代碼請下載附件
STC89C52(PWM直流電機調速正反轉帶eeprom記憶).zip
(190.92 KB, 下載次數: 153)
2020-10-25 16:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|