基于stc15f2k60s2单片机的数字电压表程序的问题,C语言问题

原问题:基于stc15f2k60s2单片机的数字电压表程序的问题,C语言问题
分类:编程开发 > 最后更新时间:【2017-07-26 19:01:28】
问题补充:

程序如下,编译没错没警告,但是结果就是不管怎么调被测电压,测出来显示5,和0两个结果,有时数码管还会跳变,等稳定下来就只有5和0;

但是把后面的中断函数里的 adc_data = adc_datah<<8+ adc_datal;

改为 adc_data = adc_datah<<8;

adc_data = adc_data + adc_datal; 就好了,问题来了,为什么改了之后就行了,前后的意思不是一样的吗

我反复试过了,改回来就不行,改了就行

#include"STC15F2K60S2.h"

#include"intrins.h"

#define uchar unsigned char

#define uint unsigned int

uchar adc_datah;

uchar adc_datal;

uint adc_data;

uchar code SEG7[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};

uchar code Scan_bit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

uchar data Dis_buf[]={0,0,0,10,10,10};

void Delayxms(uint t)

{

unsigned char i,j;

for(i=0;i<t;i++)

{

_nop_();

_nop_();

_nop_();

i=11;

j=190;

do

{

while(--j);

}

while(--i);

}

}

void display(void)

{

uchar i;

for(i=0;i<6;i++)

{

P2=0xff;

P0=SEG7[Dis_buf[i]];

P2=Scan_bit[i];

Delayxms(1);

}

}

void main(void)

{

unsigned long i;

unsigned char status;

P1ASF=0X01;

ADC_CONTR = 0X80;

for(i=0;i<10000;i++);

CLK_DIV |= 0x20;

ADC_CONTR = 0X88;

EADC=1;

EA=1;

while(1)

{

Dis_buf[2]=adc_data/1000;

Dis_buf[1]=adc_data/100%10;

Dis_buf[0]=adc_data%100/10;

display();

}

}

void ADC_int (void) interrupt 5

{

ADC_CONTR = 0x80;

adc_datah = ADC_RES&0x03;

adc_datal = ADC_RESL;

adc_data = adc_datah<<8+ adc_datal;

adc_data = adc_data*5;

ADC_CONTR = 0x88;

}

补充:是因为uchar adc_datah;uchar adc_datal;uint adc_data;这三句吗

最佳答案

adc_data = adc_datah<<8+ adc_datal;

adc_data = adc_datah<<8;

adc_data = adc_data + adc_datal;

结果肯定不一样,你没注意运算符的优先级啊

<<比+优先级低,所以

adc_data = adc_datah<<8+ adc_datal;

相当于

adc_data = adc_datah<<(8+ adc_datal);

正确的写法是

adc_data = (adc_datah<<8)+ adc_datal;

最佳答案由网友  whoami1978  提供
公告: 为响应国家净网行动,部分内容已经删除,感谢网友理解。
20

分享到:

其他回答

暂无其它回答!

    推荐