找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1887|回复: 1
打印 上一主题 下一主题
收起左侧

基于温度控制电机转速

[复制链接]
跳转到指定楼层
楼主
ID:357563 发表于 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();
                }
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:696844 发表于 2020-3-8 18:02 | 只看该作者
请问有仿真的图吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表