久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
STC89C52單片機(PWM直流電機調速正反轉帶eeprom記憶)源程序
[打印本頁]
作者:
ssk7793
時間:
2020-10-25 16:29
標題:
STC89C52單片機(PWM直流電機調速正反轉帶eeprom記憶)源程序
好久沒玩單片機, 又花了些時間重新找回感覺
花了三天時間測試買了很久的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
作者:
faridzled
時間:
2020-10-26 08:01
thanks for sharing
作者:
slmsz
時間:
2020-11-3 11:16
thanks for sharing
作者:
lllshuai
時間:
2020-11-7 16:00
Thanks for sharing
作者:
bsljling
時間:
2020-11-9 07:01
雖然暫時看不懂,還是要頂一個。
作者:
yang03777
時間:
2020-11-12 10:28
沒有電路圖嗎
作者:
凜冬將至啊
時間:
2021-9-24 10:16
thanks for sharing
作者:
Aizlna
時間:
2021-9-25 00:00
受教了,感謝大師
作者:
jsezcyc
時間:
2021-10-15 17:32
萌新求教,有沒有大佬能夠解釋一下,我想問一下按下按鍵之后,對應的zsdj和count0變化以后,是怎樣改變pwm波的占空比的?我只看到按鍵程序改變轉速等級和占空比變量的數值
最后面的定時器中斷貌似沒改變時間啊,是我理解不到位嗎?
作者:
mxdkey
時間:
2021-10-20 08:42
感謝分享,你的資料很有參考價值!
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲视频中文字幕
|
欧美精品一区二区三区四区五区
|
精品久久久久久久久久久久久久
|
欧美精品日韩精品国产精品
|
在线观看国产视频
|
日本精品免费
|
久久99一区二区
|
国产在线看片
|
韩日三级
|
国产精品久久
|
色播久久久
|
色综合久久天天综合网
|
九九热免费看
|
久久一日本道色综合久久
|
欧美人妇做爰xxxⅹ性高电影
|
国产xxxx岁13xxxxhd
|
中文字幕免费视频
|
亚洲精品美女视频
|
亚洲不卡一
|
欧美 日韩 综合
|
欧美最猛黑人xxxx黑人
|
久草网址
|
成人精品视频免费
|
亚洲一区电影
|
国产视频二区在线观看
|
国产精品免费一区二区三区
|
欧美激情 一区
|
最新国产在线
|
欧美在线一区二区三区
|
日日操视频
|
99av成人精品国语自产拍
|
日韩三级一区
|
依人成人
|
男人的天堂在线视频
|
欧美理论
|
国产一区二区三区在线视频
|
一区二区中文
|
日本字幕在线观看
|
激情毛片
|
亚洲一区二区三区免费在线观看
|
国产污视频在线
|