STC12C2052AD芯片的AD转换程序
/*flashman编写,QQ28479691*/
#include
#include
#define uchar unsigned char // 0~255
#define uint unsigned int // 0~65535
sfr ADCR=0xc5; //控制寄存器
sfr ADDR=0xc6; //结果寄存器
sfr P1M0=0x91;
sfr P1M1=0x92;
char code DisV[]={"V:"};//灵敏度
char code DisP[]={"P:"};//精确度
sbit RS=P1^7;
sbit RW=P1^6;
sbit E=P1^5;
void LCDIni(void);
void WrOp(uchar dat);
void WrDat(uchar dat);
void ChkBusy(void);
void delay();
void DisText(uchar addr,uchar *text);
void ShowNum(uchar addr,uint num); //在addr处显示数字num void ShowByte(uchar addr,uchar num);
char AdcVal(uchar n); //取出单次ADC的值
char AdcValPro(uchar n); //进行软件滤波后的ADC的值
char data BCD[6]; //十位二进制的显示码分别是千百十个位的显示char data Adc[2]; //存放Adc转换后的值
void main(void)
{
SP=0X5F;
LCDIni();
DisText(0x80,DisV);
DisText(0xc0,DisP);
while(1)
{
ShowByte(0x82,AdcValPro(0));
ShowByte(0xC2,AdcV al(1));
}
}
//-----------------------------------------
//ADC相关程序
char AdcVal(uchar n)
{//软件滤波
uchar i,k;
uint tmp=0,val;
for(i=0;i<20;i++)
{
k=AdcValPro(n);
tmp=(tmp+k)/2;
}
val=(uchar)(tmp);
k=val>Adc[n] ? (val-Adc[n]):(Adc[n]-val);
Adc[n]=k>0 ? val:Adc[n];
return Adc[n];
}
char AdcValPro(uchar n)
{//返回第N个ADC的值从0到7
uchar val;
P1M0=0x03;
P1M1=0x03;
ADCR=0x88+n;
while((ADCR & 0x10) ==0);
val=ADDR;
ADCR=0x00;
return val;
}
//-----------------------------------------
//LCD相关程序
void ShowNum(uchar addr,uint num) //在addr处显示数字num
{//将num转化成五个BCD码存放在全局数组BCD[5]中
uchar i;
for(i=5;i>0;i--) //将NUM数据转化成ASCII码,如521会转化为00521
{
BCD[i-1]=(uchar)(num%10+0x30); //取出最低位
num/=10; //去掉最低位
}
i=0;
while(BCD[i] ==0x30 && i<4) BCD[i++]=' '; //NUM转换成数组存放,但还没有加上小数点
BCD[5]='\0';
DisText(addr,BCD);
}
void ShowByte(uchar addr,uchar num)
{//将num转化成五个BCD码存放在全局数组BCD[5]中
uchar i;
for(i=3;i>0;i--) //将NUM数据转化成ASCII码,如521会转化为00521
{
BCD[i-1]=(uchar)(num%10+0x30); //取出最低位
num/=10; //去掉最低位
}
i=0;
while(BCD[i] ==0x30 && i<4) BCD[i++]=' '; //NUM转换成数组存放,但还没有加上小数点
BCD[3]='\0';
DisText(addr,BCD);
}
void DisText(uchar addr,uchar *p)
{
WrOp(addr);
while(*p !='\0')WrDat(*(p++));
}
void LCDIni()
{
WrOp(0x38);
WrOp(0x28);
WrOp(0x06);
WrOp(0x0E); //光标加1
}
void WrOp(uchar dat)
{
ChkBusy();
RS=0;
RW=0;
E=0;
P3=(dat>>4);
E=1;
delay();
E=0;
P3=dat;
E=1;
delay();
E=0;
}
void WrDat(uchar dat)
{
ChkBusy();
RS=1;
RW=0;
E=0;
P3=(dat>>4);
E=1;
delay();
E=0;
P3=dat;
E=1;
delay();
E=0;
}
void ChkBusy()
{
uchar dat;
do
{
P3|=0x0f; //
RS=0;
RW=1;
E=1;
dat=P3; //读出P3数据
E=0;
E=1;
_nop_();
E=0;
}while(dat & 0x08);
}
void delay(void)
{
uchar j;
for(j=0;j<3;j++);
}
本文档为【STC12C2052AD芯片的AD转换程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。