資料十分全面,源程序(加注釋)、原理圖、仿真圖、焊接圖,以及講解視頻 均可在附件中下載
51hei.png (47.11 KB, 下載次數: 29)
下載附件
2020-6-21 16:05 上傳
• 1.本設計采用STC89C51/52(與AT89S51/52、AT89C51/52通用,可任選)單片機作為主控制器
• 2.采用霍爾傳感器非接觸式測電機轉速
• 3.LCD1602液晶顯示當前的轉速,轉速單位為轉/分(RPM)。和顯示當前的pwm占空比0~100%。
• 4.電機的速度可以通過按鍵調整,也可以開始暫停,正轉和反轉。
注意:磁鐵和霍爾元件最近距離在2mm左右,太近可能會在電機轉動時碰到霍爾元件,太遠霍爾元件可能會檢測不到磁鐵。
使用說明:
液晶屏第一行顯示電機轉速,第二行顯示占空比,占空比數值越大,電機轉速越快。
系統一共有6個按鍵,單片機附近的獨立按鍵是系統的復位按鍵,按下單片機會復位。
下面一排是控制按鍵:
1鍵:加速鍵,可以短按,占空比加1,也可長按,占空比連續加;
2鍵:減速鍵,可以短按,占空比減1,也可長按,占空比連續減;
3鍵:正轉切換鍵,按下后電機正轉;
4鍵:反轉切換鍵,按下后電機反轉;
5鍵:開始暫停鍵,按一下開始,再按一下暫停。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (22.86 KB, 下載次數: 22)
下載附件
2020-6-21 15:59 上傳
單片機源程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void displaym();
void displayj();
sbit en=P2^5; //1602 6管腳
sbit rs=P2^7; //1602端口 4管腳
sbit rw=P2^6;//lcd1602控制端口 5管腳
sbit num1=P1^0; //占空比加1
sbit num2=P1^1; //占空比減一
sbit num3=P1^2; //正傳
sbit num4=P1^3; //反轉
sbit num5=P1^4; //開始停止切換
sbit beep=P2^4;
sbit out=P3^4; //PWM輸出用于正傳
sbit out1=P3^7; //PWM輸出用于反轉
uint zhuansu,flag,z1,z2,m,flag_1,zheng,fan,kai,j,su,qian,bai,shi,ge;
void delay(uint z)//延時1ms函數
{
uint x,y;
for(x=0;x<z;x++)
for(y=0;y<110;y++);
}
void write_com(uchar com)//向1602寫一字節(控制指令)
{
rs=0;
P0=com;
delay(5);
en=1;
delay(10);
en=0;
}
void write_data(uchar date)//向1602寫一字節(數據)
{
rs=1;
P0=date;
delay(5);
en=1;
delay(5);
en=0;
}
void init()//初始化函數
{
en=0;
rw=0;
write_com(0x38); //5X7顯示
write_com(0x0c); //關閉光標
write_com(0x01); //lcd初始化
TMOD=0x11; //定時器方式1
TH0=0xdc;
TL0=0x00; //定時器裝入初值
EA=1; //開總中斷
ET0=1; //定時器0開中斷
TR0=1;
EX1=1;
IT1=1; //定時器啟動
TH1=0xfc;
TL1=0x66;//定時100us
ET1=1; //定時器1開中斷
TR1=1;
write_com(0x80);
write_data('V');
write_data(':');
write_com(0x87); //第一行顯示轉速
write_data('m');
write_data('/');
write_data('m');
write_data('i');
write_data('n');
write_com(0xc0);
write_data('z');
write_data('k');
write_data('b');
write_data(':');
displaym();
write_com(0xc8);
write_data('s');
write_data('d');
write_data(':');
displayj();
}
void keyscan() //鍵盤掃描函數
{
if(num1==0)
{
delay(5); //消除抖動
if(num1==0)
{
if(m<=199)
m++;
displaym(); //設定占空比加一
}
}
if(num2==0)
{
delay(5);
if(num2==0)
{
if(m>=1)
m--;
displaym(); //設定占空比減一
}
}
if(num3==0)
{
delay(5);
if(num3==0)
{
j=j+1;
displayj();
}
}
if(num4==0)
{
delay(5);
if(num4==0)
{
j=j-1;
displayj();
}
}
if(num5==0)
{
delay(5);
if(num5==0)
{
while(num5==0) ;
kai=1-kai;
}
}
}
void display()
{
write_com(0x82);
zhuansu=zhuansu*30; //將兩秒內的計數乘以30得到轉每分
su=zhuansu*0.01*2*3.14/2;
qian=(su/1000)%100;
write_data(qian+0x30);
bai=(su/100)%10;
write_data(bai+0x30);
shi=(su/10)%10;
write_data(shi+0x30);
write_data('.');
ge=su%10;
write_data(ge+0x30);
write_com(0xd0);
}
void displaym()
{
write_com(0xc4);
if(m/200%10!=0)
write_data(m/200%10+0x30); //如果占空比百位不為0則顯示百位否則顯示空格
else
write_data(' ');
if(m/200%10==0&&m/20%10==0)
write_data(' ');
else
write_data(m/20%10+0x30); //如果占空比小于10 十位正常顯示 否則顯示空格
write_data(m/2%10+0x30); //顯示個位
}
void displayj()
{
write_com(0xcb);
if(j/100%10!=0)
write_data(m/100%10+0x30);
else
write_data(' ');
if(j/100%10==0&&j/10%10==0)
write_data(' ');
else
write_data(j/10%10+0x30);
write_data(j/1%10+0x30);
write_com(0xd0);
}
void main()
{
flag_1=0;
m=100; //占空比為100
zhuansu=0; //轉速初值0
flag=0;
zheng=1; //初始化電機正轉動
fan=0;
j=67;
init(); //初始化
while(1)
{
keyscan(); //鍵盤掃描程序
if(su>j*10)
{
kai=0;
beep=~beep;
delay(500);
kai=1;
m-50;
}
}
}
...............
..........限制于本頁篇幅余下代碼請到51黑中下載
51單片機測速.rar
(4.75 MB, 下載次數: 113)
2020-6-21 15:42 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|