//****************************************STC12C5A60S2 AD转化***********************************************//
#include”stc12c5a.h” //头文件在STC公司主页上下载
#include”stdio.h”
#include”intrins.h”
//——————————————————————————
void AD_init();
void serial_init();
void delay(unsigned int a);
float AD_work(unsigned char channel);
unsigned int AD_get(unsigned char channel);
//——————————————————————————
void main()
{
AD_init(); //A/D转化初始化
serial_init(); //串口初始化
while(1)
{
unsigned char i;
for(i=0;i<8;i++) //循环发送P1.0-P1.7的转化数值
{
TI=1; //运用printf函数前须先将发送标志位TI置1
printf(“The P1.%bd voltage is %f”,i,AD_work(i));
TI=0;
delay(1000); //延时约1s
}
}
}
//——————————————————————————
unsigned int AD_get(unsigned char channel)
{
ADC_CONTR=0x88|channel; //敞开AD转化1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
_nop_(); _nop_(); _nop_(); _nop_();//要通过4个CPU时钟的延时,其值才能够确保被设置进ADC_CONTR寄存器
while(!(ADC_CONTR&0x10)); //等候转化完结
ADC_CONTR&=0xe7; //封闭AD转化,ADC_FLAG位由软件清0
return(ADC_RES*4+ADC_RESL); //回来AD转化完结的10位数据(16进制)
}
//——————————————————————————
float AD_work(unsigned char channel)
{
float AD_val; //界说处理后的数值AD_val为浮点数
unsigned char i;
for(i=0;i<100;i++)
AD_val+=AD_get(channel); //转化100次求平均值(进步精度)
AD_val/=100;
AD_val=(AD_val*5)/1024; //AD的参阅电压是单片机上的5v,所以乘5即为实践电压值
return AD_val;
}
//——————————————————————————
void delay(unsigned int a) //延时约1ms
{
unsigned int i;
while (–a!=0)
for(i=600;i>0;i–); //1T单片机i=600,若是12T单片机i=125
}
//——————————————————————————
void serial_init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd; //设置9600波特率
SCON=0x50; //串口方法1,答应接纳
TR1=1;
}
//——————————————————————————
void AD_init()
{
P1ASF=0xff; //P1口悉数作为模仿功用AD运用
ADC_RES=0; //清零转化成果寄存器高8位
ADC_RESL=0; //清零转化成果寄存器低2位
ADC_CONTR=0x80;//敞开AD电源
delay(2); //等候1ms,让AD电源安稳
}
/*
STC12C5A60S2单片机的10位AD转化程序
****************************************STC12C5A60S2AD转换********************************************
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/254115.html