标题: 基于温度控制电机转速 [打印本页]

作者: 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