实际电路接线
我们需要ad转化的时候 ,分两步走,先启动转化,再读取输出的数字量
阅读手册时序图
开始编写驱动文件adc0804.c和adc0804.h如下
#include "ad0804.h"
void adc_start()
{
CS=1;
WR=1;
CS=0;
WR=0;
delay(1);
WR=1;
delay(1);
CS=1;
}
void adc_read()
{
RD=1;
CS=1;
CS=0;
_nop_();
RD=0;
delay(10);
}
float adc_getVoltage()
{
float voltage;
uchar temp;
adc_start();
adc_read();
/*如果v0+v1*x+……会报错,只能分开写了*/
temp = v0==0? (v1*2+v2*4+v3*8+v4*16+v5*32+v6*64+v7*128):(v1*2+v2*4+v3*8+v4*16+v5*32+v6*64+v7*128)+1;
voltage=(float)temp/256*4.84;
return voltage;
}
#include "public.h"
#ifndef AD0804_H
#define AD0804_H
sbit weila=P2^7;
sbit RD=P3^7;
sbit WR=P3^6;
sbit CS=P0^7;
sbit v0=P1^0;
sbit v1=P1^1;
sbit v2=P1^2;
sbit v3=P1^3;
sbit v4=P1^4;
sbit v5=P1^5;
sbit v6=P1^6;
sbit v7=P1^7;
void adc_start(); //启动ad采样
void adc_read(); //ad读取
float adc_getVoltage(); //返回adc电压值
#endif
其中public.h文件内容如下
#ifndef _PUBLIC_H
#define _PUBLIC_H
#include <STC12C5A60S2.H>
#include "intrins.h"
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
void delay(uint c);
#endif
然后是main.c
#include "public.h"
#include "ad0804.h"
#include "uart.h"
uchar buf[100];
void main()
{
float v;
UartInit();
while(1)
{
v=adc_getVoltage();
if(v!=adc_getVoltage()) //若ad采样电压值发生变化,则在串口打印
{
sprintf(buf,"检测电压值:%.2f V\r\n",adc_getVoltage());
printf(buf);
}
}
}
效果为转动滑动变阻器,串口打印电压,若不转动,串口不产生输出。经过电压表检测,串口打印电压值与实际值误差约3%
这里用到的串口打印函数,可以看我另一篇关于串口的博客,里面有完整代码