adc0832数字电压表程序+仿真图.docx
《adc0832数字电压表程序+仿真图.docx》由会员分享,可在线阅读,更多相关《adc0832数字电压表程序+仿真图.docx(8页珍藏版)》请在冰豆网上搜索。
adc0832数字电压表程序+仿真图
adc0832数字电压表(程序+仿真图)
仿真图:
/*********************************包含头文件********************************/
#include
#include
/*********************************端口定义**********************************/
sbitCS=P3^5;
sbitClk=P3^3;
sbitDATI=P3^4;
sbitDATO=P3^4;
sbitP20=P2^0;
/*******************************定义全局变量********************************/
unsignedchardat=0x00;//AD值
unsignedcharcount=0x00;//定时器计数
unsignedcharCH;//通道变量
unsignedchardis[]={0x00,0x00,0x00};//显示数值
/*******************************共阳LED段码表*******************************/
unsignedchari,test,adval;
adval=0x00;
test=0x00;
Clk=0;//初始化
DATI=1;
_nop_();
CS=0;
_nop_();
Clk=1;
_nop_();
if(CH==0x00)//通道选择
{
Clk=0;
DATI=1;//通道0的第一位
_nop_();
Clk=1;
_nop_();
Clk=0;
DATI=0;//通道0的第二位
_nop_();
Clk=1;
_nop_();
}
else
{
Clk=0;
DATI=1;//通道1的第一位
_nop_();
Clk=1;
_nop_();
Clk=0;
DATI=1;//通道1的第二位
_nop_();
Clk=1;
_nop_();
}
Clk=0;
DATI=1;
for(i=0;i<8;i++)//读取前8位的值
{
_nop_();
adval<<=1;
Clk=1;
_nop_();
Clk=0;
if(DATO)
adval|=0x01;
else
adval|=0x00;
}
for(i=0;i<8;i++)//读取后8位的值
{
test>>=1;
if(DATO)
test|=0x80;
else
test|=0x00;
_nop_();
Clk=1;
_nop_();
Clk=0;
}
if(adval==test)//比较前8位与后8位的值,如果不相同舍去。
若一直出现显示为零,请将该行去掉
dat=test;
_nop_();
CS=1;//释放ADC0832
DATO=1;
Clk=1;
returndat;
}
/****************************************************************************
函数功能:
延时子程序
入口参数:
出口参数:
****************************************************************************/
voiddelay(void)
{
intk;
for(k=10;k<500;k++);
}
/****************************************************************************
函数功能:
将0-255级换算成0.00-5.00的电压数值
入口参数:
i
出口参数:
****************************************************************************/
voidconvdata(unsignedchari)
{
dis[0]=i/51;//个位
dis[1]=(i%51)*10/51*2;//小数点后第一位
dis[2]=((i%51)*10%51)*10/51*2;//小数点后第二位
}
/****************************************************************************
函数功能:
数码管显示子程序
入口参数:
出口参数:
****************************************************************************/
voiddisplay(void)
{
P2=0xff;
P0=tab[dis[0]]&0x7f;//显示个位和小数点
delay();
P2=0xfd;
P2=0xff;
P0=tab[dis[1]];//显示小数点后第一位
delay();
P2=0xfb;
P2=0xff;
P0=tab[dis[2]];//显示小数点后第二位
delay();
P2=0xf7;
P2=0xff;
P0=0xff;//显示小数点后第二位
delay();
P2=0xfe;
}
/****************************************************************************
函数功能:
主程序
入口参数:
出口参数:
****************************************************************************/
voidmain(void)
{
P2=0xff;//端口初始化
P0=0xff;
delay();
CH=0x00;//在这里选择通道0x00或0x01
TMOD=0x01;//设置中断
TH0=(65536-50000)/256;//定时器1初值定时50ms
TL0=(65536-50000)%256;
IE=0x82;
TR0=1;
while
(1)//主循环
{dat=adc0832(CH);
convdata(dat);//数据转换
display();//显示数值
}
}
/****************************************************************************
函数功能:
定时器中断延时程序这一段的作用时隔一段时间抽样一次否侧显示的最后一位会不稳定
入口参数:
出口参数:
****************************************************************************/
voidtimer0(void)interrupt1
{
TMOD=0x01;
TH0=(65536-50000)/256;//定时器1初值定时50ms
TL0=(65536-50000)%256;
IE=0x82;
TR0=1;
count++;
if(count==0x01)
{
count=0x00;
dat=adc0832(CH);
}
}