原创 总结-一款缓速器的控制电路

2011-5-9 12:08 1451 5 5 分类: 汽车电子

用的是AT89S52单片机,本来想改成MSP430单片机,无奈在测试MSX6675热电偶芯片的时候,SO端口到430老读不到数据,查不出原因,也只好放弃了。中间明白了一条道理:不要想法设法的尝试更新更好更低功耗的设计,成本和效率才是关键,对于汽车电子来说,430的低功耗毫无作用,还会带来3.3V到5V的电平转换等等一系列的问题,所以,51系列就够了。


原理图在上面,同时也把430设计版得原理图放上来


attachment download


attachment download


PCB版图和BOM(AT89S52):


attachment download


然后是一些程序模块,没有编译到一起,以前是用汇编写的,难懂,难维护,现在改了C


先是18B20测水温的程序:


///////////////////////////////////////////////////


//18B20端口DQ     :P27
///////////////////////////////////////////////////
#include <reg52.h>


sbit DQ = P2 ^ 7;  //定义18B20端口DQ
///////////////////////////////////////////////////
void Delay(unsigned int time)//延时函数
{
 while( time-- );
}
///////////////////////////////////////////////////


///////////////////////////////////////////////////


///////////////////////////////////////////////////
/////////////      18B20       ////////////////////
///////////////////////////////////////////////////
void Init_18B20(void)//初始化18B20
{
 unsigned char x = 0;


 DQ = 1;    //DQ复位
 Delay(10);  //稍做延时


 DQ = 0;    //单片机将DQ拉低
 Delay(80); //笥?480us


 DQ = 1;    //拉高总线
 Delay(10);


 x = DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
    Delay(20);
}


/*************************************************/
unsigned char ReadOneChar(void)//读一个字节
{
 unsigned char i = 0;
 unsigned char dat = 0;


 for (i = 8; i > 0; i--)
 {
    DQ = 0; // 给脉冲信号
    dat >>= 1;
    DQ = 1; // 给脉冲信号


    if(DQ)
     dat |= 0x80;
    Delay(15);
 }


 return (dat);
}


/*************************************************/
void WriteOneChar(unsigned char dat)//写一个字节
{
 unsigned char i = 0;
 for (i = 8; i > 0; i--)
 {
    DQ = 0;
    DQ = dat&0x01;
    Delay(5);


    DQ = 1;
    dat>>=1;
 }
}


///////////////////////////////////////////////////


void Read_Display(void)//读取并显示温度
{
 unsigned int a = 0, b = 0,  t = 0;
 float tt = 0;
  
 Init_18B20();
 WriteOneChar(0xCC); // 跳过读序号列号的操作
 WriteOneChar(0x44); // 启动温度转换


 Init_18B20();
 WriteOneChar(0xCC); //跳过读序号列号的操作
 WriteOneChar(0xBE); //读取温度寄存器


 a = ReadOneChar();
 b = ReadOneChar();


 t = b;
 t <<= 8;
 t = t | a;


 tt = t * 0.0625;
    t = tt * 10 + 0.5; //放大10倍输出并四舍五入     30度 对应300
 if(t>400)
  {
   P0=0X00;
   }
 else P0=0XED;
 
}


///////////////////////////////////////////////////
void main(void)
{
 while(1)
 {
    Read_Display();
  Delay(10000);
 }
}
///////////////////////////////////////////////////


然后是MAX6675测K型热电偶的程序:



#include <reg52.h>
#include "intrins.h"


#define uint unsigned int
#define uchar unsigned char
unsigned char i;
unsigned char temp;
unsigned char a,b;
uint gsw,dbw,flag;
sbit so=P1^0;
sbit cs=P1^1;
sbit sck=P1^2;
sbit buzz=P3^7;
void delay(uint m)
 {
  uint x,y;
  for(x=m;x>0;x--)
   for(y=110;y>0;y--);
  
 }
uint  max6675()
 { uchar i;
  
  gsw=dbw=0;
  flag=0;
  sck=0;
  _nop_();
  cs=0;
  _nop_();
  sck=1;
  _nop_();
  sck=0; /*输出第一位D15 */
  _nop_();
  sck=1;
  
  for(i=4;i>=1;i--)
   {
    sck=0;
    _nop_();
    gsw=gsw|so;
    gsw=gsw<<1;
    sck=1;
    _nop_();
   }
   for(i=8;i>=1;i--)
   {
    sck=0;
    _nop_();
    dbw=dbw|so;
    dbw=dbw<<1;
    sck=1;
    _nop_();
   }
  sck=0;
  _nop_();
  sck=1;
  _nop_();
  sck=0;
  _nop_();
  cs=1;
  _nop_();
  gsw=gsw<<8;
  return(gsw);
 }



void caiji()
 { 
 
  uint te;
  te=max6675();
  _nop_();
  te=te/4;  
  if(te>1000)   //500度
  { P0=0X33;}
  else P0=0X01;


  buzz=1;


 }



void delay04s(void)  //延时0.4s
{
 unsigned char m,n,s;
 for(m=40;m>0;m--)
 for(n=20;n>0;n--)
 for(s=248;s>0;s--);
}
void init(void)
{
 temp=0xfe;
 P0=temp;
 delay04s();
}



void main(void)

 init();    //初始化端口便于移位操作
 while(1) {
  _nop_();
  caiji();
 
 }
}


然后是轮速传感器程序,采用霍尔接近开关测磁钢:


#include <reg52.h>
sbit led1=P2^0;
sbit led2=P2^1;



unsigned char speed=0,limit=0; //初始化速度值和限速值
unsigned char SEG_TAB[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};//0-9数字
unsigned char T0count;
unsigned char timecount;
bit flag;
unsigned long x;
void delay(unsigned long time)
{
    while(time--);
}
void main(void)
{


  TMOD=0x15;
  TH0=0;
  TL0=0;
  TH1=(65536-20000)/256;
  TL1=(65536-20000)%256;
  TR1=1;
  TR0=1;
  ET0=1;
  ET1=1;
  EA=1;
  while(1)
   {
     if(flag==1)
       {
         flag=0;
         x=T0count*65536+TH0*256+TL0;
   x=(x*5);
         led1 = 1;//第一个数码管显示时的十位
   P0 = SEG_TAB[ x / 10 ]; 
  delay(60);
  led1 = 0;


  led2 = 1;//第2个数码管显示时的个位
  P0 = SEG_TAB[ x % 10 ];  //01111111 小数点一定显示。
  delay(60);
  led2 = 0;
         timecount=0;
         T0count=0;
         TH0=0;
         TL0=0;
         TR0=1;
       }
   }
}
void t0(void) interrupt 1 using 0
{
  T0count++;
}
void t1(void) interrupt 3 using 0
{
  TH1=(65536-20000)/256;
  TL1=(65536-20000)%256;
  timecount++;
  if(timecount==10)
    {
      TR0=0;
      timecount=0;
      flag=1;
    }


}


这是轮速传感器的仿真电路:


3e825fb2-f846-4a30-a7cb-87abb1390ae2.jpg

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /3 下一条