/***ADS7816 12位AD转换器驱动程序函数(C语言)*****/
/*CS有效后的最初1.5至2个转换周期内,ADS7816采样输入信号,此时输出引脚Dout呈三态,
DCL K的第2个下降沿后,Dout使能并输出一个时钟周期的低电平的无效信号,在随后的12个
DCL K周期中,Dout输出转换结果,其输出数据的格式是最高有效位(B11位)在前,当最低有效
位(B0位)输出后,若CS变为高电位,则一次转换结束,最高转换速度200kHz*/
#include "C8051F350.h"
#include"config.h"
sbit DCLK = P1^6;
sbit DOUT = P1^7;
sbit DCS = P0^2;
xdata uint ads_buf[100];
void Port_IO_Init()
{
P0MDOUT = 0xFF;
P1MDOUT = 0x7F; //P1^7 DOUT
XBR1 = 0x40;
}
void PCA_Init() //disable watch dog
{
PCA0MD &= ~0x40;
PCA0MD = 0x00;
}
void Oscillator_Init()
{
OSCICN = 0x83; //24.5MHz
}
void Init_Device(void)
{
Port_IO_Init();
PCA_Init();
Oscillator_Init();
}
/************************ads7816**********************/
uint ads7816()
{
uint result;
uchar i;
uchar al=0,ah=0;
DCS=1;
DCS=0; //启动ADC
while(DOUT!=0) //采样结束
{
DCLK=1;
Delay(1);
DCLK=0;
Delay(1);
}
for(i=0;i<4;i++) //传送高4位
{
DCLK=1;
Delay(1);
DCLK=0;
Delay(1);
ah=(ah<<1);
if(DOUT)
ah=ah|0x01;
}
for(i=0;i<8;i++) //传送低8位
{
DCLK=1;
Delay(1);
DCLK=0;
Delay(1);
al=(al<<1);
if(DOUT)
al=al|0x01;
}
DCS=1; //一次转换结束
result=ah;result<<=8;result|=al;//得到AD值
return (result);
}
/********************main******************************/
main()
{
uchar i;
unsigned long int sum;
uint avr_ads;
Init_Device();
while(1)
{
sum = 0;
for(i=0;i<100;i++)
{
ads_buf[i] = ads7816();
sum += ads_buf[i];
}
avr_ads = sum/100;
}
}
ads7816.rar_ads7816_输出时钟信号
版权申诉
63 浏览量
2022-09-24
01:27:33
上传
评论
收藏 1011B RAR 举报
alvarocfc
- 粉丝: 111
- 资源: 1万+
最新资源
- C程序语言设计 课程设计-万年历程序
- 基于Vue和CSS的泛康云诊所前端设计源码
- stc15xx-STC8-sch-pcb-library-ver1.0 STC单片机的原理图和PCB库文件资料
- 基于Scala的微服务架构后台服务设计源码 - biBACK
- 基于Java的日志推送appender设计源码 - logback-push-appender
- MedievalV1PathTracingBack00000-1920x1080-7e4d63a5fecdc81444c4cacd46d528da.avif
- 基于Vue的医疗消毒检测管理系统设计源码
- 老公-2405282109.awb
- 老公-2405282044.awb
- 8bccc0032ca49b59886db7a4af668bf8.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈