程序中主要做好扫描和判断,不停读P1.0口,如果上次读到的为1,这次读到的是0,既可以判断为下降沿,这时可以设一个标记位,标示1秒脉冲来了。
然后进入P11~P14的判断,同理,判断上次和当前次电平,每个下降沿或者上升沿计数一次(开4个变量),当P1.0的标记位没有的时候(1秒过了),读出变量值即为脉冲个数,也就是频率了
MCS-51单片机内部没有AD转换器,需要外接AD转换器。比较常用的有ADC0809,这是款8位的AD转换芯片。不知道你要采集的信号是什么信号?如果变化比较缓慢的话就不用加采样保持电路,如果信号变化比较快的话就要加采样保持电路。芯片的编程也比较简单。下面是ADC0809的程序:
//ADC0809采样程序
#include<reg51.h>
sbit a1=P1^0
sbit b1=P1^1
sbit c1=P1^2
sbit eoc=P1^3
sbit st=P1^4
sbit oe=P1^6
unsigned long dat
unsigned char show_char[]={0xc0,0xf9,0xa4,0xb0,0X99,
0X92,0x82,0xf8,0x80,0x90,
0x40,0x79,0x24,0x30,0x19,
0x12}
unsigned char buf[4]={3,4,5,0}
unsigned char bit_sel[3]={0xfd,0xfe}
int i,j
void delay(us)
{ while(us--)
{for(i=0i<100i++)}
}
main()
{ //初始化adc0809
st=0
oe=0
a1=0
b1=0
c1=0
while(1)
{ //启动AD转换获得数据
//
st=0
st=1
delay(1)
st=0
while(eoc==0)
oe=1
dat=P3
delay(1)
oe=0
//处理数据
//dat=0xf0
dat=(int)dat*5.0/255.0*100.0
buf[0]=dat/100
buf[0]=buf[0]+10
dat=dat%100
buf[1]=dat/10
buf[2]=dat%10
//数据显示
for(j=0j<2j++)
{ P2=bit_sel[j]
P0=show_char[buf[j]]
delay(1)
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)