要求:(1)直流电机能正转、反转控制;
(2)可进行转速控制(至少10档);
(3)对转速测量和显示;并能进行转速的设定;
(4)每2人一组,自由选择搭档;
本人学生,自己初学习51单片机,上网求助,如能解决,不胜感谢
写了如下代码,可以正反转,可以调速,不知怎么测速,而且调
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay (uchar);
sbit pwm1=P2^0; //通道1 反转控制
sbit pwm2=P2^1; //通道2 正转控制
sbit jia_key=P3^6; //加速s4
sbit jian_key=P3^7; //减速s5
sbit trun_key=P3^5; //转向s3
sbit dula=P2^6;
sbit wela=P2^7;
uchar num=50,flag=1,time=0,temp=0;
/*uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void dispaly()
{
dula=0;
P0=table[show_num];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=table[0];
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
P0=table[0];
dula=1;
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(5);
P0=table[0];
dula=1;
dula=0;
P0=0xf7;
wela=1;
wela=0;
delay(5);
} */
void biansu()
{
if(jia_key==0)
{
delay(2);
if(jia_key==0)
{
num+=10;
if(num>=100)
{
num=100;
}
}
while(!jia_key); //松开,就跳出
}
if(jian_key==0)
{
delay(2);
if(jian_key==0)
{
num-=10;
if(num<=0)
{
num=0;
}
}
while(!jian_key); //松开,就跳出
}
}
void zhuangxiang ()
{
if(trun_key==0)
{
delay(2);
if(trun_key==0)
{
flag=~flag;
// temp=~temp;
}
while(!trun_key); //松开按键,条件满足,跳出
}
}
void main()
{
TMOD=0x01;
TH0=(65536-10)/256;
TL0=(65536-10)%256; //10微秒中断一次
EA=1; //打开总中断
ET0=1; //打开定时器 0
TR0=1; //启动定时器0
while(1) //等待中断发生
{
zhuangxiang ();
biansu();
}
}
void delay(uchar m) //延时m毫秒
{
uint i,j;
for(i=m;i>0;i--)
for(j=110;j>0;j--);
}
void T0_time()interrupt 1 //10微秒中断一次
{
TR0=0; //关闭定时器0
TH0=(65536-10)/256;
TL0=(65536-10)%256;
TR0=1; //打开定时器0
if(flag==1) //电机正转
{
pwm1=0;
// pwm2=1;
time++;
if(time>=100)
time=0;
if(time<num)
pwm2=1;
else
pwm2=0;
}
// else
if(flag==0xfe) //电机反转
{
pwm2=0;
// pwm1=1;
time++;
if(time>=100)
time=0;
if(time<num)
pwm1=1;
else
pwm1=0;
}
}
|