基于stc15f2k60s2单片机的数字电压表程序的问题,C语言问题
程序如下,编译没错没警告,但是结果就是不管怎么调被测电压,测出来显示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;
其他回答
暂无其它回答!