本帖最后由 makala 于 2018-5-21 11:46 编辑
ADC0808/9只有8位精度,太低了,所以用Proteus自带的MCP3208做了个AD电路,并且仿真成功。
代码如下:
//头文件:
#include "reg51.h"
#include "stdio.h"
//变量定义:
sbit ADCS = P1^3;
sbit DIN = P1^2;
sbit DOUT = P1^1;
sbit CLK = P1^0;
int getdata;
void Output_Control(char TempChar)
{
unsigned char Mask = 0x10;
unsigned char Count;
for(Count = 0;Count<5;Count++)//5次循环,第一次循环DIN为Start,第二次DIN为选择差分或单端,后3次DIN分别是0,0,0选择通道
{
DIN = 0;
if(TempChar&Mask)
{
DIN = 1;
}
CLK = 1;
Mask >>= 0x01;
CLK = 0;
}
}
int Input_Data(void)
{
unsigned char Count;
unsigned int Mask = 0x8000;
unsigned int Result = 0x0000;
CLK = 1;
CLK = 0;
for(Count = 0;Count <13;Count++)
{
if(DOUT)
{
Result|=Mask;
}
CLK = 1;
Mask >>= 0x01;
CLK = 0;
}
Result >>= 0x03;
Result &= 0x0FFF;
return(Result);
}
void delay(unsigned int timer)
{
while(timer--);
}
float v;
//主函数,C语言的入口函数:
void main(void)
{
TMOD=0X20; //设置定时器1为模式2,做为波特率发生器
TL1=0xF3; //2400波特率的初值,板子使用12M晶振,初值=256-12000000/32/12/2400
TH1=0xF3; //
TR1=1; //启动波特率发生
SCON=0x50; //设置串口方式2
ADCS = 1;
while(1)
{
ADCS = 0;
Output_Control((char)0x18);
getdata=Input_Data();
ADCS = 1;
v=5.0*getdata/4096.0;//v即AD转换后获得的电压值
}
}
|