基于单片机控制的数字气压计设计与实现
上设计,便可通过fo来计算P的大小以得到实时的气压值。硬件电路设计完成之后,可使用AEDK5196PH仿真器的仿真环境进行仿真,并可用C51语言来编写处理程序。其基本程序流程如图4所示。
程序设定:T0为定时器,基本的定时时基为50ms。T1为计数器,运用内部中断0可保证T0定时满500ms后就读取此时计数器的值,以计算气压值。如使T1、T0均工作于方式1,并在P1口送字型码,同时可用P3.0~P3.3做位选线,那么,其相应的函数如下:
(1)定时器T0中断函数:
voidtimer0(void)interrupt1using1
{uintx,y;
uintcount_pluse;
ET0=0;//关闭T/C0中断
Tcount++;//中断次数
if?Tcount==10){
TR1=0;//停止计数器计数
Tcount=0;
x=TH1;
y=TL1;
count_pulse=(x*256+y)*2;
ph=(uint)(10*((float)(countpulse+1520)/105.9???//计算气压值
TH1=0x00;//重设计数初值
TL1=0x00;
}
TH0=-50000/256;//重设50ms初值
TL0=-50000%256;
if(TL0!=0)TH0--;
ET0=1;
TR1=1;
return;
}
该中断函数主要用于完成脉冲的读取和气压值的计算。ph是个全局变量,可用来保存气压值。
(2)在显示函数里,将气压值先按位进行分离并保存到数组,然后送段码和相应位选就可以显示出相应的气压值了。具体程序如下:
voiddisplay(uintph_in)
{uchari=0;
ucharj=0;
ucharselect_bit=0;//位选
do{
cur_buf[i]=ph_in%10;
i++;
j=i;
}while(ph_in=ph_in/10);?//当高位为零时?结束循环
i=0;
select_bit=0xfe;
do
{P1=tab[*p];
P3=select_bit;
dl_ms();?
select_bit=(selectbit<<1)+1;
//从最右边一位开始显示,循环左移
p++;
i++;
}while(i<j);
p=cur_buf;// 《基于单片机控制的数字气压计设计与实现(第3页)》
本文链接地址:http://www.oyaya.net/fanwen/view/175848.html
程序设定:T0为定时器,基本的定时时基为50ms。T1为计数器,运用内部中断0可保证T0定时满500ms后就读取此时计数器的值,以计算气压值。如使T1、T0均工作于方式1,并在P1口送字型码,同时可用P3.0~P3.3做位选线,那么,其相应的函数如下:
(1)定时器T0中断函数:
voidtimer0(void)interrupt1using1
{uintx,y;
uintcount_pluse;
ET0=0;//关闭T/C0中断
Tcount++;//中断次数
if?Tcount==10){
TR1=0;//停止计数器计数
Tcount=0;
x=TH1;
y=TL1;
count_pulse=(x*256+y)*2;
ph=(uint)(10*((float)(countpulse+1520)/105.9???//计算气压值
TH1=0x00;//重设计数初值
TL1=0x00;
}
TH0=-50000/256;//重设50ms初值
TL0=-50000%256;
if(TL0!=0)TH0--;
ET0=1;
TR1=1;
return;
}
该中断函数主要用于完成脉冲的读取和气压值的计算。ph是个全局变量,可用来保存气压值。
(2)在显示函数里,将气压值先按位进行分离并保存到数组,然后送段码和相应位选就可以显示出相应的气压值了。具体程序如下:
voiddisplay(uintph_in)
{uchari=0;
ucharj=0;
ucharselect_bit=0;//位选
do{
cur_buf[i]=ph_in%10;
i++;
j=i;
}while(ph_in=ph_in/10);?//当高位为零时?结束循环
i=0;
select_bit=0xfe;
do
{P1=tab[*p];
P3=select_bit;
dl_ms();?
select_bit=(selectbit<<1)+1;
//从最右边一位开始显示,循环左移
p++;
i++;
}while(i<j);
p=cur_buf;// 《基于单片机控制的数字气压计设计与实现(第3页)》