打印
[资料分享]

ADS7843驱动程序--51单片机

[复制链接]
813|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xyz549040622|  楼主 | 2019-12-21 11:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xyz549040622 于 2019-12-21 15:47 编辑
ADS7843驱动程序

ADS7843是一个内置12位模数转换、低导通电阻模拟开关的串行接口芯片。供电电压2.7~5 V,参考电压VREF为1 V~+VCC,转换电压的输入范围为0~ VREF,最高转换速率为125 kHz。


//=====================================================================
//                    ADS7843 驱动程序(串行)
//硬件连接: DCLK ——P0^0;
//          CS    ——P0^1;
//          DIN   ——P0^2;
//          BUSY ——P0^3
//          DOUT ——P0^4
//          PENIRQ——P3^2;
//          VDD--逻辑电源(+5V)
//          VSS--GND(0V)
//=====================================================================


#include       //STC单片机头文件
#include

#define uint unsigned int
#define uchar unsigned char

sbit DCLK   = P0^0;               //时钟信号,下降沿有效
sbit CS     = P0^1;               //片选信号,低电平有效
sbit DIN    = P0^2;               //串行数据输入
sbit BUSY   = P0^3;      //忙信号
sbit DOUT   = P0^4;      //串行数据输出
sbit PENIRQ = P3^2;      //键盘中断请求信号,低电平(负边沿)有效

void Tranfer(char Data);
uint average(uint a[8]);

//====================================================================================
//函数名称:void delay(uint us)
//函数功能:延时子函数
//入口参数:us 延时时间
//出口参数:无
//====================================================================================


void delay(uint us)
{
while(us--);
}

//====================================================================================
//函数名称:void ADS7843_start(void)
//函数功能:ADS7843启动
//入口参数:无
//出口参数:无
//====================================================================================
void ADS7843_start(void)
{
DCLK=0;
CS=1;
DIN=1;
DCLK=1;
CS=0;
}

//====================================================================================
//函数名称:void ADS7843_wr(uchar dat)
//函数功能:写ADS7843
//入口参数:dat 写入的数据
//出口参数:无
//====================================================================================
void ADS7843_wr(uchar dat)
{
uchar count;
DCLK=0;
for(count=0;count<8;count++)
{
   dat<<=1;
   DIN=CY;
   DCLK=0;
   _nop_();
   _nop_();
   _nop_();
   DCLK=1;
   _nop_();
   _nop_();
   _nop_();
}
}

//====================================================================================
//函数名称:uint ADS7843_rd(void)
//函数功能:读ADS7843
//入口参数:无
//出口参数:读回的坐标值
//====================================================================================
uint ADS7843_rd(void)
{
uchar count=0;
uint dat=0;
for(count=0;count<12;count++)
{
   dat<<=1;
   DCLK=1; _nop_();_nop_();_nop_(); //下降沿有效
   DCLK=0; _nop_();_nop_();_nop_();
   if(DOUT)
    dat++;
}
return(dat);
}

//====================================================================================
//函数名称:void intr0_int()   
//函数功能:外中断0中断服务函数
//入口参数:无
//出口参数:无
//====================================================================================
void intr0_int() interrupt 0 using 2   
{
uint X=0,Y=0,a[4],i, avex,avey,x[8],y[8];
IE=0;        //关中断
delay(100);   //中断后延时以消除抖动,使得采样数据更准确
if(!PENIRQ)
{
   for(i=0;i<8;i++) //进行8次数据采集
   {
    ADS7843_start();
    delay(2);
    ADS7843_wr(0x90);//送控制字 10010000 即用差分方式读X坐标
    delay(2);
    DCLK=1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    DCLK=0;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    X=ADS7843_rd(); //读X轴坐标
    x[i]=X;
    ADS7843_wr(0xD0); //送控制字 11010000 即用差分方式读Y坐标
    DCLK=1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    DCLK=0;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    Y=ADS7843_rd();    //读Y轴坐标
    y[i]=Y;
    CS=1;
   }
   avex=average(x);   //X坐标数据处理
   a[0]=avex/1000;    //发上位机观察结果
   a[1]=(avex-a[0]*1000)/100;
   a[2]=(avex-a[0]*1000-a[1]*100)/10;
   a[3]=avex%10;
   Tranfer(a[0]+48);
   Tranfer(a[1]+48);
   Tranfer(a[2]+48);
   Tranfer(a[3]+48);
   avey=average(y); //Y坐标数据处理
   a[0]=avey/1000;   //发上位机观察结果
   a[1]=(avey-a[0]*1000)/100;
   a[2]=(avey-a[0]*1000-a[1]*100)/10;
   a[3]=avey%10;
   Tranfer(a[0]+48);
   Tranfer(a[1]+48);
   Tranfer(a[2]+48);
   Tranfer(a[3]+48);
   for(i=0;i<10;i++) //延时,在程序中根据具体情况改动
    delay(10000);
}
IE=0x81;      //开中断
}

//====================================================================================
//函数名称:void init_serial()
//函数功能:初始化串口
//入口参数:无
//出口参数:无
//====================================================================================
void init_serial()   
{
   TMOD=0x22;    //定时器T1使用工作方式2
   TH1=250;     //设置初值
   TL1=250;
   TR1=1;      //开始计时
   PCON=0x80;     //SMOD=1;
   SCON=0x50;     //工作方式1,波特率9600bit/s,允许接收
   TI=1;
}

//====================================================================================
//函数名称:void Tranfer(char Data)     
//函数功能:发送数据程序
//入口参数:Data 要发送的数据
//出口参数:无
//====================================================================================
void Tranfer(char Data)
{
while(TI==0);
SBUF=Data;
TI=0;
}

//====================================================================================
//函数名称:int main()   
//函数功能:主函数
//入口参数:无
//出口参数:无
//====================================================================================
int main()
{
// uint b[4];
TCON=0x01; //设置外部中断0下降沿触发
    EX0=1;      //开外中断0
    EA=1;   //开总中断
init_serial();
while(1);
}

//====================================================================================
//函数名称:uint average(uint a[8])   
//函数功能:数据处理程序,采集8次的数据,去掉最大值,去掉最小值,然后求平均
//入口参数:数组首地址
//出口参数:平均值
//====================================================================================
uint average(uint a[8])
{
uint max,min,i,ave=0,sum=0;
    max=a[0];
    min=a[0];
    for(i=0;i<8;i++)
{
if(maxif(min>a[i])min=a[i];
sum+=a[i];
}
    ave=(sum-min-max)/6;
return ave;
}



使用特权

评论回复

相关帖子

沙发
xyz549040622|  楼主 | 2019-12-21 11:38 | 只看该作者
ADS7843驱动程序.rar (9.14 KB)

使用特权

评论回复
板凳
externally| | 2019-12-23 19:39 | 只看该作者
感谢楼主分享!学习一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群: 嵌入式系统arm初学者 224636155←← +→→点击-->小 i 精品课全集,21ic公开课~~←←→→点击-->小 i 精品课全集,给你全方位的技能策划~~←←

2782

主题

19267

帖子

104

粉丝