基于51单片机轮胎胎压监测系统
(仿真+程序+设计报告)
功能介绍
具体功能:
1.MPX4115压力传感器胎压检测;
2.ADC0832进行模数转换后,51单片机处理控制;
3.数码管显示胎压;
4.胎压过高蜂鸣器报警;
演示视频:
基于51单片机气压监测系统—数码管显示
//ÏßÐÔÇø¼ä±ê¶È±ä»»¹«Ê½£º y=(115-15)/(243-13)*X+15kpa
#include <AT89X52.h>
#include <intrins.h>
#include <stdio.h>
#define R24C04ADD 0xA1
#define W24C04ADD 0xA0
//ADC0832µÄÒý½Å
sbit ADCS =P2^2; //ADC0832 chip seclect
sbit ADDI =P2^4; //ADC0832 k in
sbit ADDO =P2^4; //ADC0832 k out
sbit ADCLK =P2^3; //ADC0832 clock signal
sbit SDA = P2 ^ 1; //Êý¾ÝÏß
sbit SCL = P2 ^ 0; //ʱÖÓÏß
bit bAck; //Ó¦´ð±êÖ¾ µ±bbAck=1ÊÇΪÕýÈ·µÄÓ¦´ð
unsigned char dispbitcode[8]={0xf7,0xfb,0xfd,0xfe,0xef,0xdf,0xbf,0x7f}; //λɨÃè
unsigned char dispcode[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff}; //¹²ÑôÊýÂë¹Ü×Ö¶ÎÂë
unsigned char dispbuf[4];
unsigned int temp;
unsigned char getdata; //»ñÈ¡ADCת»»»ØÀ´µÄÖµ
void delay_1ms(void) //12mhz delay 1.01ms
{
unsigned char x,y;
x=3;
while(x--)
{
y=40;
while(y--);
}
}
void display(void) //ÊýÂë¹ÜÏÔʾº¯Êý
{
char k;
for(k=0;k<4;k++)
{
P1 = dispbitcode[k];
P0 = dispcode[dispbuf[k]];
if(k==1) //¼ÓÉÏÊýÂë¹ÜµÄdpСÊýµã
P0&=0x7f;
delay_1ms();
}
}
/************
¶ÁADC0832º¯Êý
************/
//²É¼¯²¢·µ»Ø
unsigned int Adc0832(unsigned char channel) //ADת»»£¬·µ»Ø½á¹û
{
unsigned char i=0;
unsigned char j;
unsigned int dat=0;
unsigned char ndat=0;
if(channel==0)channel=2;
if(channel==1)channel=3;
ADDI=1;
_nop_();
_nop_();
ADCS=0;//ÀµÍCS¶Ë
_nop_();
_nop_();
ADCLK=1;//À¸ßCLK¶Ë
_nop_();
_nop_();
ADCLK=0;//ÀµÍCLK¶Ë,ÐγÉϽµÑØ1
_nop_();
_nop_();
ADCLK=1;//À¸ßCLK¶Ë
ADDI=channel&0x1;
_nop_();
_nop_();
ADCLK=0;//ÀµÍCLK¶Ë,ÐγÉϽµÑØ2
_nop_();
_nop_();
ADCLK=1;//À¸ßCLK¶Ë
ADDI=(channel>>1)&0x1;
_nop_();
_nop_();
ADCLK=0;//ÀµÍCLK¶Ë,ÐγÉϽµÑØ3
ADDI=1;//¿ØÖÆÃüÁî½áÊø
_nop_();
_nop_();
dat=0;
for(i=0;i<8;i++)
{
dat|=ADDO;//ÊÕÊý¾Ý
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//ÐγÉÒ»´ÎʱÖÓÂö³å
_nop_();
_nop_();
dat<<=1;
if(i==7)dat|=ADDO;
}
for(i=0;i<8;i++)
{
j=0;
j=j|ADDO;//ÊÕÊý¾Ý
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//ÐγÉÒ»´ÎʱÖÓÂö³å
_nop_();
_nop_();
j=j<<7;
ndat=ndat|j;
if(i<7)ndat>>=1;
}
ADCS=1;//ÀµÍCS¶Ë
ADCLK=0;//ÀµÍCLK¶Ë
ADDO=1;//À¸ßÊý¾Ý¶Ë,»Øµ½³õʼ״̬
dat<<=8;
dat|=ndat;
return(dat); //return ad k
}
//Æô¶¯I2C×ÜÏߣ¬¼´·¢ËÍÆðʼÌõ¼þ
void StartI2C()
{
SDA = 1; //·¢ËÍÆðʼÌõ¼þÊý¾ÝÐźÅ
_nop_();
SCL = 1;
_nop_(); //Æðʼ½¨Á¢Ê±¼ä´óÓÚ4.7us
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 0; //·¢ËÍÆðʼÐźÅ
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0; //ʱÖÓ²Ù×÷
_nop_();
_nop_();
}
//½áÊøI2C×ÜÏߣ¬¼´·¢ËÍI2C½áÊøÌõ¼þ
void StopI2C()
{
SDA = 0; //·¢ËͽáÊøÌõ¼þµÄÊý¾ÝÐźÅ
_nop_(); //·¢ËͽáÊøÌõ¼þµÄʱÖÓÐźÅ
SCL = 1; //½áÊøÌõ¼þ½¨Á¢Ê±¼ä´óÓÚ4us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 1; //·¢ËÍI2C×ÜÏß½áÊøÃüÁî
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
//·¢ËÍÒ»¸ö×Ö½ÚµÄÊý¾Ý
void SendByte(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt = 0;BitCnt < 8;BitCnt++) //Ò»¸ö×Ö½Ú
{
if((c << BitCnt)& 0x80) SDA = 1; //ÅжϷ¢ËÍλ
else SDA = 0;
_nop_();
SCL = 1; //ʱÖÓÏßΪ¸ß£¬Í¨Öª´Ó»ú¿ªÊ¼½ÓÊÕÊý¾Ý
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0;
}
_nop_();
_nop_();
SDA = 1; //ÊÍ·ÅÊý¾ÝÏߣ¬×¼±¸½ÓÊÜÓ¦´ðλ
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
if(SDA == 1) bAck =0;
else bAck = 1; //ÅжÏÊÇ·ñÊÕµ½Ó¦´ðÐźÅ
SCL = 0;
_nop_();
_nop_();
}
//½ÓÊÕÒ»¸ö×Ö½ÚµÄÊý¾Ý
unsigned char RevByte()
{
unsigned char retc;
unsigned char BitCnt;
retc = 0;
SDA = 1;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_nop_();
SCL = 0; //ÖÃʱÖÓÏßΪµÍ£¬×¼±¸½ÓÊÕ
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 1; //ÖÃʱÖÓÏßΪ¸ßʹµÃÊý¾ÝÓÐЧ
_nop_();
_nop_();
retc = retc << 1; //×óÒƲ¹Áã
if (SDA == 1)
retc = retc + 1; //µ±Êý¾ÝΪ1ÔòÊÕµ½µÄÊý¾Ý+1
_nop_();
_nop_();
}
SCL = 0;
_nop_();
_nop_();
return(retc); //·µ»ØÊÕµ½µÄÊý¾Ý
}
unsigned char WIICByte(unsigned char WChipAdd,unsigned char InterAdd,unsigned char WIICData)
{
StartI2C(); //Æô¶¯×ÜÏß
SendByte(WChipAdd); //·¢ËÍÆ÷¼þµØÖ·ÒÔ¼°ÃüÁî
if (bAck==1) //ÊÕµ½Ó¦´ð
{
SendByte(InterAdd); //·¢ËÍÄÚ²¿×ÓµØÖ·
if (bAck ==1)
{
SendByte(WIICData); //·¢ËÍÊý¾Ý
if(bAck == 1)
{
StopI2C(); //Í£Ö¹×ÜÏß
return(0xff);
}
else
{
return(0x03);
}
}
else
{
return(0x02);
}
}
return(0x01);
}
//¶ÁÈ¡Ö¸¶¨Æ÷¼þµÄÄÚ²¿Ö¸¶¨µØÖ·Ò»¸ö×Ö½ÚÊý¾Ý
unsigned char RIICByte(unsigned char WChipAdd,unsigned char RChipAdd,unsigned char InterDataAdd)
{
unsigned char TempData;
TempData = 0;
StartI2C(); //Æô¶¯
SendByte(WChipAdd); //·¢ËÍÆ÷¼þµØÖ·ÒÔ¼°¶ÁÃüÁî
if (bAck==1) //ÊÕµ½Ó¦´ð
{
SendByte(InterDataAdd); //·¢ËÍÄÚ²¿×ÓµØÖ·
if (bAck ==1)
{
StartI2C();
SendByte(RChipAdd);
if(bAck == 1)
{
TempData = RevByte(); //½ÓÊÕÊý¾Ý
StopI2C(); //Í£Ö¹I2C×ÜÏß
return(TempData); //·µ»ØÊý¾Ý
}
else
{
return(0x03);
}
}
else
{
return(0x02);
}
}
else
{
return(0x01);
}
}
硬件设计
使用元器件:
单片机:AC89C52;
(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)
设计资料
01 仿真图
本设计使用proteus7.8和proteus8.9两个版本设计,向下兼容,无需担心!具体如图!
02 程序
本设计使用软件keil4和keil5两个版本编程设计,无需担心!具体如图
03 设计报告
一千字设计报告,具体如下!
04 设计资料
资料获取请关注同名公众号,全部资料包括仿真源文件 、程序(含注释)、设计报告、仿真视频等。具体内容如下,全网最全! !
资料获取请观看前面演示视频!
点赞分享一起学习成长。