标题: 基于温度控制电机转速 [打印本页]
作者: 66kk 时间: 2018-6-24 02:19
标题: 基于温度控制电机转速
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P3^0;
sbit IN1=P1^0; //P10与电机驱动IN1相连
sbit IN2=P1^1; //P11与电机驱动IN2相连
sbit ENA=P1^2;
sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
sbit lcden=P2^2;
uint temp,num,t;
uchar flag,count,fu;
uchar code table[]="Current Temp :";
//延时
void delay(uint ms)
{
uint i,j;
for(i=ms;i>0;i--)
for(j=1;j>0;j--);
}
/*LCD 显示 */
void write_com(uchar com)
{
lcdrs=0;
lcdrw=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
lcdrw=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
lcdrs=0;
}
//初始化
void init()
{
TMOD=0x11;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
EA=1;
ET0=1;
TR0=1;
ET1=1;
TR1=1;
flag=0;
ENA=0;
}
/*温度模块 */
void dsreset(void)
{
uint i;
DS=1;
i++;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
DS=1;
}
//读一位
bit tmpreadbit(void)
{
uint i;
bit dat;
DS=1;
DS=0;
i++;
i++;
DS=1;
i++;
dat=DS;
i=8;
while(i>0)i--;
return (dat);
}
//读一个字节
uchar tmpread(void)
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
//将命令代码转换成控制信号
void tmpwritebyte(uchar dat)
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;
i++;
DS=1;
i=8;
while(i>0)i--;
}
else
{
DS=0;
i=8;
while(i>0)i--;//write 0
DS=1;
i++;
i++;
}
}
}
//启动温度转换
void tmpchange(void)
{
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0x44);
}
uint tmp()
{
float tt;
uchar a,b,b1;
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
b1=b;
temp<<=8;
temp=temp|a;
if(b1<8)
{
flag+=1;
tt=temp*0.0625;
temp=tt*10+0.5;
fu='+';
}
else
{
flag-=1;
temp=~temp;
temp=temp+1;
tt=temp*0.0625;
temp=tt*10+0.5;
fu='-';
}
return temp;
}
void display(uint temp)
{
uchar A1,A2,A3;
A1=temp/100;
A2=temp%100/10;
A3=temp%10;
write_com(0x80+0x06+0x40);
write_data(fu);
write_data(A1+0x30);
write_data(A2+0x30);
write_data('.');
write_data(A3+0x30);
}
/*电机模块 */
//电机停止
void Turn_t(void)
{
ENA=0;
IN1=0;
IN2=0;
}
//电机顺时针旋转
void Turn_z(void)
{
ENA=1;
IN1=1;
IN2=0;
}
//电机逆时针旋转
void Turn_f(void)
{
ENA=1;
IN1=0;
IN2=1;
}
//电机逆时针加速
void Turn_fj(void)
{
uint x;
ENA=1;
IN1=0;
x=500;
while(x<=1000)
{
IN2=1;
delay(x);
IN2=0;
delay(1000-x);
x+=50;
}
IN2=1;
}
//电机顺时针加速
void Turn_zj(void)
{
uint x;
ENA=1;
IN2=0;
x=500;
while(x<=1000)
{
IN1=1;
delay(x);
IN1=0;
delay(1000-x);
x+=50;
}
IN1=1;
}
void main()
{
init();
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
for(num=0;num<15;num++)
{
write_data(table[num]);
delay(5);
}
while(1)
{
tmpchange();
t = tmp();
display(t);
if(flag==1)
{
flag=0;
if(t>30) Turn_z();
else if(t>20) Turn_zj();
else if(t<10) Turn_f();
else if(t<20) Turn_fj();
}
else if(flag==-1)
{
flag=0;
Turn_f();
}
}
}
作者: qweasdzxcvb 时间: 2020-3-8 18:02
请问有仿真的图吗?
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |