新闻中心

EEPW首页>嵌入式系统>设计应用> 咱们的ADC0809电压表

咱们的ADC0809电压表

作者: 时间:2016-11-28 来源:网络 收藏
///////通道编号的数码管显示函数///////
void disp_in(uchar a)
{
ADD_A = 0;
ADD_B = 0;
ADD_C = 0;
P0 = numtable[a];
delay(3);
}
///////通道1的AD转换函数///////
void ADC_1()
{
STA_ALE = 0;
STA_ALE = 1;
ADD_A = 1;
ADD_B = 0;
ADD_C = 1;
ADC_B = 0;
ADC_A = 0;
STA_ALE = 0;
}
///////通道2的AD转换函数///////
void ADC_2()
{
STA_ALE = 0;
STA_ALE = 1;
ADD_A = 1;
ADD_B = 0;
ADD_C = 1;
ADC_B = 0;
ADC_A = 1;
STA_ALE = 0;
}
///////判别是哪条通道AD转换函数///////
void ADC(uchar ad_dat)
{
if (1 == keynum)
{
ADC_1();
disp();
disp_in(1);
}
else if (2 == keynum)
{
ADC_2();
disp();
disp_in(2);
}
else if (3 == keynum)
{
TR1 = 1;
if (!shift)
{
ADC_1();
disp();
disp_in(1);
}
if (shift)
{
ADC_2();
disp();
disp_in(2);
}
}
else if (16 == keynum)
{
ADC_2();
disp();
disp_in(2);
}
while ( 0 == OE_EOC )
{
keyscan();
if (1 == keynum)
{
disp();
disp_in(1);
}
else if (2 == keynum)
{
disp();
disp_in(2);
}
else if (3 == keynum)
{
TR1 = 1;
if (!shift)
{
disp();
disp_in(1);
}
if (shift)
{
disp();
disp_in(2);
}
}
}
temp = ad_dat*0.0196078;
val_int = (uchar) temp;
val_decimal = (uchar) ((temp - val_int)*100);
}
///////定时器初始化函数//////
void timer_init()
{
IE = 0x8a;
TMOD = 0x12;
TH0 = 0x14;
TL0 = 0x00;
TR0 = 1;
TH1 = -50000/256;
TL1 = -50000%6;
}
///////主函数//////
int main ()
{
timer_init();//初始化定时器
while(1)
{
keyscan();//矩阵键盘扫描赋值
if (1 == keynum || 2 == keynum || 3== keynum) //当有键按下时,启动ADC转换
ADC(P2);
else //否则显示四个0
{
disp();
disp_in(0);
}
}
return 0;
}
///////1S显示切换的定时中断函数(T1)//////
void TIMER(void) interrupt 3
{
static uchar timer;
timer++;
if (20 == timer)
{
timer = 0;
shift = !shift;//用于两位的1S显示切换
}
}
///////提供给ADC芯片CLOCK的定时函数(T0)//////
void OTHER_CLOCK(void) interrupt 1
{
CLK = !CLK;
}
说说主要遇到的问题和学到的东西:一个是因为用了等待查询方式来读取ADC0809的AD转换结果,加上矩阵键盘和38译码器选址,导致两个问题:
1.各个功能的逻辑关系混乱。虽然只有几个功能模块,但是也思考了一番才有了新的程序架构。还有就是始终没能适应自顶向下的编程思维,比如会习惯先编出ADC的START信号或者选址函数,再去想用在哪里。而不是先直接构造一个ADC处理的框架,再去想细节的实现。
2.还有数码管动态显示不停闪烁。调试的时候,也老想着,应该就是这样了吧,改不了了吧,呵呵,可是解决之后再次觉得天无绝人之路啊,
ADD_A = 1;
ADD_B = 0; 这段语句起初P0 = numtable_DE[val_int];是放在首位的,结果想想是不是因为用38
ADD_C = 0; 译码器控制位选扰乱了下一位的段选,移一下位就搞定了……真是奇妙
P0 = numtable_DE[val_int];
delay(1);
团队合作的效率这次体现得很明显,特别是繁琐的画图,可是因为大家实践比较少,结果很不幸犯了很基础的错误,导致成品没有成功。不知道以后还有机会合作不
上一页 1 2 下一页

关键词:ADC0809电压

评论


技术专区