当前位置: 代码迷 >> 单片机 >> 课程设计遇到了困难,求的帮助![
  详细解决方案

课程设计遇到了困难,求的帮助![

热度:170   发布时间:2016-04-28 16:32:51.0
课程设计遇到了困难,急求各位高手的帮助!!![
1,读取3个电流值
2,通过ADC0809,74HC573,转换成数字信号
3,89s52判断,3个电流值是否一致,或者相差不超过0.5A,如果是,给出正常的信号,如果不是,则给出问题信号,停止电机转动。
电机是三相异步电机,即一般用的三相马达。
我写的程序如下:
#include <reg52.h>
#include <intrins.h>
#include<absacc.h>

#define uchar unsigned char
#define uint unsigned int

uchar code ErrorFirst[]="Not Balance!";
uchar code NoError[]="Everything OK!";

void Initialize();//总初始化
void Initialize_LCD();//LCD 初始化
uchar Busy_Check();//LCD忙检查
void LCD_Write_Command(uchar value);//LCD写命令
void Delay(uchar times);//延迟函数
void ShowString(uchar x,uchar y,uchar *str);//LCD显示数据串

sbit LCD_RS = P1^0;
sbit LCD_EN = P3^0;
sbit LCD_RW = P3^1;
sbit HC573_LE = P1^1;

sbit ADC_EOC = P3^3;
sbit ADC_CLK = P3^4;
sbit ADC_ST = P3^5;
sbit ADC_OE = P3^6;

uchar Electric_Current;

void Initialize()//程序初始化
{
TMOD = 0x02;//开定时timer0中断
TH0 = 0x14;
TL0 = 0x00;
IE = 0x82;
TR0 = 1;
Initialize_LCD();

}

void Delay(uchar times)//延时
{
uint a;
while(times--)
for(a=120;a>0;a--);

}

void Initialize_LCD()//LCD初始化
{
  LCD_Write_Command(0x38);
Delay(1);
LCD_Write_Command(0x01);
Delay(1);
LCD_Write_Command(0x06);
Delay(1);
LCD_Write_Command(0x0c);
Delay(1);
}

uchar Busy_Check()//LCD忙碌检查
{
  uchar LCD_Status;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
Delay(1);
  LCD_Status = P0;
LCD_EN= 0;
return LCD_Status;
}

void LCD_Write_Command(uchar value)//LCD写命令
{
while((Busy_Check()&0x80)==0x80);
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
P0 = value;
LCD_EN = 1;
Delay(1);
LCD_EN = 0;
}

void LCD_Write_Data(uchar datas)//LCD写数据
{
while((Busy_Check()&0x80)==0x80);
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = datas;
LCD_EN = 1;
Delay(1);
LCD_EN = 0;
}
void ShowString(uchar x,uchar y,uchar *str)//LCD显示数据串
{
  uchar i = 0;
if(y == 0)
LCD_Write_Command(0x80 | x);
if(y == 1)
LCD_Write_Command(0xc0 | x);
for(i=0;i<16;i++)
{
LCD_Write_Data(str[i]);
}
}

uchar ADC0809_Get(uchar PORT) //获取ADC转换的电流值
{
uchar temp;
HC573_LE = 1;
P2 = PORT;
HC573_LE = 0;
ADC_ST = 0;
ADC_ST = 1;
ADC_ST = 0;
while(ADC_EOC == 0);
ADC_OE = 1;
temp=P2;
ADC_OE = 0;
return(temp);
}

bit Electric_Current_Get()//错误可能在这里,不知道获取的数据是什么,判断出现什么错误
{
uchar IONE,ITWO,ITHREE; 
bit Flag=0;
IONE=ADC0809_Get(0x00); //获取第一个电流0x00为ADC0809模拟信号输入端口选择
ITWO=ADC0809_Get(0x01); //获取第二个电流0x01为ADC0809模拟信号输入端口选择
ITHREE=ADC0809_Get(0x02); //获取第三个电流0x02为ADC0809模拟信号输入端口选择
if(IONE>ITWO) //获取的第一第二个电流,如果第一个电流大于大二个电流
{
if((IONE-ITWO)>0.5) //获取的第一第二个电流,如果第一个电流大于大二个电流大于0.5A
Flag=1; //设置错误位标志为1
}
else
{
if((ITWO-IONE)>0.5)
Flag=1;
}

if(IONE>ITHREE) //获取的第一第三个电流,如果第二个电流大于大三个电流
{
if((IONE-ITHREE)>0.5) //获取的第一第三个电流,如果第一个电流大于大三个电流大于0.5A
Flag=1; //设置错误位标志为1
}
else
{
if((ITHREE-IONE)>0.5)
Flag=1;
}
Electric_Current=IONE/256*10; //计算电流的真正值

return Flag;
}

void Timer0_INT() interrupt 1//定时器,用来给ADC0809提供时钟频率
{
  ADC_CLK = !ADC_CLK;
}

//主函数
void main()
{
Initialize();
if(Electric_Current_Get()==1)
{
Delay(500);
Delay(500);
ShowString(0,0,ErrorFirst);//如果获取的电流不平衡,显示错误
}
else
ShowString(0,0,NoError);//平衡,显示正常


------解决方案--------------------
  相关解决方案