仿真图:
芯片/模块的特点:
L298特点:
高驱动能力:L298具有高驱动电流能力,能够提供最高4安培的峰值输出电流。这使得它可以驱动较大功率的直流电机,适用于许多高性能应用。
双全桥结构:L298具有双全桥结构,即两个独立的H桥电路,可以分别控制两个直流电机的运行方向和速度。这种结构使得同时控制多个电机变得更加方便。
输入控制灵活:L298的输入控制接口可以使用标准的逻辑电平(TTL或CMOS)来控制电机的运行。它可以接受脉冲宽度调制(PWM)信号来实现速度控制,并且支持正向、反向和制动模式的控制。
内置保护功能:L298具有内置的过流保护和过温保护功能,可以保护芯片和外部电路免受损坏。当输出电流超过设定值或芯片温度过高时,保护功能会自动触发。
低功耗待机模式:L298具有低功耗待机模式,可以通过控制输入信号将芯片置于低功耗状态。这有助于节省电能和延长电池寿命。
多种封装形式:L298可提供不同的封装形式,如多引脚直插式封装(DIP)和表面贴装技术(SMT)封装。这使得L298适应不同应用的安装需求。
PCF8591特点:
多功能性:PCF8591芯片包含了4个独立的模拟输入通道和一个模拟输出通道。这意味着它可以同时读取多个模拟信号并输出一个模拟信号。
高精度:芯片的ADC和DAC都是8位的,所以它可以提供较高的信号分辨率和精确度。
可编程增益:PCF8591芯片允许用户通过软件配置增益,以适应不同的信号幅度。
低功耗:该芯片的功耗相对较低,适合在功耗要求较低的应用中使用。
I2C接口:PCF8591芯片通过I2C(Inter-Integrated Circuit)总线与微控制器或其他设备进行通信。这种接口设计简单,方便与其他设备进行连接。
主程序:
//题目:智能电动百叶窗
//要求:两种模式
//模式一:自动模式:通过光敏电阻检测进光量,使电机正反转 ,同时使LED亮
//模式二:手动模式,两个按键分别控制电机正反转
//两个限位开关限制电机转动,中断0切换控制模式
//收获:在使用if。。。 else 时如果多个选择模式应使用if else 而不是if if else 这时后面的else仅仅与
//前一个if配对,第一个if就失去了意义
//2,数据处理还是要注意,不要混淆
//3,不同模式时要先相互独立分析再分析其共性。
#include<reg52.h>
#include<intrins.h>
#include"I2C.h"
unsigned char GetADCValue(unsigned char chn);//PCF8591读取光敏电阻电压值
unsigned char M[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示当前值0-83
void System_Init(); //外部中断初始化
bit flag=0;//模式选择
sbit LED=P1^7;
sbit IN1=P1^3; //电机
sbit IN2=P1^4;
sbit K2=P3^3; //按键控制正反转
sbit K3=P3^4;
sbit xianwei1=P3^6; //限位开关
sbit xianwei2=P3^7;
void main()
{
unsigned char val;
System_Init();
while(1)
{
val=(char)(GetADCValue(0)/3);
P0=M[val/10];
P2=M[val%10];
if(flag==0)
{
xianwei1=1;
xianwei2=1;
LED=1;
_nop_();
if((val<30)&&(xianwei1==1)) //0-30
{IN1=1;IN2=0;} //正传
else if((val>50)&&(xianwei2==1)) //50-80
{IN1=0;IN2=1;} //反转
else
{IN1=1;IN2=1;}//30-50
}
if(flag==1)
{
K3=1;
K2=1;
xianwei1=1;
xianwei2=1;
LED=0;
if((K2==0)&&(xianwei1==1))
{IN1=1;IN2=0;while(!K2);}
if((K3==0)&&(xianwei2==1))
{IN1=0;IN2=1;while(!K3);}
else
{IN1=1;IN2=1;}
}
}
}
void System_Init()
{
EA=1;
IT0=1;
EX0=1;
}
unsigned char GetADCValue(unsigned char chn)
{
unsigned char val;
I2CStart();
if(!I2CWrite(0x48<<1))
{
I2CStop();
return 0;
}
I2CWrite(0x40 | chn);
I2CStart();
I2CWrite(0x48<<1 | 0x01);
I2CReadACK();
val = I2CReadNAK();
I2CStop();
return val;
}
void Int0() interrupt 0
{
flag=~flag; //模式变换
}
设计文件: