• 51单片机汽车胎压大气气压测量仪仿真设计_数码管显示(代码+仿真+设计报告+讲解)


    51单片机汽车胎压大气气压测量仪仿真设计_数码管显示

    (代码+仿真+设计报告+讲解)

    仿真原版本:proteus 7.8

    程序编译器:keil 4/keil 5

    编程语言:C语言

    设计编号:S0018

    功能描述

    本课程设计用MPX4115传感器来检测压力参数,ADC0832进行模数转换后,利用单片机AT89C52进行数据处理后,用四个八段数码管显示压力值。压力测量的量程在15.3KPA~114.9KPA,分度值位0.1kpa。

    讲解视频

    51单片机胎压气压监测

    仿真电路

    img

    总体设计方案

    本次设计是基于8051单片机的测量与显示。利用传感器将压力转换为电信号后,在经过ADC0832的模数转换器经A/D转换后由单片机进行有效处理,然后用数码管进行显示。

    image-20220904100623295

    单片机最小系统

    由AT89C52单片机、时钟电路、复位 电路组成AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。AT89C52是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的于将多功能MCS-518指令集和输出管脚相兼容。位CPU和闪烁存储器组合在由单个芯片中,ATMEL 的AT89C51是一种高效微控制器,AT89C52是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

    image-20220904100647679

    A/D转换模块

    ADC0832是美国国家半导体公司生产的一种8位分辨率、双通道A/D转换芯片。由于它体积小,兼容性,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。学习并使用 ADC0832 可是使我们了解A/D转换器的原理,有助于我们单片机技术水平的提高。8位分辨率双通道A/D转换输入输出电平与TTL/CMOS 相兼容5V电源供电时输入电压在0~5V之间工作频率为250KHZ,转换时间为32μS。 ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在 0~5V 之间。

    image-20220904100716107

    传感器模块

    MPX4115系列压电电阻传感器是一个硅压力传感器。这个传感器结合了高级微电机技术,薄膜镀金属。还能为高水准模拟输出信号提供一个均衡压力。在0℃-85℃的温度下误差不超过1.5%,温度补偿是-40℃-125℃。为了克服干扰,在MPX4115输出电路中增加了RC滤波电路。如下图所示:

    image-20220904100731511

    程序

    img

    读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);                                   //返回收到的数据
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174

    主函数

    void main(void) 
    { 
      unsigned int OverCounter = 0; 
      unsigned char ptemp;
      bit OverFlg = 0;
      unsigned int temp,ppress = 0;
      float  press;	
      while(1)
      {	  
       		  
    	  getdata=Adc0832(0);
    	  if(14 100)
          {
              if(OverFlg == 1)   
              {
                OverCounter++;
                WIICByte(W24C04ADD,0x01,(OverCounter/0xff));    //低位
                WIICByte(W24C04ADD,0x02,(OverCounter%0xff));    //高位
                OverFlg = 0;    //清除标志
              }
          }
    
    	   }	    
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    设计报告

    设计报告

    资料清单&&下载链接

    网盘下载链接

    1. 常见使用问题及解决方法–必读!!!!
    2. 源程序
    3. proteus仿真
    4. 开题报告
    5. 讲解视频
    6. 设计报告
      Altium Designer 安装破解
      KEIL+proteus 单片机仿真设计教程
      KEIL安装破解
      Proteus元器件查找
      Proteus安装
      Proteus简易使用教程
      单片机学习资料
      相关数据手册
      答辩技巧
      设计报告常用描述
      鼠标双击打开嘉盛单片机51 STM32单片机课程毕业设计.url
  • 相关阅读:
    kettle连接达梦资源库-达梦资源库初始化SQL
    子不语发生工商变更:注册资本增至3000万元,预计全年净利润下滑
    Docker容器的应用部署
    禁止ios长按时触发系统的菜单,禁止ios&android长按时下载图片
    Spring面试题16:Spring框架中的单例bean是线程安全的吗?Spring框架中bean的生命周期?哪些是重要的bean生命周期方法?
    数据结构初阶--二叉树介绍(基本性质+堆实现顺序结构)
    剑指 Offer 03. 数组中重复的数字
    css样式
    es6新增-set数据结构
    Oracle 数据库相关操作记录
  • 原文地址:https://blog.csdn.net/weixin_52733843/article/details/134060413