我把AD转换和结果显示放进一个while(1)的死循环,结果显示出现第一个数码管很亮,后面的数码管都很暗很暗,而且显示数值永远不变,如果不把AD转换函数和显示函数放进死循环,整个程序只进行一次AD转换一次显示就不会这样了,为什么?
我用的显示是移位寄存器和锁存器搭配起来的串行送显示码
void main(){
void display(int *bcd); //六位数码管显示的函数,
long ADconvert(); //12位带返回值的AD转换函数
DDRA=0XFF;
DDRB=0XFF;
DDRE=0XFF;
long ADdata;
int ADbcd[6]={0*6}; //六位显示码码
display(ADbcd); //显示零
while(1)
{
ADdata=ADconvert(); //进行一次AD转换
ADbcd[2]=ADdata/1000; //将得到的AD转换数值拆成六位显示码
ADdata=ADdata%1000;
ADbcd[3]=ADdata/100;
ADdata=ADdata%100;
ADbcd[4]=ADdata/10;
ADdata=ADdata%10;
ADbcd[5]=ADdata;
display(ADbcd); //进行显示,一个端口串行送数,用移位寄存器送片选码和显示码
}
AD需要时间的,查询方式需要插入等待时间.
要么,你显示的数字前面一位的值不变化,而后面的值变化很快
你应该检查一下你的子程序才对.
以下是用STC12C5A32S2的AD转换过程,你看看吧
- ADC_RES = 0;
- ADC_RESL = 0;
-
- TempIO=TempIO|7; //计算出要选则的IO口寄存器值
- TempIO=TempIO^(7-KeyIO);
-
- KeyIO &= 0x07; //0000,0111 清0高5位
- ADC_CONTR = AD_SPEED;
- nop();
- ADC_CONTR |= KeyIO; //选择 A/D 当前通道
- nop();
- ADC_CONTR |= 0x80; //启动 A/D 电源
- delay(1); //使输入电压达到稳定
- ADC_CONTR |= 0x08; //0000,1000 令 ADCS = 1, 启动A/D转换,
- ReadOver = 0;
- while (ReadOver ==0 ){ //等待A/D转换结束
- ReadOver = (ADC_CONTR & 0x10); //0001,0000 测试A/D转换结束否
- }
- ADC_CONTR &= 0xE7; //1111,0111 清 ADC_FLAG 位, 关闭A/D转换
- return (ADC_RES); //返回 A/D 高 8 位转换结果
在循环里加入几毫秒的延时,在函数display(ADbcd)中每个数码管显示之间也要有延时。
1、AD转换需要时间完成,既第二次AD和第一次AD之间要有足够间隔
2、数码管亮、暗和硬件有关系。检查电路电压是否足够,输出电流是否足够。
我觉得是你显示驱动有问题。
你不要采样AD值,用一个延时逐步增加的变量,看显示是否正常。