关于AD转换的数值问题?我写了个模数转换程序可是显示有...
时间:10-02
整理:3721RD
点击:
关于AD转换的数值问题和显示问题,请教一下诸位大神:(1)AD转换后输入到单片机的是二进制数值?它与输入的模拟电压有什么关系,可以仔细说一下吗?给个参考资料也行!(2)对于5V的参考电压,8位的ADC芯片,为什么编程是转换数据是 X(二进制代码)\255*500,为什么是乘以500?其他位数如12位的单片机也是这样吗?(3)对于8位的单片机来说,12位的ADC芯片转换后如何处理?(4)如果要显示三位如999~0.001要如何编程?或者说显示小数位要如何编程? 如果能给分资料那就更加好了,谢谢!
我写的这个程序是两个按键,对应于两路AD间的切换,运行没有什么太大的问题,就是显示的第二路,数值不正确,望高手解答,谢谢!
这是我写的程序
#include<reg52.h> //52头文件申明
#define uchar unsigned char
#define uint unsigned int
sbit le = P2^0;
sbit clk = P2^1; //ADC0809的时钟信号输入端
sbit adda = P3^4; //ADC0809的地址输入端
sbit addb = P3^5;
sbit addc = P3^6;
sbit start_ad = P2^5; //ADC0809启动信号,高脉冲启动
sbit eoc = P2^6; //ADC0809转换结束信号
sbit oe = P2^7; //ADC0809读数据控制端
sbit key1 = P3^0;
sbit key2 = P3^1;
sbit NOA = P2^2;
sbit NOB = P2^3;
sbit NOC = P2^4;
uchar bai = 0, shi = 0, ge = 0; //定义显示全局变量
uchar getdata = 0;
uchar a = 0, b = 0, c = 0;
uchar code seg7[]={ 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
}; //共阴极数码管显示编码
void delay(uint x) //微秒级延时子程序
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar bai,uchar shi,uchar ge) //数码管显示函数
{
le = 1;
NOA = 0;
NOB = 1;
NOC = 0;
P0=(seg7[bai]|0x80); //段选数据,和0x80相与表示显示小数点
le = 0;
delay(12);
le = 1;
NOA = 1;
NOB = 0;
NOC = 0;
P0=seg7[shi];
le = 0;
delay(12);
le = 1;
NOA = 0;
NOB = 0;
NOC = 0;
P0=seg7[ge];
le = 0;
delay(12);
}
void key_scan()
{
if(key1 == 0)
{
delay(5);
if(key1 == 0)
{
while(!key1);
a = 0;
b = 0;
c = 0;
}
}
if(key2 == 0)
{
delay(5);
if(key2 == 0)
{
while(!key2);
a = 0;
b = 0;
c = 1;
}
}
}
int main(void)
{
uint temp;
le = 0;
TMOD=0x20; //定时器1工作在方式2
TH1=255-200;
TL1=255-200;
EA=1;
EX0=1;
IT0=1;
ET1=1;
TR1=1; //启动定时器1
while(1)
{
key_scan(); //adda=0; //输入模拟电压通道地址
adda = a; //addb=0;
addb = b;
addc = c; //addc=0;
oe=0;
start_ad=0; //启动AD
start_ad=1;
start_ad=0;
display(bai,shi,ge); //数码管显示程序
temp=getdata*1.0/255*500; //数据转化
ge=temp%10; //提取个位数字
shi=temp%100/10; //提取十位数字
bai=temp/100; //提取百位数字
}
return 0;
}
void t1(void) interrupt 3
{
clk=~clk;
}
void ex0_int() interrupt 0
{
oe=1; //读AD转换数据
getdata=P1;
oe=0;
}
通道0的电压值与显示的是相同的
通道1的电压值与显示的是不相同的
坐等回复!
请点开图片查看!