急!马达驱动程序,求好心人帮助
时间:10-02
整理:3721RD
点击:
STC89C52
给PCF8591连接一个电阻应变式压力传感器, 当压力为数值1时, 先让马达正转2秒 紧接着停转, 此时使继电器接通;
压力持续变大 ,此过程中,马达不转,继电器保持接通状态;
当压力变为数值2时, 先让继电器断开, 紧接着让马达反转2秒后停止;
当压力数值变为3时, 接通蜂鸣器;
压力为其它值时无操作。
以下程序使马达乱转
#include<reg52.h>
#include<intrins.h>
sbit mdsc1=P2^0;
sbit mdsc2=P2^1; //马达驱动电路的两个输入口
sbit fmq=P3^6; //蜂鸣器的输出口
sbit jdq=P3^7; //继电器的输出口
#define uint unsigned int
#define uchar unsigned char
#define PCF8591 0x90
#define NOP {_nop_();_nop_();_nop_();_nop_();_nop_();}
bit write=0;
sbit scl=P3^4;
sbit sda=P3^5; //PCF8591的时钟与数据口
void start_IIC()
{
sda=1;scl=1;
NOP;
sda=0;
NOP;
scl=0;
}
void stop_IIC()
{
sda=0;scl=1;
NOP;
sda=1;
NOP;
scl=0;
}
void IIC_respons()
{
uchar x;
scl=1;
NOP;
while((sda==1)&&(x<250))
x++;
scl=0;
NOP;
}
void IIC_init() //初始化
{
sda=1;
NOP;
scl=1;
NOP;
}
uchar IIC_read_byte()
{
uchar x,y;
scl=0;
NOP;
sda=1;
NOP;
for(x=0;x<8;x++)
{
scl=1;
NOP;
y=(y<<1)|sda; //先左移一位,再在最低位接受当前位
scl=0;
NOP;
}
return y;
}
void IIC_write_byte(uchar date) //写一字节数据
{
uchar x,temp;
temp=date;
for(x=0;x<8;x++)
{
temp=temp<<1; //左移一位 移出的一位在进位标志位CY中
scl=0; //只有在scl=0时sda才能变化
NOP;
sda=CY;
NOP;
scl=1;
NOP;
}
scl=0;
NOP;
sda=1;
NOP;
}
void IIC_write_aad(uchar control,uchar date)
{
start_IIC();
IIC_write_byte(PCF8591);
IIC_respons();
IIC_write_byte(date);
IIC_respons();
stop_IIC();
}
uchar IIC_read_add(uchar control)
{
uchar date;
start_IIC();
IIC_write_byte(PCF8591);
IIC_respons();
IIC_write_byte(control);
IIC_respons();
start_IIC();
IIC_write_byte(PCF8591+1);
IIC_respons();
date=IIC_read_byte();
stop_IIC();
return date;
}
void delay(uint i) //约40ms的延时函数
{
uint j;
for(;i>0;i--)
for(j=0;j<5000;j++)
{;}
}
void main(int u)
{
u=IIC_read_add();
if(u<=50)
{
mdsc1=0;mdsc2=1;
delay(50);
jdq=0;
mdsc1=0;mdsc2=0;
}
else if(u<160&&u>60)
{
jdq=0;
mdsc1=1;mdsc2=1;
}
else if(u==160)
{
jdq=1;
mdsc1=1;mdsc2=0;
delay(50);
mdsc1=0;mdsc2=0;
}
else
{
jdq=1;
fmq=0;
}
}
给PCF8591连接一个电阻应变式压力传感器, 当压力为数值1时, 先让马达正转2秒 紧接着停转, 此时使继电器接通;
压力持续变大 ,此过程中,马达不转,继电器保持接通状态;
当压力变为数值2时, 先让继电器断开, 紧接着让马达反转2秒后停止;
当压力数值变为3时, 接通蜂鸣器;
压力为其它值时无操作。
以下程序使马达乱转
#include<reg52.h>
#include<intrins.h>
sbit mdsc1=P2^0;
sbit mdsc2=P2^1; //马达驱动电路的两个输入口
sbit fmq=P3^6; //蜂鸣器的输出口
sbit jdq=P3^7; //继电器的输出口
#define uint unsigned int
#define uchar unsigned char
#define PCF8591 0x90
#define NOP {_nop_();_nop_();_nop_();_nop_();_nop_();}
bit write=0;
sbit scl=P3^4;
sbit sda=P3^5; //PCF8591的时钟与数据口
void start_IIC()
{
sda=1;scl=1;
NOP;
sda=0;
NOP;
scl=0;
}
void stop_IIC()
{
sda=0;scl=1;
NOP;
sda=1;
NOP;
scl=0;
}
void IIC_respons()
{
uchar x;
scl=1;
NOP;
while((sda==1)&&(x<250))
x++;
scl=0;
NOP;
}
void IIC_init() //初始化
{
sda=1;
NOP;
scl=1;
NOP;
}
uchar IIC_read_byte()
{
uchar x,y;
scl=0;
NOP;
sda=1;
NOP;
for(x=0;x<8;x++)
{
scl=1;
NOP;
y=(y<<1)|sda; //先左移一位,再在最低位接受当前位
scl=0;
NOP;
}
return y;
}
void IIC_write_byte(uchar date) //写一字节数据
{
uchar x,temp;
temp=date;
for(x=0;x<8;x++)
{
temp=temp<<1; //左移一位 移出的一位在进位标志位CY中
scl=0; //只有在scl=0时sda才能变化
NOP;
sda=CY;
NOP;
scl=1;
NOP;
}
scl=0;
NOP;
sda=1;
NOP;
}
void IIC_write_aad(uchar control,uchar date)
{
start_IIC();
IIC_write_byte(PCF8591);
IIC_respons();
IIC_write_byte(date);
IIC_respons();
stop_IIC();
}
uchar IIC_read_add(uchar control)
{
uchar date;
start_IIC();
IIC_write_byte(PCF8591);
IIC_respons();
IIC_write_byte(control);
IIC_respons();
start_IIC();
IIC_write_byte(PCF8591+1);
IIC_respons();
date=IIC_read_byte();
stop_IIC();
return date;
}
void delay(uint i) //约40ms的延时函数
{
uint j;
for(;i>0;i--)
for(j=0;j<5000;j++)
{;}
}
void main(int u)
{
u=IIC_read_add();
if(u<=50)
{
mdsc1=0;mdsc2=1;
delay(50);
jdq=0;
mdsc1=0;mdsc2=0;
}
else if(u<160&&u>60)
{
jdq=0;
mdsc1=1;mdsc2=1;
}
else if(u==160)
{
jdq=1;
mdsc1=1;mdsc2=0;
delay(50);
mdsc1=0;mdsc2=0;
}
else
{
jdq=1;
fmq=0;
}
}