哪位大神来帮我看看这个51单片机实现数字电压表的代码

wugang589 2016-06-20 09:18:33
#include <reg52.h>
#include <intrins.h>
#define _Nop() _nop_();//空操作

sbit ST = P3^0;
sbit OE = P3^1;
sbit EOC = P3^2;

sbit BEEP = P3^3;

sbit V1 = P3^4;
sbit V2 = P3^5;
sbit V3 = P3^6;
sbit V4 = P3^7;
unsigned int h;
unsigned char digit[5];
unsigned char table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,//不带小数点编码
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点编码

void delay(unsigned int tc){
while (tc != 0){
unsigned int i;
for(i = 0; i < 100;i ++)
tc--;
}
}

unsigned char adc0809(){
unsigned char adda;
ST = 0;
OE = 0;
P1 = 0xff;
ST = 1;
_nop_();_nop_();
ST = 0;
_nop_();_nop_();_nop_();_nop_();
while(EOC == 0);
OE = 1;
adda = P1;
_nop_();
OE = 0;
return(adda);
}

unsigned int dacl(){
int x;
unsigned int dady = 0;
for(x = 0;x < 10;x++)
dady = adc0809() + dady;
dady = dady / 10;
return(dady);
}

void loop(void){
while(h == 1){
BEEP = !BEEP;
delay(100);
BEEP = !BEEP;

}
}

void led_display(float val){
if(V1 == 0){
val = val * 500 /255;
if(val > 200){
//P0.7 = 1;
h = 1;
loop();
}
else if(val < 200 && val >20){
digit[3] = 1;
digit[2] = val / 100;
val = val - 100 * digit[4];
digit[1] = val / 10;
val = val - 10 * digit[3];
digit[0] = val * 10 / 10;

digit[3] = table[digit[3]];
digit[2] = table[digit[2]];
digit[1] = table[digit[1]];
digit[0] = table[table[0]];
}
}
else if(V2 == 0){
val = val * 10 / 255;
if(val > 20 || val < 2 ){
h = 1;
loop();
}
else {
digit[3] = 1;
digit[2] = val / 10;
val = val - 10 * digit[2];
digit[1] = val * 10 / 10;
val = val - digit[1];
digit[0] = val * 10 / 10;

digit[3] = table[digit[3]];
digit[2] = table[digit[2]];
digit[1] = table[digit[1]];
digit[0] = table[digit[0]];
}
}
else if(V3 == 0){
val =10 * 5 * val / 255 ;
if(val > 20 || val < 2){
h = 1;
loop();
}
else {
digit[3] = 1;
digit[2] = val / 10;
val = val - 10 * digit[2];
digit[1] = val * 10 / 10;
val = val - digit[1];
digit[0] = val * 10 / 10;

digit[3] = table[digit[3]];
digit[2] = table[digit[2]];
digit[1] = table[digit[1]];
digit[0] = table[digit[0]];
}
}
else if(V4 == 0){
val = 500 * val / 255;
if(val > 200){
h = 1;
loop();
}
else {
digit[3] = 1;
digit[2] = val / 100;
val = val - 100 * digit[4];
digit[1] = val / 10;
val = val - 10 * digit[3];
digit[0] = val * 10 / 10;

digit[3] = table[digit[3]];
digit[2] = table[digit[2]];
digit[1] = table[digit[1]];
digit[0] = table[table[0]];
}
}
}

void main(){
int i;
int j = 3;
int k;
unsigned char fuhao[4];
BEEP = 0;
led_display(dacl());

for(i = 3;i >= 0;i--){
if(digit[i] != 0xc0){
fuhao[j--] = digit[i];

}
for(k = 0;k < 4;k++){
P0 = 0x01 << k;
P2 = fuhao[k];
delay(5);
}
}
}

这段代码是用C51和AD0809实现数字电压表的,但是程序烧进去没有结果,哪位大神可以抽空帮我看看。。。感激不尽。个人感觉可能main有问题。或者在adc0809模块有问题。感觉有点晕。求大神帮忙看看,谢谢了!
...全文
240 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Crystallllllll 2016-07-24
  • 打赏
  • 举报
回复
分模块检查,先看显示是否正常,再去调AD
gordon71305 2016-06-21
  • 打赏
  • 举报
回复
wugang589 2016-06-21
  • 打赏
  • 举报
回复
引用 3楼gordon71305 的回复:
是的,我今天早上也发现这个问题了。目前情况是数码管不亮,前面的adc0809模块没问题吗?总感觉ad0809转换这里可能有问题。
fanleung 2016-06-20
  • 打赏
  • 举报
回复
可以用灯来验证程序逻辑
dceacho 2016-06-20
  • 打赏
  • 举报
回复
弄个仿真器,不然光代码不容易发现哪有问题

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧