俺是菜鸟!做一个电压表遇到的问题,我用的AD是AD1674,数码管是4位共阳!
做出来可以比较准确的显示数值,但发现最后一位数值来回在几个数中间闪烁,不能够稳定显示,而且最后一位比其他几位稍亮,不知程序需要怎样修改,困惑了几天了
感谢各位大侠抒发高见!
以下是程序:
#include <reg52.h>
#include <intrins.h>
sbit CE=P3^0;
sbit RC=P3^1;
sbit STS=P3^2;
sbit LE=P3^5;
sbit A0=P3^6;
sbit CS=P3^3;
#define N 0x0fff //十二位转换
unsigned long result=0;
unsigned char seg[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char buf[4];
void delay(n)
{
int i;
while(n--)
for(i=0;i<10;i++);
}
void inti()
{
CS=1; /*初始化AD*/
CE=0;
}
unsigned int ad1674_convert()
{
unsigned int temp=0;
//STS=1;
inti();
CS=0; /*启动12位AD*/
delay(1);
A0=0;
delay(1);
RC=0;//
delay(1);
CE=1;
delay(1);
//while(STS==1);
{
CE=0;
delay(1);
RC=1;
delay(1);
A0=0;
delay(1);
CE=1;
delay(1);
temp=P0;
temp=P0<<4;
CE=0;
delay(1);
RC=1;
delay(1);
A0=1;
delay(1);
CE=1;
delay(1);
temp+=P0>>4;
}
CE=0;
CS=1;
return temp;
}
void dispute()
{
unsigned long result1; //用于中途的数据转换
unsigned long vol,vol_c; //电压显示,与电压的一个进位
result1=result*20000; //*100*10*10v 扩大一百倍,用来替代两位小数,扩大十倍用来小数点后第三位四舍五入?
//又乘以20,是最电压
vol=result1/N; // vol=result/0x0fff*10(v)
vol_c=vol%10;
if(vol_c>=5) //四舍五入
vol=vol+10;
vol=vol/10;
buf[0]=vol/1000;
buf[1]=vol/100%10;
buf[2]=vol/10%10;
buf[3]=vol%10;
}
void display() //显示子程序.
{
int i=0;
unsigned char m;
m=0x7f;
while(1)
{
for(i=0;i<4;i++)
{
LE=0;
m=_crol_(m,1);
P2=m;
LE=1;
if(i==1)
P1=seg[buf[i]]-0x80; //加小数点
else P1=seg[buf[i]];
LE=0;
delay(15);
P1=0xff; //关显示,进行下一次测试
}
}
}
main()
{
while(1)
{
result=ad1674_convert();
dispute();
delay(1);
display();
delay(20);
}
} |