基于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 signalsbit 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¶Ë,ÐγÉϽµÑØ3ADDI=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 设计资料
资料获取请关注同名公众号,全部资料包括仿真源文件 、程序(含注释)、设计报告、仿真视频等。具体内容如下,全网最全! !
资料获取请观看前面演示视频!
点赞分享一起学习成长。