用Studio+WIN avr写《数码管显示两路A/D转换结果》的程序用proteus仿真时,在我画的图1里仿真,调节电位器没作用,只能看到ADC0这一路,而把程序加到原图2里有两路显示,调电位器马上显示变化。是不是CPU参数没设好呢?怎么才好,求大师们指导哟。谢谢了!
程序如下:
//---------------------------------------------------------------------
//名称:数码管显示两路A/D转换结果
//说明:调节RV1,RV2时,两路模拟电压将显示在8只集成式数码管上
//注:用PROTEUS仿真,只能看到ADC0这一路
//---------------------------------------------------------------------
#define F_CPU 4000000UL
#include
#includetil/delay.h>
#define INT8U unsigned char
#define INT16U unsigned int
//各数字的数码和管段码,最后一位为空白
const INT8U SEG_CODE[]=
{0XC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//两路模拟转换结果显示缓冲,显露格式为:X.XX X.XX,第4位和第8位不显示
INT8U Display_Buffer[]={0,0,0,10,0,0,0,10};
//----------------------------------------------------------------------
//对通道CH进行模/数转换
//----------------------------------------------------------------------
void ADC_Convert(INT8U CH)
{
int Result;
ADMUX=CH; //ADC通道选择
//读取转换结果,并转换为电压值
Result=(int)((ADCL+(ADCH<<8))*500.0/1023.0);
//将10位的模/数转换结果0X0000-0X03FF(即0-1023)转换为000-500之间的
//待显示的数(电压0.00-5.00V)
//或使用语句:Result=(int)(ADC*500.0/1023.0);
//ADC0的结果放入数组0,1,2单元,ADC1的结果放入数组4,5,6单元
Display_Buffer[CH*4]=Result/100;
Display_Buffer[CH*4+1]=Result/10%10;
Display_Buffer[CH*4+2]=Result%10;
}
//--------------------------------------------------------------------
//主程序
//--------------------------------------------------------------------
int main()
{
INT8U i;
DDRA=0XFC; //11111100,配置A/D转换端口ADC0,ADC1为输入
DDRC=0XFF;PORTC=0X00; //配置数码管显示端口
DDRD=0XFF;PORTD=0X00;
ADCSRA=0XE6; //11100110,ADC转换置位置,启动转换,64分频
_delay_ms(300); //延时等待系统稳定,时间长时,等一个会才显示
while(1)
{
ADC_Convert(0); ADC_Convert(1); //对2个通道进行A/D转换
for(i=0;i<8;i++)
{
PORTC=0XFF; //先关闭段码
PORTD=_BV(i); //发送数码管位码
PORTC=SEG_CODE[Display_Buffer]; //发送数字段码
if(i==0||i==4) PORTC&=0X7F; //对整数位加小数点
_delay_ms(4);
}
}
}
附件为Proteus文件和HEX文件: 数码管显示两路AD转换结果.rar
|