×
单片机 > 单片机程序设计 > 详情

模数转换ADC0832、ADC0808和ADC0809的利用

发布时间:2020-05-29 发布时间:
|
/***************************************************************
利用AT89c51单片机和ADC0808(ADC0809)ADC0832进行模数转换,进行电压测试
 数码管采用共阳极,要显示小数点,则小数点位二进制数最高为应为0,在0-9的8421BCD
码中,最高位都为1,所以把输出数据的BCD码与0x7F“相与”才能实现带小数点的显示。
****************************************************************/
#include
#include
#define uint unsigned int 
#define uchar unsigned char
//******************adc0832****************************//
sbit CS=P2^3; //使能。
sbit CLK=P2^2;//时钟
sbit DO=P2^1; // 数据输出
sbit DI=P2^0;//数据输入
char CC[]="11001001"; 
uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uchar temp;
uint vvv,i;
//通道的选择:0x02就是单通道0;0x03就是单通道1;
//0x00就是双通道ch0="+";   ch0="-"
//0x01就是双通道ch0="-";   ch0="+"
//*****************************************************//
void delay(int tt)
{
while(tt--)
  {for(i=0;i<120;i++);}
}
void startADC()
{
CS=1;
_nop_();
_nop_();
CLK=0;
_nop_();
_nop_();
CS=0;
_nop_();
_nop_();
DI=1;
_nop_();
_nop_();
CLK=1;
_nop_();
_nop_();
DI=0;
_nop_();
_nop_();
CLK=0;
_nop_();
_nop_();
}
void choiceADC(uint CH)//CH为0选择通道ch0,为1,选择ch1进行AD转换
{
startADC();
if(CH==0)
{
DI=1;
_nop_();
CLK=1;//上升沿DI=1
_nop_();
CLK=0;//1个下降沿DI=1
_nop_();
DI=0;
_nop_();
CLK=1;
_nop_();
CLK=0;//第3个上升沿DI=0
_nop_();
}
else
{
DI=1;
_nop_();
CLK=1;//上升沿DI=1
_nop_();
CLK=0;//1个下降沿DI=1
_nop_();
DI=1;
_nop_();
CLK=1;
_nop_();
CLK=0;//第3个上升沿DI=1
_nop_();
}
/********通道选择结束开始读取转换后的二进制数****/
CLK=1;
_nop_();
CLK=0;//下降沿读数,一下进行判断和处理,共8次
for(i=0;i<8;i++)
      {
   DI=1;
   if(DO)
      {
   temp |=0x01;
   }
    else
      {
   temp &=0xfe;
   }
      CLK=0;
   _nop_();
   CLK=1;
   temp=temp<<1;
   }
   vvv=temp*500.0/255;
}[page]
void display(uint dat)
{
P3=0x04;
P0=tab[dat/100];
P0 &=0x7f;//实现带小数点位显示小数点。
delay(1);
P0=0xff;
P3=0x02;
P0=tab[dat%100/10];
delay(1);
P0=0xff;
P3=0x01;
P0=tab[dat%10];
delay(1);
P0=0xff;
}
void main()
{
   P3=0xFF;
   P0=0xff;
   while(1)
   {
      choiceADC(0);
   delay(1);
   display(vvv);
   }



#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit OE   =P2^7;
sbit EOC  =P2^6;
sbit start=P2^5;
sbit CLOCK=P2^4;
sbit CS4  =P2^3;
sbit CS3  =P2^2;
sbit CS2  =P2^1;
sbit CS1  =P2^0;
uint vvv,vot;
uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
             0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void delay(uint ms)
{
uchar j;
while(ms--)
  for(j=0;j<120;j++);
}
void ADCread()
{
start=0;
start=1;
start=0;//开始转换
while(EOC==0);//等待转换结束
OE=1;
vvv=P1;//向单片机发出转换结果存VVV中
OE=0;
}
void votexcheng()//根据显示要求换算成显示电压值
{
/**单片机8为对应最大数255,对应最大电压V(此处为5V)换算如下**/
vot=vvv*5/255;//如最大量程8V,则乘800,依次类推
}
void display(uint dat)
{
CS1=1;CS1=0;CS3=0;CS4=0;
P0=~tab[dat/100|0x80];
delay(1);
P0=0xff;
CS1=0;CS1=0;CS3=1;CS4=0;
P0=tab[dat%100/10];
delay(1);
P0=0xff;
CS1=0;CS1=0;CS3=0;CS4=1;
P0=tab[dat%10];
delay(1);
P0=0xff;
}
void t0() interrupt 1
{
CLOCK=~CLOCK;
}
void t0_init()//开启定时器定时,计时满后产生中断以便产生CLK时钟
{
TMOD=0x02;
TH0=0x14;
TL0=0x00;
TR0=1;
ET0=1;
EA=1;
}
void main()
{
t0_init();
while(1)
    {
 ADCread();
    votexcheng();
    display(vot);
 }
}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机制作超级流水灯