找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2923|回复: 3
打印 上一主题 下一主题
收起左侧

数字气压计仿真

[复制链接]
跳转到指定楼层
楼主

数字气压计.rar

19.4 KB, 下载次数: 70, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2017-5-25 15:26 | 只看该作者
楼主能分享下源码吗?
回复

使用道具 举报

板凳
ID:204697 发表于 2017-5-25 22:09 | 只看该作者
admin 发表于 2017-5-25 15:26
楼主能分享下源码吗?

#include <reg51.H>
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char

//设置ADC0832的引脚
sbit ADCS =P2^0;  //ADC0832 chip seclect
sbit ADDI =P3^7;  //K值输入端
sbit ADDO =P3^7;  //K值输出端
sbit ADCLK =P3^6;  //ADC0832 clock signal080307208

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];
uint temp;
uchar getdata; //获取ADC转换回来的值


void delay_1ms(void)  //晶振10MHz,延迟1ms
{
   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转换,返回结果
{
    uchar i=0;
    uchar j;
    uint dat=0;
    uchar 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
}


void main(void)
{  
  while(1)
  {          unsigned int temp;
      float  press;                             
          getdata=Adc0832(0);
          if(14<getdata<243)                                       //当压力值介于15kpa到115kpa之间时,遵循线性变换
                 {                            
                    int vary=getdata;                                                 
//y=(115-15)/(243-13)*X+15kpa                       
                        press=((10.0/23.0)*vary)+9.3;                        //测试时补偿值为9.3
                                                                                                                  
                        temp=(int)(press*10);                        //放大10倍                                                                                       
                        dispbuf[3]=temp/1000;                                     //取压力值百位
                        dispbuf[2]=(temp%1000)/100;                            //取压力值十位
                        dispbuf[1]=((temp%1000)%100)/10;                    //取压力值个位
                        dispbuf[0]=((temp%1000)%100)%10;                        //取压力值十分位
                        display();
                      }            
  
  }
}
回复

使用道具 举报

地板
ID:522603 发表于 2019-5-7 13:01 | 只看该作者
楼主很厉害啊!对我很有用处!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表