ADC0832电压采集上位机程序,51黑附件中可下载vc++源码
下面是单片机做的下位机程序:
#include<reg52.h>
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
sbit ADCS =P2^3;//ADC0832 chip seclect
sbit ADDI =P2^2;//ADC0832 k in
sbit ADDO =P2^1;//ADC0832 k out
sbit ADCLK =P2^0;//ADC0832 clock signal
sbit cs=P2^2;
sbit wr=P2^3;
unsigned char dispbitcode[8]={0xf7,0xfb,0xfd};//位扫描
unsigned char dispcode[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
unsigned char dispbuf[3];
unsigned char table[9]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uint temp,adc=0;
uchar getdata; //获取ADC转换回来的值
uchar flag,a;
void delayms(void)//12mhz delay 1.01ms
{
unsigned char x,y;
x=10;
while(x--)
{
y=4;
while(y--);
}
}
void display(void)//数码管显示函数
{
char k;
for(k=0;k<3;k++)
{
P1 = dispbitcode[k];
P0 = dispcode[dispbuf[k]];
delayms();
if(k==0) //加上数码管的dp小数点
P0&=0x7f;
delayms();
P1=0xff;
}
}
//采集并返回
unsigned int Adc0832(unsigned char channel) //AD转换,返回结果
{
uchar i=0;
uchar j;
uint dat=0;
uchar ndat=0;
if(channel==0)channel=2;
if(channel==1)channel=3;
ADDI=1;
_nop_();
_nop_();
ADCS=0;//拉低CS端
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿1
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=channel&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿2
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=(channel>>1)&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿3
ADDI=1;//控制命令结束
_nop_();
_nop_();
dat=0;
for(i=0;i<8;i++)
{
dat|=ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
dat<<=1;
if(i==7)dat|=ADDO;
}
for(i=0;i<8;i++)
{
j=0;
j=j|ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
j=j<<7;
ndat=ndat|j;
if(i<7)ndat>>=1;
}
ADCS=1;//拉低CS端
ADCLK=0;//拉低CLK端
ADDO=1;//拉高数据端,回到初始状态
dat<<=8;
dat|=ndat;
return(dat); //return ad k
}
void main()
{ P0=0XFF;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
while(1)
{ if(flag==1)
{
ES=0;
flag=0;
SBUF=getdata;
while(!TI);
TI=0;
ES=1;
}
getdata=Adc0832(1);
temp=getdata*1.0/255*500;//电压值转换,5V做为参考电压,分成256份。
dispbuf[2]=temp%10; //个位
dispbuf[1]=temp/10%10; //十位
dispbuf[0]=temp/100; //百位
display();
}
}
void ckzd() interrupt 4
{
RI=0;
a=SBUF;
switch(a)
{
case "a":
flag=1; break;
case "b":
P0=adc; break;
case "c":
P0=adc; break;
default:
P1=0xFF;
break;
}
}
复制代码
ADC0832模数转换测试程序,带上位机源程序和下位机源程序,将adc0832采集的电压值送给上位机显示,本人亲测
上位机和下位机ADC0832upanddown.rar(5.72 MB, 下载次数: 85)
源程序