2020-06-01

有大佬能帮我看看程序如何改么。keil编译没有出错,就是晶体管无法实现点亮。关于气压计的 在这里插入图片描述

(1)ADC0832驱动程序

//ADC0832的引脚

sbit ADCS =P3^1; //ADC0832 chip seclect

sbit ADDI =P3^2; //ADC0832 k in

sbit ADDO =P3^2; //ADC0832 k out

sbit ADCLK =P3^0; //ADC0832 clock signal080307208

/读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;

	ADDO=1;//收数据

	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

}

(2)数码管显示程序

unsigned char dispbitcode[8]={

0xf1,0xf2,0xf4,0xf8,0xef,0xdf,0xbf,0x7f

};  //位扫描

unsigned char dispcode[11]={

0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff

};  //共阳数码管字段码

unsigned char dispbuf[4];

void display(void) //数码管显示函数

{

char k;

for(k=0;k<4;k++)

{

	P2 = dispbitcode[k];

	P0 = dispcode[dispbuf[k]];

	if(k==1)      //加上数码管的dp小数点

	P0&=0x7f;

	delay_1ms();      

}

}

(3)主程序

/主程序/

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();

	}        

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值