用的是AT89S52单片机,本来想改成MSP430单片机,无奈在测试MSX6675热电偶芯片的时候,SO端口到430老读不到数据,查不出原因,也只好放弃了。中间明白了一条道理:不要想法设法的尝试更新更好更低功耗的设计,成本和效率才是关键,对于汽车电子来说,430的低功耗毫无作用,还会带来3.3V到5V的电平转换等等一系列的问题,所以,51系列就够了。
原理图在上面,同时也把430设计版得原理图放上来
PCB版图和BOM(AT89S52):
然后是一些程序模块,没有编译到一起,以前是用汇编写的,难懂,难维护,现在改了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;
}
}
这是轮速传感器的仿真电路:
文章评论(0条评论)
登录后参与讨论