基于ADC的AD转换.docx
《基于ADC的AD转换.docx》由会员分享,可在线阅读,更多相关《基于ADC的AD转换.docx(10页珍藏版)》请在冰豆网上搜索。
基于ADC的AD转换
/*----------------------------------------------------------
功能介绍:
-----------------------------------------------------------*/
#include<>
#include<>
#include<>
#defineucharunsignedchar
#defineuintunsignedint
#defineucodeunsignedcode
/*--------------------------------------------
包含函数
---------------------------------------------*/
voidDISP(void);//数码管显示函数
voidkey(void);//矩阵键盘函数
void_nop_(void);
voidad_buf();//模拟量转化为数字函数
ucharADC0834(uchartds);//AD转换函数
/*-------------------------------------------
参数定义
-------------------------------------------*/
ucharbdataekey1;//键前沿提取
ucharbdataekey2;
uchardatakey2;
uchardatakey1;
ucharbdatalastkey1;
ucharbdatalastkey2;
uchardisp_a;//数码管显示指针
sbitcs0=P2^0;
sbitcs1=P2^1;
sbitcs2=P2^2;
sbitcs3=P2^3;
sbitcs4=P2^4;
sbitesw0=ekey2^6;//独立按键键沿标志
sbitesw1=ekey2^7;//
sbitek0=ekey1^0;//矩阵按键键沿标志
sbitek1=ekey1^1;
sbitek2=ekey1^2;
sbitek3=ekey1^3;
sbitek4=ekey1^4;
sbitek5=ekey1^5;
sbitek6=ekey1^6;
sbitek7=ekey1^7;
sbitek8=ekey2^0;
sbitek9=ekey2^1;
sbitrow0=P2^5;
sbitrow1=P2^6;
sbitrow2=P2^7;
sbitsw0=P1^6;
sbitsw1=P1^7;
sbitdo_0834=P1^0;//0834DI
sbitcs_0834=P1^1;//0834片选
sbitdi_0834=P1^2;//0834DI
sbitclk_0834=P1^3;//0834时钟
sbitdian=P0^7;//小数点
ucharbuf0;//显示缓冲单元个位
ucharbuf1;//十
ucharbuf2;//百
ucharbuf3;//千
ucharbuf4;
ucharcodeled[]={0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90};
ucharmsta=0;
uchartds;//通道选择
uintadbuf;
bitt1s;//一秒标志位
bitlight;//小数点亮标志位
ucharktime;
/*-------------------------------------------
主函数
-------------------------------------------*/
voidmain()
{ucharf1s=0;
uchari;
TMOD=0x01;
TH0=0xec;
TL0=0x78;
TR0=1;
while
(1)
{
while(!
TF0);//5ms
TF0=0;
TH0=0x0ec;
TL0=0x78;
++f1s;
if(f1s==200)
{t1s=1;
f1s=0;}
key();
DISP();
switch(msta)
{//待机模块显示“0000”
case0:
if(esw0){msta=1;tds=0xd0;}//SW1按下跳到模块1选择单端模式AD一次
if(esw1){msta=1;tds=0x80;}//SW2按下跳到模块1选择差分模式AD一次
if(ek0){msta=2;tds=0xd0;}//ek0按下跳到模块2选择单端模式十次AD取平均
if(ek1){msta=2;tds=0x80;}//ek1按下跳到模块2选择差分模式十次AD取平均
if(ek2){msta=3;tds=0xd0;}//ek2按下跳到模块3选择单端模式一秒AD一次
if(ek3){msta=3;tds=0x80;}//ek3按下跳到模块3选择差分模式一秒AD一次
buf4=0,buf3=0,buf2=0,buf1=0;
buf0=0;
break;
case1:
if(esw0){msta=1;tds=0xd0;}//只AD一次
if(esw1){msta=1;tds=0x80;}
light=1;//小数点亮
adbuf=ADC0834(tds);
ad_buf();
break;
case2:
if(ek0){msta=2;tds=0xd0;}//AD十次取平均
if(ek1){msta=2;tds=0x80;}
light=1;
for(i=0;i<10;i++)
{adbuf=adbuf+ADC0834(tds);}
adbuf=adbuf/11;
ad_buf();
break;
case3:
if(ek2){msta=3;tds=0xd0;}//一秒AD一次
if(ek3){msta=3;tds=0x80;}
light=1;
if(t1s)
{t1s=0;
adbuf=ADC0834(tds);
ad_buf();}
break;
default:
break;
}
}
}
/*-----------------------------------------------
数码管显示
------------------------------------------------*/
voidDISP()
{P0=0xff;
P2=0xff;
switch(disp_a)
{case0:
cs0=0;//点亮第0位数码管
P0=led[buf0];
disp_a=1;
break;
case1:
cs1=0;//点亮第1位数码管
P0=led[buf1];
disp_a=2;
break;
case2:
cs2=0;//点亮第2位数码管
P0=led[buf2];
disp_a=3;
break;
case3:
cs3=0;//点亮第3位数码管
P0=led[buf3];
if(light)
dian=0;//小数点亮
disp_a=4;
break;
case4:
cs4=0;//点亮流水灯
P0=buf4;
disp_a=0;
break;
default:
break;
}
}
/*-------------------------------------------------------
矩阵键盘及独立按键子程序
------------------------------------------------------------*/
voidkey()
{ucharkbuf;
P2=0x0ff;//关数码管
row0=0;//扫描K0~3
_nop_();//延时
_nop_();
kbuf=P2;
kbuf=(kbuf&0x0f)^0x0f;//K0~3键位保留求反转正逻辑
lastkey1=kbuf;//新的键状态暂存R6
P2=0x0ff;
row1=0;//扫描K4~7
_nop_();
_nop_();
kbuf=P2;
kbuf=(kbuf&0x0f)^0x0f;
lastkey1=(kbuf<<4)+lastkey1;
P2=0x0ff;
row2=0;//扫描K8~K11
_nop_();
_nop_();
kbuf=P2;
kbuf=(kbuf&0x0f)^0x0f;
lastkey2=kbuf;
P2=0x0ff;
P1=P1|0x0c0;
kbuf=P1;
kbuf=(kbuf&0x0c0)^0x0c0;
lastkey2=kbuf+lastkey2;
if((lastkey2!
=key2)||(lastkey1!
=key1))//键状态变化则转移
{if(ktime--!
=0)
{lastkey1=key1;
lastkey2=key2;}
}
else
ktime=0x04;
ekey1=(key1^lastkey1)&lastkey1;
key1=lastkey1;
ekey2=(key2^lastkey2)&lastkey2;
key2=lastkey2;
}
/************************************************************
AD转换
************************************************************/
ucharADC0834(uchartds)
{
uchari,adbuf=0;
cs_0834=0;
for(i=0;i<5;i++)
{
clk_0834=0;
di_0834=0;
if(tds&0x80)
di_0834=1;
clk_0834=1;
tds<<=1;
}
do_0834=1;
for(i=0;i<8;i++)
{
clk_0834=0;
clk_0834=1;
adbuf=(adbuf<<1)|do_0834;
}
cs_0834=1;
return(adbuf);
}
/*****************************************************************
模拟量转化为数字并送显
******************************************************************/
voidad_buf()
{
buf4=adbuf%51*10%51*10%51*10/51;//流水灯
buf3=adbuf/51;//个位
buf2=adbuf%51*10/51;//十分位
buf1=adbuf%51*10%51*10/51;//百分位
buf0=adbuf%51*10%51*10%51*10/51;//千分位
}