1. 小项目简介
主要采用stc89c51/52单片机作为主控,由霍尔传感器作为测速的基本模块,采用按键控制速度快慢,数码管显示当前速度。
最后成品图如下:
2.电源部分
1.电源供电的功率尽可能的稍微大一些,我是采用罗马仕充电宝供电(5V,2.1A输出口)。因为电源功率过小,将造成电机无法带动,或者数码管闪烁等硬件上的bug。 2.如果电源的电压高于5V,需要在电源输入端使用一个稳压电路,将输入电压稳压到5V给单片机,和其他外设供电。防止电压过高造成器件损坏。
3.硬件部分
1. stc89c51/52的最小系统 注意:如果使用一般的USB接口供电,当电机转动时候,可能照成单片机的管脚供电不稳定,所以需要在单片机的IO的外接上拉排阻。P3口不需要。 9针排阻如下:有小点的一端是公共端,需要和电源5V连接,其余口和单片机管脚一一对应焊接就行。 2. 霍尔传感器 注意引脚,窄的一面来看引脚顺序: 这里的VOUT口可以直接连接单片机的外部中断1口,可以经过一个电压比较器lm393之类的在给单片机。 3. 直流电机马达驱动 51单片机的IO口输出的电流过小,驱动直流电机马达效果不明显,达不到后期变速,需要使用一个三极管(9015\9013这类都可以)放大电路去驱动马达:示范电路如下:(电阻根据自己需要修改) 4. 共阴数码管
sbit S1=P2^4;
sbit S2=P2^5;
sbit S3=P2^6;
sbit S4=P2^7;
4.软件部分
1.软件工程整体图:
2.main.c文件代码: 自己创建一个51单片机的keil工程文件,将下面代码拷贝到自己工程文件下的main.c文件替换即可
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit led=P0^0;
u16 time = 0;
u16 count=30;
sbit PWM=P0^1;
u16 zhuansu=0;
u16 jishu = 0;
u8 flag = 0;
sbit k1=P2^0;
sbit k2=P2^1;
sbit k3=P2^2;
sbit k4=P2^3;
sbit S1=P2^4;
sbit S2=P2^5;
sbit S3=P2^6;
sbit S4=P2^7;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char Display_data[4];
void delay(u16 i)
{
while(i--);
}
void InitSyetem()
{
IT1 = 1;
EX1 = 1;
TMOD=0x11;
TH0=(65536-10)/256;
TL0=(65536-10)%256;
ET0=1;
TR0=1;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
ET1=1;
TR1=1;
PX1=1;
PT1=1;
EA=1;
}
void Service_Int1() interrupt 2
{
jishu++;
if(jishu == 100)
{
led^=led;
}
}
void Service_Timer0() interrupt 1
{
TR0=0;
TH0=(65536-10)/256;
TL0=(65536-10)%256;
TR0=1;
time++;
if(time>=100) time= 0;
if(time<=count)
{
PWM = 1;
}
else
PWM = 0;
}
void Service_Timer1() interrupt 3
{
TR1=0;
TH1=(65536 - 10000) / 256;
TL1=(65536 - 10000) % 256;
TR1=1;
flag++;
if(flag==100)
{
zhuansu = jishu;
jishu=0;
flag=0;
}
}
void Deal_data()
{
Display_data[3]=smgduan[zhuansu/1000];
Display_data[2]=smgduan[zhuansu/100%10];
Display_data[1]=smgduan[zhuansu/10%10];
Display_data[0]=smgduan[zhuansu%10];
}
void DigDisplay()
{
u8 i;
for(i=0;i<4;i++)
{
switch(i)
{
case 0 : S1 = 0; S2 = 1; S3 = 1; S4 = 1;break;
case 1 : S2 = 0; S1 = 1; S3 = 1; S4 = 1;break;
case 2 : S3 = 0; S1 = 1; S2 = 1; S4 = 1;break;
case 3 : S4 = 0; S1 = 1; S2 = 1; S3 = 1;break;
}
P1=Display_data[i];
delay(5);
P1=0x00;
}
}
void keypros()
{
if(k1==0)
{
delay(100);
if(k1==0)
{
led=~led;
count+=10;
if(count >= 90)
count+=90;
}
while(!k1);
}
if(k2==0)
{
delay(100);
if(k2==0)
{
led=~led;
count-=10;
if(count <= 10)
{
count = 10;
}
}
while(!k2);
}
}
void main()
{
led = 0;
P1 = 0x00;
InitSyetem();
while(1)
{
keypros();
Deal_data();
DigDisplay();
}
}
|