|
本帖最后由 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轉換后獲得的電壓值
}
}
|
評分
-
查看全部評分
|