#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char // 以后unsigned char就可以用uchar代替
#define uint unsigned int // 以后unsigned int 就可以用uint 代替
sbit ADC_CS = P1^7; // ADC0832的CS引脚
sbit ADC_CLK = P1^6; // ADC0832的CLK引脚
sbit ADC_DAT = P1^5; // ADC0832的DI/DO引脚
// 毫秒级的延时函数,time是要延时的毫秒数
void DelayMs(uint time)
{
uint i,j;
for(i=0;i<time;i++)
for(j=0;j<112;j++);
}
// ADC0832的时钟脉冲
void WavePlus()
{
_nop_();
ADC_CLK = 1;
_nop_();
ADC_CLK = 0;
}
// 获取指定通道的A/D转换结果
uchar Get_ADC0832()
{
uchar i;
uchar dat1=0;
uchar dat2=0;
ADC_CLK = 0; // 电平初始化
ADC_DAT = 1;
_nop_();
ADC_CS = 0;
WavePlus(); // 起始信号
ADC_DAT = 1;
WavePlus(); // 通道选择的第一位
ADC_DAT = 0;
WavePlus(); // 通道选择的第二位
ADC_DAT = 1;
for(i=0;i<8;i++) // 第一次读取
{
dat1<<=1;
WavePlus();
if(ADC_DAT)
dat1=dat1|0x01;
else
dat1=dat1|0x00;
}
for(i=0;i<8;i++) // 第二次读取
{
dat2>>= 1;
if(ADC_DAT)
dat2=dat2|0x80;
else
dat2=dat2|0x00;
WavePlus();
}
_nop_(); // 结束此次传输
ADC_DAT = 1;
ADC_CLK = 1;
ADC_CS = 1;
if(dat1==dat2) // 返回采集结果
return dat1;
else
return 0;
}
// 自动控制
void AutoControl(uchar num)
{
if(num<1)
P2=0xff;
else if((num>1)&&(num<10))
P2=0x7f;
else if((num>10)&&(num<20))
P2=0x3f;
else if((num>20)&&(num<30))
P2=0x1f;
else if((num>30)&&(num<50))
P2=0x0f;
else if((num>50)&&(num<70))
P2=0x07;
else if((num>70)&&(num<100))
P2=0x03;
else if((num>100)&&(num<140))
P2=0x01;
else if(num>150)
P2=0x00;
}
// 主函数
void main()
{
uchar ret;
while(1)
{
ret=Get_ADC0832(); // 获取AD采集结果
AutoControl(ret); // 进行自动控制
DelayMs(200);
}
}
链接:https://pan.baidu.com/s/1e5iYeVDzHjBxS1-3dHJZAQ 提取码:9p77
|