用单片机控制总装车间中的LED照明系统,使其输出恒定照度的光,以满足总装生产工序中的照明需要。
总体设计方案
由设计要求可知,需使用MCS-51系列单片机,构建控制系统,实现LED灯亮度的控制。所以采用AT89C52 单片机为核心,以3*3按键键盘作为输入端,以达到控制所需输出电流的功能,并且由LCD1602显示模块可以显示输入电流的大小和电流源输出的电流大小。在设计中,采用PCF8591芯片进行AD/DA转换,单片机通过I2C通信协议控制PCF8591 AD转换输出的电压所需电压,输入压控电压源,通过采样电阻的电压DA转换获得电流源输出的电流值,经过单片机计算最后显示实际输出电流。
该直流电机控制系统的设计,在总体上大致可分为以下6个部分组成:AT89C52单片机最小系统,3*3按键键盘,直流稳压源,1602显示模块,AD/DA转换模块,可控电流源模块。
???【资源下载】下载地址:点击下载(1633)?百度网盘
///工业生产中的产品数量自动计量系统创新设计
///功能:通过MUC-51芯片控制电流源输出电流,实现LED灯亮度控制
///*************************************************************************
#include<reg52.h>
#include<iic.h>
#include<lcd1602.h>
#define KEY_PRESET(code) { P1=code; temp=P1; temp=temp&code; delay(10);}
uchar str1[16]="310mA<=I<=3100mA";
uchar str2[16]="set: out: ";
uchar str3[16]=" Error occurred ";
uchar dianliu[4]={0,0,0,0};
uchar key_num,key_flag,key_count=0,OK_flag;
ulong pian,bai,shi,ge,set_value;
float key_value;
uchar h,l,temp;
ulong back_voltage1,back_current;
void get_Data();
void set_Data();
uchar keyscan();
bit DACconversion(uchar sla,uchar c,uchar Val);
bit ISendByte(uchar sla,uchar c);
uchar IRcvByte(uchar sla);
void delay1(uint j);
///*************************************************************************
///主函数
///*************************************************************************
void main()
{
INIT_I2c();//iic总线初始化
LCD_Init();//LCD1602初始化
while(1)
{
get_Data();
set_Data();
}
}
//*******************************************************************
//DAC 变换, 转化函数
//*******************************************************************
bit DACconversion(uchar sla,uchar c, uchar Val)
{
Start_I2c(); //启动总线
SendByte(sla); //发送器件地址
if(ack==0)return(0);
SendByte(c); //发送控制字节
if(ack==0)return(0);
SendByte(Val); //发送DAC的数值
if(ack==0)return(0);
Stop_I2c(); //结束总线
return(1);
}
//*******************************************************************
//ADC发送字节[命令]数据函数
//*******************************************************************
bit ISendByte(uchar sla,uchar c)
{
Start_I2c(); //启动总线
SendByte(sla); //发送器件地址
if(ack==0)return(0);
SendByte(c); //发送数据
if(ack==0)return(0);
Stop_I2c(); //结束总线
return(1);
}
//*******************************************************************
//ADC读字节数据函数
//*******************************************************************
uchar IRcvByte(uchar sla)
{
uchar c;
Start_I2c(); //启动总线
SendByte(sla+1); //发送器件地址
if(ack==0)return(0);
c=RcvByte(); //读取数据0
Ack_I2c(1); //发送非就答位
Stop_I2c(); //结束总线
return(c);
}
///*************************************************************************
///按键扫描函数
///*************************************************************************
uchar keyscan()
{
KEY_PRESET(0X0F);
if(temp!=0X0F)//是否有键按下
{
delay(10);
temp=P1;
temp=temp&0X0F;
if(temp!=0X0F) //确实有键按下
{
key_flag=1;//按下键标志位
switch(temp)
{
case 0X0E:h=0;break; //行
case 0X0D:h=1;break;
case 0X0B:h=2;break;
case 0X07:h=3;break;
default:break;
}
KEY_PRESET(0XF0);
switch(temp)
{
case 0XE0:l=0;break; //列
case 0XD0:l=1;break;
case 0XB0:l=2;break;
case 0X70:l=3;break;
default:break;
}
key_num=3*h+l;//按下键的键值
if(key_num<=9) key_count++;
while(temp!=0XF0)//等待释放
{
temp=P1;
temp=temp&0XF0;
}
}
}
return key_num;//返回键值
}
void get_Data()
{
uchar i;
keyscan(); //键盘扫描
|