📄 ad例2.txt
字号:
//--------------------------------------------------------------------
void AD_init(uchar AD_port_sel ) //ADC初始化,参数是你选择的ADC端口
{
ADC_CONTR|=0x80; //开ADC电源
switch(AD_port_sel) //选择作为ADC的端口
{
case 0:
P1M0=0x01;//设置输出Z态
P1M1=0x00;
ADC_CONTR&=0xf8;
break;
case 1:
P1M0=0x02;
P1M1=0x00;
ADC_CONTR&=0xf8;
ADC_CONTR|=0x01;
break;
case 2:
P1M0=0x04;
P1M1=0x00;
ADC_CONTR&=0xf8;
ADC_CONTR|=0x02;
break;
case 3:
P1M0=0x08;
P1M1=0x10;
ADC_CONTR&=0xf8;
ADC_CONTR|=0x03;
break;
case 4:
P1M0=0x10;
P1M1=0x00;
ADC_CONTR&=0xf8;
ADC_CONTR|=0x03;
break;
case 5:
P1M0=0x20;
P1M1=0x00;
ADC_CONTR&=0xf8;
ADC_CONTR|=0x05;
break;
case 6:
P1M0=0x40;
P1M1=0x00;
ADC_CONTR&=0xf8;
ADC_CONTR|=0x06;
break;
case 7:
P1M0=0x80;
P1M1=0x80;
ADC_CONTR&=0xf8;
ADC_CONTR|=0x07;
break;
}
ADC_CONTR=0xe7;
}
//--------------------------------------------------------------------
uint GET_AD_Result()//启动AD转换并返回转换值
{
uchar temp;
uint data_temp;
data_temp=0;
ADC_DATA=0;
ADC_LOW2=0;
ADC_CONTR|=0x08;
re: temp=0x10;
temp&=ADC_CONTR;
if(temp==0)
goto re;
ADC_CONTR&=0xe7;
data_temp=ADC_DATA;
data_temp<<=2;
data_temp+=ADC_LOW2;
return data_temp;
}
//--------------------------------------------------------------------
使用的例子:
void main()//应用例子
{
uint xdata record[128];
uchar k;
AD_init(7);//选择P1.7口做ADC,当然此口现为Z态
for(k=0;k<128;k++)
{
record[k]=GET_AD_Result();启动ADC并保存结果
}
while(1);
}
/*************************************/
/*=================================================================
ADC_TURNON(uchar speed,chanl)
启动ADC并转换ADC得出转换值
==================================================================*/
uchar ADC_TURNON(uchar speed,chanl)
{
uint x,y,z;
uchar i;
EA=0;
//整理SPEED
speed&=0x03;
speed=speed<<5;
//整理通道chanl
chanl&=0x07;
//ADC_POWER开
ADC_CONTR=0x80;
delay_us(100);
//加入转换速度SPEED1/SPEED0
ADC_CONTR|=speed;
//加入通道CHS2/CHS1/CHS0
ADC_CONTR|=chanl;
//启动转换
ADC_CONTR|=0x08;
delay_us(5);
//查结束标志位
while((ADC_CONTR&&0x10)==0)
//复位ADC_FLAG
ADC_CONTR&=0xef;
//
x=ADC_DATA;
x=x*256;
x=x>>6;
y=ADC_LOW2&0x03;
z=x+y;
i=z/4;
return(i);
}
/**********************************************/
/***************** A/D转换********************/
void Ad_Change()
float AD_Result_Temp = 0;
unsigned long AD_1=0;
uchar k;
ADC_CONTR = ADC_CONTR|0x80; //1000,0000打开A/D转换电源
P1M0 = 0x08; //0000,1000用于A/D转换的P1.3口,先设为开漏
P1M1 = 0x08; //0000,1000P1.3先设为开漏。断开内部上拉电阻
delay(20); //20
ADC_CONTR = ADC_CONTR&0xE0; //1110,0000 清ADC_FLAG,ADC_START位和低3位
ADC_CONTR = ADC_CONTR|0x03; //设置当前通道号P1.3
delay(1); //延时使输入电压达到稳定
ADC_DATA = 0; //清A/D转换结果寄存器
ADC_LOW2 = 0;
ADC_CONTR = ADC_CONTR|0x08; //0000,1000ADCS = 1,启动转换
do { ; }
while((ADC_CONTR & 0x10)==0); //0001,0000等待A/D转换结束
ADC_CONTR = ADC_CONTR&0xE7; //1110,0111清ADC_FLAG位,停止A/D转换
AD_1 = ((AD_1|ADC_DATA)<<2)|(ADC_LOW2&0x03); //保存返回AD转换的 结果
AD_Result_Temp = 5*AD_1*1000/1024;
AD_1=AD_Result_Temp;
AD_channel_result[3] = AD_1/1000; // 转换成可显示的字符,从最高位到最低位
AD_channel_result[2] = (AD_1%1000)/100;
AD_channel_result[1] = (AD_1%100)/10;
AD_channel_result[0] = AD_1%10;
dis_data[0]=AD_channel_result[0];
dis_data[1]=AD_channel_result[1];
dis_data[2]=AD_channel_result[2];
dis_data[3]=AD_channel_result[3];
for(k=0;k<4;k++)
{
P2=0xff;
P2=dis_code[dis_data[k]];
P1=col_con[k];
delay(15); //调试数码管更新时间
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -