在 proteus 下按照下面
的图画出电路图,再将
所有程序用 keil C 编译
后 生 成 hex 文 件 导 入
proteus 即可仿真成功!
我的另一个文档是关于此的课程设
计,欢迎下载!
1
基于 MPX4115 的数字压力测量仪
步骤:(1)在 Proteus 软件画出电路图
(2)用 keil C 软件写出 C 程序,并生成.hex 文件,导入到单片机当中,进行仿真,
观察结果。
压力测试仪系统描述;
输入 15--115kPA 压力信号
输出 00h--ffh 数字信号(adc0832)
在 LED 上显示实际的压力值,如果超限则报警
线性区间标度变换公式:
作者:
y=(115-15)/(243-13)*X+15kpa
2
单位:
日期:2008.3.7
********************************************************/
#include
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
//ADC0832 的引脚
sbit ADCS =P2^0;
sbit ADDI =P3^7;
sbit ADDO =P3^7;
sbit ADCLK =P3^6;
//ADC0832 chip seclect
//ADC0832 k in
//ADC0832 k out
//ADC0832 clock signal
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 转换回来的值
//位扫描
//
//12mhz delay 1.01ms
void delay_1ms(void)
{
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();
3
//AD 转换,返回结果
}
}
/************
读 ADC0832 函数
************/
//采集并返回
unsigned int Adc0832(unsigned char channel)
{
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++)
4
{
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
}
void main(void)
{
while(1)
{
press;
unsigned int temp;
float
getdata=Adc0832(0);
if(14
dispbuf[3]=temp/1000;
dispbuf[2]=(temp%1000)/100;
dispbuf[1]=((temp%1000)%100)/10;
dispbuf[0]=((temp%1000)%100)%10;
display();
//取压力值百位
//取压力值十位
//取压力值个位
//取压力值十分位
}
}
}
程序完!
6